- Home /
Click-and-Move System: Unit flies upward on slopes
Hello people. So, I'm working on a tactical strategy prototype and I was writing some code to get a unit to move towards a clicked point. Since this is my first time experimenting with click n' move systems, I ran into a lot of problems initially -even though the code is small- like having my unit stuck in my test plane. I'm prototyping using a simple cylinder as a unit and a plane as ground. While my code works perfectly on a level plane, the problem begins whenever I'm clicking at a slope or the top of a cube. Here's my code (spaced out for clarification):
using UnityEngine;
using System.Collections;
public class MouseCharMovement : MonoBehaviour {
public float testSpeed = 0.2f;
bool hasHit = false;
public int terrainMask = 1 << LayerMask.NameToLayer("testGround");
public int playerMask = 1 << LayerMask.NameToLayer("Player");
Vector3 currentPosition;
Vector3 targetPosition;
void Start ()
{
currentPosition = transform.position;
targetPosition = currentPosition;
playerMask = ~playerMask;
}
void Update ()
{
// Performs a cam-to-mouse Raycast every time the mouse button is pressed
if(Input.GetButtonDown("Fire1"))
{
// Ray to acommodate camera raycasting
Ray mouseRay = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit mouseHit;
if(Physics.Raycast(mouseRay,out mouseHit,playerMask))
{
// Target is now the clicked position and a hit has been detected
targetPosition = mouseHit.point;
hasHit = true;
}
}
// If target is reached, slowly transform the object
if (hasHit && ((currentPosition.x != targetPosition.x) && (currentPosition.z != targetPosition.z)))
{
// Adds the object's center so as to keep it above ground
Vector3 tempTarget = new Vector3(targetPosition.x,targetPosition.y + transform.position.y,targetPosition.z);
transform.position = Vector3.MoveTowards(transform.position,tempTarget,testSpeed);
currentPosition = transform.position;
// Check only for XY axes, ignore height
if ((currentPosition.x == targetPosition.x) && (currentPosition.z == targetPosition.z))
{
hasHit = false;
}
}
Debug.Log("Transform Position: "+ transform.position);
Debug.Log("Target Position: " + targetPosition);
Debug.Log("Has Hit: "+ hasHit);
}
}
I'm testing by using the cylinder as the unit to which the script is attached to. A level plane set to origin represents level ground and a slightly rotated plane is put next to it to represent a slope. My unit moves perfectly on the level plane, but as soon as I click the slope, it starts flying in the air. I understand that this is happening because the code is constantly adding the unit's and slope's heights, and the problem isn't obvious in level ground simply because it's Y-component is zero. However, I included a test only for X-Z and still, it doesn't disable it. What am I missing here?
Thank you!
Your answer
Follow this Question
Related Questions
How to get the ground position near the gameObject clicked? 0 Answers
What's Wrong With This Script? 1 Answer
RTS Minimap Movement 0 Answers
RTS style terrain changer. 2 Answers
RTS Regions 0 Answers