- 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
 koobas.hobune.stream
koobas.hobune.stream 
                       
                
                       
			     
			 
                