- Home /
How do I rotate my character smoothly?
Right now my script tells the character to walk in the direction that is right clicked, but when I click the model is turned instantly, how can I get a tiny turning animation to make it smoother? Here's my script:
using UnityEngine;
using System.Collections;
public class MouseMovement : MonoBehaviour
{
public int movementSmoothing;
public float speed = 350f;
public AnimationClip walk, idle;
Vector3 targetPosition;
void Start()
{
targetPosition = transform.position;
}
void Update()
{
if (Input.GetMouseButtonDown(1))
{
movementSmoothing = 90;
Plane playerPlane = new Plane(Vector3.up, transform.position);
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
float hitDist = 0.0f;
animation.Play (walk.name);
if (playerPlane.Raycast(ray, out hitDist))
{
var targetPoint = ray.GetPoint(hitDist);
targetPosition = targetPoint;
Quaternion targetRotation = Quaternion.LookRotation(targetPoint - transform.position);
transform.rotation = targetRotation;
}
}
Vector3 direction = targetPosition - transform.position;
float distance = direction.magnitude;
float step = speed * Time.deltaTime;
if (distance > step)
{
transform.position += direction.normalized * step;
}
else
{
animation.Play (idle.name);
transform.position = targetPosition;
}
}
}
Answer by ChristianLinnell · May 01, 2014 at 11:38 PM
Change this:
Quaternion targetRotation = Quaternion.LookRotation(targetPoint - transform.position);
transform.rotation = targetRotation;
To this:
Quaternion targetRotation = Quaternion.LookRotation(targetPoint - transform.position);
float turnSpeed = 2; //or whatever
transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, Time.deltaTime * turnSpeed);
You might need to play with your code structure depending on your behaviour, like if you only want to start moving after you've turned, but this should get you started.
Note that you can also do the following instead of your if (distance > step) code:
transform.position = Vector3.Lerp(transform.position, targetPosition, Time.deltaTime * speed);
It didn't work :s at any turnSpeed the character still turns instantly, but it seems the turnSpeed is only affecting the amount the character turns and not the speed itself, so at 2 he barely turns at all. I also tried the 2nd code for (distance > step) and it ins$$anonymous$$d basically teleported the character to the location clicked ins$$anonymous$$d of walking
Something else must be going on, since that is definitely the right code. Could you post your new Update method?
Here you go: using UnityEngine; using System.Collections;
public class $$anonymous$$ouse$$anonymous$$ovement : $$anonymous$$onoBehaviour
{
public int movementSmoothing;
public float speed = 0.5f;
public AnimationClip walk, idle;
Vector3 targetPosition;
void Start()
{
targetPosition = transform.position;
}
void Update()
{
if (Input.Get$$anonymous$$ouseButtonDown(1))
{
movementSmoothing = 90;
Plane playerPlane = new Plane(Vector3.up, transform.position);
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
float hitDist = 0.0f;
animation.Play (walk.name);
if (playerPlane.Raycast(ray, out hitDist))
{
var targetPoint = ray.GetPoint(hitDist);
targetPosition = targetPoint;
Quaternion targetRotation = Quaternion.LookRotation(targetPoint - transform.position);
float turnSpeed = 2f;
transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, Time.deltaTime * turnSpeed);
}
}
Vector3 direction = targetPosition - transform.position;
float distance = direction.magnitude;
float step = speed * Time.deltaTime;
if (distance > step)
{
transform.position += direction.normalized * step;
}
else
{
animation.Play (idle.name);
transform.position = targetPosition;
}
}
}
Your answer
Follow this Question
Related Questions
Navigating the 3D platform 0 Answers
Controlling body parts during animations with scripts 1 Answer
Distribute terrain in zones 3 Answers
How do I rotate a Gameobject to a given direction smoothly? 1 Answer
Rotate Animation In-Game? 2 Answers