- 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