- Home /
Click to Move for RTS
I've been scratching my head and trying to research the best ways to do this and watching examples on YouTube, but I haven't come across something that does what I need, close but I'm struggling with how to calculate distance between my transform and my destination transform. I think I'm close, but my distance value goes up instead of down to 0.
In short, I want to click to move to a destination, toggle on the thrusters on my ship and when I reach my destination toggle off the thrusters. So I need to figure out the distance between the click and the current position as the ship is moving.
Here is the C# code: pardon the mess, I've been trying various ways to do it.
using UnityEngine;
using System.Collections;
public class ClickToMoveAttack : MonoBehaviour {
public GameObject unit;
public float speed;
public float range;
public Vector3 orderedPosition;
public float moveDistance;
float moveDistanceRemain;
bool isMoving;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
if (Input.GetMouseButton(1))
{
// Locate where player clicked
locatePosition();
}
// Move player to position
moveToPosition();
inRange();
Debug.Log(inRange());
}
void locatePosition()
{
RaycastHit hit;
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if(Physics.Raycast(ray,out hit,1000)){
orderedPosition = new Vector3(hit.point.x, hit.point.y, hit.point.z);
Debug.Log("Ordered Position: " +orderedPosition.ToString());
moveDistance = hit.distance;
Debug.Log("Distance to destination: " + moveDistance);
}
}
bool inRange()
{
if (moveDistance <= 0)
{
return true;
}
else
{
if (Vector3.Distance(orderedPosition, transform.position) > 0)
{
moveDistance = Vector3.Distance(orderedPosition, transform.position);
}
return false;
}
}
void moveToPosition()
{
//Rotate to face direction of move order
Quaternion newRotation = Quaternion.LookRotation(orderedPosition - transform.position);
newRotation.x = 0f;
newRotation.z = 0f;
transform.rotation = Quaternion.Slerp(transform.rotation, newRotation, Time.deltaTime * 10);
//Get moving already will you!? Engage thrusters
//Here we will pass destination in to SpaceshipController via a toggle based on distance.
if (!inRange())
{
Debug.Log("Engaging Thrusters");
unit.GetComponent<SpaceshipController>().engageThrusters = true;
isMoving = true;
}
else
{
Debug.Log("Disengaging Thrusters");
unit.GetComponent<SpaceshipController>().engageThrusters = false;
isMoving = false;
}
//TODO: Need to figure out isSelected logic, so only the ships we order to move will move.
}
//TODO: Add a subroutine here to detect and engage enemies in range.
}
I've been working on this while I've been waiting for the post to be approved and I came up with this, seems to be a little closer: If anyone has a better way, please share!
using UnityEngine;
using System.Collections;
public class ClickToMoveAttack : MonoBehaviour {
public GameObject unit;
public float speed;
public float range;
public Vector3 orderedPosition;
public float moveDistance;
bool isMoving;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
if (Input.GetMouseButton(1))
{
// Locate where player clicked
locatePosition();
}
// Move player to position
moveToPosition();
Debug.Log(inRange());
}
void locatePosition()
{
RaycastHit hit;
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if(Physics.Raycast(ray,out hit,1000)){
orderedPosition = new Vector3(hit.point.x, hit.point.y, hit.point.z);
Debug.Log("Ordered Position: " +orderedPosition.ToString());
moveDistance = hit.distance;
Debug.Log("Distance to destination: " + moveDistance);
}
}
bool inRange()
{
if(Vector3.Distance(orderedPosition, transform.position) <= range){
return true;
}
else
{
return false;
}
}
void moveToPosition()
{
//Rotate to face direction of move order
Quaternion newRotation = Quaternion.LookRotation(orderedPosition - transform.position);
newRotation.x = 0f;
newRotation.z = 0f;
transform.rotation = Quaternion.Slerp(transform.rotation, newRotation, Time.deltaTime * 10);
//Get moving already will you!? Engage thrusters
//Here we will pass destination in to SpaceshipController via a toggle based on distance.
inRange();
if (!inRange())
{
if (!isMoving)
{
Debug.Log("Engaging Thrusters");
unit.GetComponent<SpaceshipController>().engageThrusters = true;
isMoving = true;
}
}
else
{
if (isMoving && inRange()) {
Debug.Log("Disengaging Thrusters");
unit.GetComponent<SpaceshipController>().engageThrusters = false;
isMoving = false;
}
}
//TODO: Need to figure out isSelected logic, so only the ships we order to move will move.
}
//TODO: Add a subroutine here to detect and engage enemies in range.
}
Answer by TwitchBlade · Sep 02, 2014 at 05:12 AM
Try looking at Vector3.Distance(pos1, pos2)
Thanks, that works. I made it work using the Vector3.distance in my inRange() method posted above. I'm not sure if I went about the code the best way, but at least it's working.
Your answer
![](https://koobas.hobune.stream/wayback/20220613162053im_/https://answers.unity.com/themes/thub/images/avi.jpg)
Follow this Question
Related Questions
Fog of War Explored Area Gray out / un-updated areas 0 Answers
Update not being called 1 Answer
Performance with 100+ CharacterController's 1 Answer
Cloud recognition in Vuforia 0 Answers
Does anybody know how to use ATS Color map Shaders? 0 Answers