- Home /
Turn in the direction of movement
I've got the following script on my character, he moves using the keyboard but he looks at the mouses position:
using UnityEngine;
public class PlayerMovement : MonoBehaviour
{
public float speed = 6f;
Vector3 movement;
Animator anim;
Rigidbody playerRigidbody;
int floorMask;
float camRayLength = 100f;
void Awake (){
floorMask = LayerMask.GetMask ("Floor");
anim = GetComponent <Animator>();
playerRigidbody = GetComponent <Rigidbody>();
}
void FixedUpdate(){
float h = Input.GetAxisRaw("Horizontal");
float v = Input.GetAxisRaw("Vertical");
Move (h, v);
Turning ();
Animating (h, v);
}
void Move (float h, float v){
movement.Set (h, 0f, v);
movement = movement.normalized * speed * Time.deltaTime;
playerRigidbody.MovePosition (transform.position + movement);
}
void Turning (){
Ray camRay = Camera.main.ScreenPointToRay (Input.mousePosition);
RaycastHit floorHit;
if(Physics.Raycast (camRay, out floorHit, camRayLength, floorMask)){
Vector3 playerToMouse = floorHit.point - transform.position;
playerToMouse.y = 0f;
Quaternion newRotation = Quaternion.LookRotation(playerToMouse);
playerRigidbody.MoveRotation(newRotation);
}
}
void Animating (float h, float v){
bool walking = h!=0f || v!=0f;
anim.SetBool ("IsWalking", walking);
}
}
How can I change the script so he looks in the direction he's walking in instead of the mouse position?
the line that gives it to look at mouse position is
Ray camRay = Camera.main.ScreenPointToRay (Input.mousePosition);
why don't you try to replace it with
Vector3.forward?
http://docs.unity3d.com/ScriptReference/Quaternion.LookRotation.html
Thanks for the help, I've got it working, sort of, now. Here's the script:
void Update (){
Vector3 playerToTurn = playerRigidbody.position + transform.position;
Quaternion rotation = Quaternion.LookRotation(playerToTurn);
transform.rotation = rotation;
}
The player now rotates towards the direction its moving, but too slowly. I think it's rotating round the initial start point of the character. Any ideas on how to fix this? Thanks
i'de do it with Slerp
float damping;
aimSpeed = dampening * Time.deltaTime
transform.rotation = Quaternion.Lerp (transform.rotation, Quaternion.LookRotation (target.position - transform.position), aimSpeed);
Lerp and Slerp are functions to move from 1 value to another value over time.
here are 2 links you should check out http://answers.unity3d.com/questions/417464/quaternionslerp-with-quaternionlookrotation-causes.html
http://answers.unity3d.com/questions/335697/lookrotation-between-2-points.html
hope it helps
Ow and an unrelated tip to optimize the code. when you write something like trasform.position - 30 times a second, the system picks the whole gameObject with all its components to pick from it the component transform.position and that's really expensive.
best for you is to make a
Transform myTransform;
and add to awake
myTransform=transform;
in a similar way you've done with rigidbody. this way you onlt do that process once and then have a direct access to transform.
also i think you can also just do
playerRigidbody = rigidbody;