- Home /
Click to Move problem with hills
Hi, I am using the following code to make the character move to the position clicked on.
using UnityEngine;
using System.Collections;
public class MoveCharacter2Clicked : MonoBehaviour {
private Transform myTransform; // this transform
private Vector3 destinationPosition; // The destination Point
private float destinationDistance; // The distance between myTransform and destinationPosition
private float originalMoveSpeed;
public float moveSpeed; // The Speed the character will move
void Start() {
myTransform = transform; // sets myTransform to this GameObject.transform
destinationPosition = myTransform.position; // prevents myTransform reset
originalMoveSpeed = moveSpeed;
}
void Update() {
// keep track of the distance between this gameObject and destinationPosition
destinationDistance = Vector3.Distance(destinationPosition, myTransform.position);
// Moves the Player if the Left Mouse Button was clicked
if ((Input.GetMouseButtonDown(0) || Input.GetMouseButton(0)) && GUIUtility.hotControl ==0) {
Plane playerPlane = new Plane(Vector3.up, myTransform.position);
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
float hitdist = 0.0f;
Debug.Log(ray);
if (playerPlane.Raycast(ray, out hitdist)) {
Vector3 targetPoint = ray.GetPoint(hitdist);
destinationPosition = ray.GetPoint(hitdist);
Quaternion targetRotation = Quaternion.LookRotation(targetPoint - transform.position);
myTransform.rotation = targetRotation;
}
}
// To prevent code from running if not needed
if(destinationDistance > .5f) {
moveSpeed = originalMoveSpeed;
myTransform.position = Vector3.MoveTowards(myTransform.position, destinationPosition, moveSpeed * Time.deltaTime);
}
else { // To prevent shakin behavior when near destination
moveSpeed = 0;
}
}
}
It works great when the terrain is completely flat, but if I increase the height of the terrain, the character falls through, ignoring the ground and into the abyss.
Is there anything I am doing wrong?
Thank you!
Answer by TomPendergrass · Dec 30, 2012 at 10:35 PM
You mention that your character falls through the ground. is your character a rigidbody? if so, using transform.MoveTowards() will not work well with the physics engine. instead, you can try transform.rigidbody.AddForce(), which will take collisions into account.
Answer by jposuna · Dec 31, 2012 at 01:16 AM
Hi, thanks for your answer. I'm quite new to Unity, and I believe they are different things (correct me if I'm wrong), but I am using a CharacterController instead of a RigidBody. Would the same still apply?
Thank you!
Ah, I see. I never really used the Character Controller. It's convenient for basic functionality, but unless you can make sense of all the code in the character controller and motor scripts, it can be frustrating to modify. I'm not sure of all you're trying to accomplish, but it might be worth making your own script!
var target : Transform;
var moveSpeed : float;
function Update()
{
transform.LookAt(target);
rigidbody.AddRelativeForce(0,0,moveSpeed, Velocity$$anonymous$$ode.InstantVelocityChange);
}
For this script to work it would have to be attached to an object that has a collider and rigidbody on it. It's a bit more simple than the character controller. You'd want to plug in the code you use to get where the user has clicked as well (target). Good Luck!
Answer by MaGuSware™ · Dec 31, 2012 at 08:51 AM
I recommend adding a character motor onto the object with the controller.
Then look at the script "FPSInputController.js". You will notice that the script is setting the movement direction of the motor based on the control input.
You can set he motor.inputMoveDirection on yours to the direction that your character needs to move to.
I hope this is enough information for you to go off and develop a full solution to your problem.