- Home /
Move character to mouse position, keeping constant speed
I'm writing a character control script for a top-down RPG, and want my character to move towards the mouse position whenever I click or hold the mouse button down:
using UnityEngine;
using System.Collections;
public class Movement : MonoBehaviour {
//Player movement speed
public float movementSpeed = 10.0f;
//Player height
public float height = 0.5f;
//Target position
Vector3 targetPosition;
void Start()
{
//Setting target position to current position upon game start
targetPosition = transform.position;
}
// Update is called once per frame
void Update ()
{
//When user presses left mouse button
if(Input.GetMouseButton(0))
{
//Update target position
targetPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
}
//Movement code attempt 1 (obviously I don't use both at the same time, I've merely tried both:
transform.position = transform.position + (targetPosition - transform.position).normalized * movementSpeed * Time.deltaTime;
//Movement code attempt 2:
transform.position = Vector3.Lerp(transform.position, targetPosition, (Time.deltaTime*movementSpeed));
}
}
It works just fine, aside from that my character moves slower when traveling shorter distances, and faster when traveling longer distances. I can understand why this happens, as the movement time is constant no matter how far you travel, but I'm not sure how to fix that - I want the movement speed to be the same no matter what. I've tried both approaches above and in both cases this happens.
I took a look at some other similar questions in here, but found nothing that worked in this case. Any ideas?
Answer by bentog · Dec 24, 2012 at 06:06 PM
Hmm, I have this idea:
Make a transform called "emptyTarget", assign an empty object to it. On update use this code:
//makes the empty object constantly on the target
emptyTarget.transform.position = targetPosition;
//makes the character constantly face the target
transform.LookAt(emptyTarget);
//makes the character move a little bit every frame
//as he's always facing the target, it will always go in
//direction to it
transform.Translate(transform.forward * movementSpeed * Time.deltaTime);
Note: this code was not tested.
Your answer
Follow this Question
Related Questions
Vector3.Lerp not working? 5 Answers
Move player to mouse position never go to exact position 0 Answers
GridMove-based movement 'jerkiness' 1 Answer
Changing speed without changing Destination 3 Answers
Vector3.Lerp to Multiple locations 2 Answers