- Home /
 
Want sprite to move to mouse click position instead of teleporting or moving a few pixels
Hello, probably a noob question, but I've looked everywhere and tried every solution I could find. And none worked.
I simply want my sprite character to move to the mouse click position along X axis. But after trying every solution, the sprite either teleports to the end position or moves the distance defined in 'moveSpeed'.
I want him to 'move' to the mouse click position in the most human way possible - slowly tumbling across, that is. Any help will be super appreciated, thanks!
 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
 
 public class MovementController : MonoBehaviour
 {
     public LayerMask clickMask;
     public float moveSpeed;
 
     void Update()
     {
         Vector3 clickPosition = -Vector3.one;
 
         if (Input.GetMouseButtonUp(0))
         {
             Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
             RaycastHit hit;
 
             if(Physics.Raycast(ray, out hit, 100f, clickMask))
             {
                 clickPosition = hit.point;
                 clickPosition.z = transform.position.z;
                 clickPosition.y = transform.position.y;
             }
 
     
             if (transform.position.x != clickPosition.x)
             {
                 if (clickPosition.x > transform.position.x)
                 {
                     //walk right
                     //transform.position += Vector3.right * moveSpeed * Time.deltaTime;
 
                 }
                 else if (clickPosition.x < transform.position.x)
                 {
                     //walk left
                     transform.position += Vector3.left * moveSpeed * Time.deltaTime;
                 }
             }
             Debug.Log(clickPosition);
     
         }
     }
 }
 
              Answer by xxmariofer · Feb 19, 2019 at 09:04 PM
hello, try this script. you need an extra var for the amount the position will change. the object will continue moving qhwn you end up the touch if you use a high incrementDistance
 public Vector3 targetPosition;
 public void Awake()
 {
     targetPosition = transform.position;
 }
 void Update()
 {
     Vector3 clickPosition = -Vector3.one;
     if (Input.GetMouseButtonUp(0))
     {
         Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
         RaycastHit hit;
         if (Physics.Raycast(ray, out hit, 100f, clickMask))
         {
             clickPosition = hit.point;
             clickPosition.z = transform.position.z;
             clickPosition.y = transform.position.y;
         }
         if (transform.position.x != clickPosition.x)
         {
             if (clickPosition.x > transform.position.x)
             {
                 //walk right
                 targetPosition += Vector3.right * incrementDistance * Time.deltaTime;//the 5 is just for testing use the desire position
             }
             else if (clickPosition.x < transform.position.x)
             {
                 //walk left
                 targetPosition += Vector3.left * incrementDistance * Time.deltaTime;
             }
         }
         Debug.Log(clickPosition);
     }
     transform.position = Vector3.MoveTowards(transform.position, targetPosition, moveSpeed * Time.deltaTime);
 }
 
              Thanks so much for the advice! But still couldn't get the desired movement with this. But tinkering around a bit more with the code got me the desired results. This is the code that finally worked
 public class $$anonymous$$ovementController : $$anonymous$$onoBehaviour
 {
     public Layer$$anonymous$$ask click$$anonymous$$ask; 
     public float moveSpeed;
 
     public Vector3 clickPosition;
         
     void Update()
     {
         
         if (Input.Get$$anonymous$$ouseButtonUp(0))
         {
             Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); //define a ray in screen position on the point of mouse click
             RaycastHit hit;
 
             if(Physics.Raycast(ray, out hit, 100f, click$$anonymous$$ask))
             {
                 clickPosition = hit.point;
                 clickPosition.z = transform.position.z;
                 clickPosition.y = transform.position.y;
             }
         }
 
         if (transform.position != clickPosition)
         {
             transform.position = Vector3.$$anonymous$$oveTowards(transform.position, clickPosition, Time.deltaTime * moveSpeed);
         }
     }
 }
                 Your answer
 
             Follow this Question
Related Questions
How to make an object move to another object's location in a 2d game? 2 Answers
mouse click on objects 1 Answer
Why doesn`t it run circles? 1 Answer
2D sprites, layers, movable object. 0 Answers