Rotate back to default rotation

Hey!
I’m trying to rotate object back to default rotation (on trigger exit) but it’s not working.
Something missing?

using UnityEngine;

public class LookAtPlayer : MonoBehaviour
{

    private float damp = 2;
    private GameObject player;
    private Quaternion defaultRotation;

    void Start()
    {
        player = GameObject.FindGameObjectWithTag("Player");
        defaultRotation = transform.rotation;
    }

    void OnTriggerStay(Collider other)
    {
        var rotate = Quaternion.LookRotation(player.transform.position - transform.position);
        rotate.z = 0;
        rotate.x = 0;
        transform.rotation = Quaternion.Slerp(transform.rotation, rotate, Time.deltaTime * damp);
    }

    void OnTriggerExit(Collider other)
    {
        transform.rotation = Quaternion.Slerp(transform.rotation, defaultRotation, Time.deltaTime * damp);
    }
}

OnTriggerStay works like a charm.

OnTriggerStay is called once per physics update while the object remains inside the trigger. OnTriggerExit is called once as the object leaves the trigger. Slerp is an interpolation function which works incrementally. You need to keep calling it for it to keep incrementally moving towards the target.

A more efficient method would be to use Enter/Exit to set a boolean to alternate methods in Update. Or start different coroutines.

example:

using UnityEngine;

public class LookAtPlayer : MonoBehaviour {

    private float damp = 2;
    private GameObject player;
    private Quaternion defaultRotation;
    private bool playerInTrigger = false;
    void Start() {
        player = GameObject.FindGameObjectWithTag("Player");
        defaultRotation = transform.rotation;
    }

    private void Update() {
        if(playerInTrigger) {
            lookAtPlayer();
        } else {
            resetRotation();
        }
    }

    private void lookAtPlayer() {
        var rotate = Quaternion.LookRotation(player.transform.position - transform.position);
        rotate.z = 0;
        rotate.x = 0;
        transform.rotation = Quaternion.Slerp(transform.rotation, rotate, Time.deltaTime * damp);
    }

    private void resetRotation() {
        transform.rotation = Quaternion.Slerp(transform.rotation, defaultRotation, Time.deltaTime * damp);
    }

    void OnTriggerEnter(Collider other) {
        if(other.gameObject == player) {
            playerInTrigger = true;
        }
    }

    void OnTriggerExit(Collider other) {
        if(other.gameObject == player) {
            playerInTrigger = false;
        }
    }
}
1 Like

Awesome! Works as expected. Thank you

1 Like