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!

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.

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!

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.