- Home /
Transform.LookAt and Back!
How do I make a character turn in the direction of the camera once (to attack player), then turn back to the direction at which it was looking? The following attempt failed:
function Update () {
if (calculateDistance(GameObject.Find("Main Camera"), this.gameObject) > 4f) {
if (rotation.y != 10001) {
//this.gameObject.transform.eulerAngles = rotation;
//this.gameObject.transform.LookAt(oldForward, oldUp);
this.gameObject.transform.localRotation = rotation;
addWalkingForce();//MOVE FORWARD AGAIN
rotation.y = 10001;
}
this.animation.Play ("Walks");
}
else {
this.animation.CrossFade ("Attacks");
oldForward = this.gameObject.transform.forward;
oldUp = new Vector3(Vector3.up.x, Vector3.up.y, Vector3.up.z);
rotation = this.gameObject.transform.localRotation;
rigidbody.velocity = Vector3.zero;//KILL FORWARD MOVEMENT
this.transform.LookAt(GameObject.Find("Main Camera").transform, Vector3.up)
}
Get the rotation before, store it, then make it rotate, then make it rotate back to the original position...
Answer by AGP · Dec 31, 2010 at 11:34 PM
I'm surprised no one had anything to say about it. But the following worked. I added the time test to prevent it from storing the rotated forward before the animation could be said to be "Walks" (as it was cross fading, I suppose). Other than this little bit, the only thing I can tell was wrong was that transform.forward gives you the worldspace vector but not the actual position (hence the addition). I hope this helps someone.
PS: How frustrating is this system of trying to get code colored and indented here? Come on, guys, come up with
brackets, or something.
private var oldForward : Vector3;
private var lastTimeStoredForward : float;
function calculateDistance(from : GameObject, to : GameObject) : float { var origin : Vector3 = from.transform.position; var destination : Vector3 = to.transform.position; return Mathf.Sqrt((origin.x-destination.x)(origin.x-destination.x) + (origin.y-destination.y)(origin.y-destination.y) + (origin.z-destination.z)*(origin.z-destination.z)); } function addWalkingForce() { this.rigidbody.AddForce (this.gameObject.rigidbody.transform.forward*20); } function Start() { addWalkingForce(); oldForward.y = 10001; lastTimeStoredForward = -99999; } function Update () { if (calculateDistance(GameObject.Find("Main Camera"), this.gameObject) > 4f) { if (oldForward.y != 10001) { this.gameObject.transform.LookAt(oldForward, Vector3.up);
addWalkingForce();
oldForward.y = 10001;
}
this.animation.Play ("Walks");
}
else if (animation.IsPlaying("Walks")) { if (lastTimeStoredForward+1 < Time.time) { oldForward = new Vector3(this.gameObject.transform.position.x+transform.forward.x,transform.position.y, this.gameObject.transform.position.z+transform.forward.z);//WHY DOESN'T THIS WORK? lastTimeStoredForward = Time.time; } this.animation.CrossFade ("Attacks"); rigidbody.velocity = Vector3.zero; var toLook : Vector3 = GameObject.Find("Main Camera").transform.position; toLook.y = this.gameObject.transform.position.y;//DO NOT ROTATE AROUND X-AXIS this.gameObject.transform.LookAt(toLook, Vector3.up); } } function OnCollisionEnter(collision : Collision) { if (collision.gameObject.name.StartsWith("ZombieLevel")) { Debug.Log("Collided against level."); this.gameObject.transform.Rotate(0, 180, 0); } }
Your answer
Follow this Question
Related Questions
[HELP] Rotate Bullet Script 0 Answers
Rotation Reset 0 Answers
Need help to modify Space.World rotation script. 1 Answer