美文网首页
Unity 3D的角色移动

Unity 3D的角色移动

作者: 只想单纯的码代码 | 来源:发表于2017-11-27 15:53 被阅读0次

在Unity控制角色移动时,要注意两大点:

  1. 鼠标点击地面,检测射线以及人物面朝移动方向。
public class PlayerDir : MonoBehaviour {

    public GameObject effect_click_prefabs; //鼠标点击的效果
    public Vector3 targetPosition = Vector3.zero;//人物位置
    private bool isMoving = false;//表示鼠标的是否按下


    // Update is called once per frame
    void Update () {
        if (Input.GetMouseButtonDown(0)) {
            //做射线检测
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);//把鼠标点击的点转换为射线
            RaycastHit hitInfo;
            bool isCollider = Physics.Raycast(ray, out hitInfo);
            if (isCollider && hitInfo.collider.tag == Tags.ground) {
                isMoving = true;
                //实例化点击效果
                ShowClickEffect(hitInfo.point);
                //人物朝向点击方向
                LookAtarget(hitInfo.point);
            }
        }

        if (Input.GetMouseButtonUp(0)) {
            isMoving = false;
        }

        if (isMoving) {
            //得到人物的移动的目标位置
            //让人物的朝向移动位置
            //做射线检测
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);//把鼠标点击的点转换为射线
            RaycastHit hitInfo;
            bool isCollider = Physics.Raycast(ray, out hitInfo);
            if (isCollider && hitInfo.collider.tag == Tags.ground){
                LookAtarget(hitInfo.point);
            }
        }
    }
//实例化点击的效果
    public void ShowClickEffect(Vector3 hitPoint) {
        hitPoint = new Vector3(hitPoint.x,hitPoint.y + 0.1f,hitPoint.z);
        GameObject.Instantiate(effect_click_prefabs, hitPoint, Quaternion.identity);
    }
    //让人物朝向目标位置
    void LookAtarget(Vector3 hitPoint) {
        targetPosition = hitPoint;
//人物转向时,X、Z轴是不变的。所以只让其Y轴变化
        targetPosition = new Vector3(targetPosition.x, transform.position.y, targetPosition.z);
        this.transform.LookAt(targetPosition);
    }
}
  1. 控制人物的移动与速度
    首先在人物上挂载一个“Character Controller’”,控制人物移动。并调整大小。


    image.png
public class PlayerMove : MonoBehaviour {
    public float speed = 3;
    private PlayerDir dir;
    private CharacterController controller;
    void Start () {
        dir = this.GetComponent<PlayerDir>();//得到鼠标点击的位置
        controller = this.GetComponent<CharacterController>();//得到人物管理者的对象。
    }
    
    // Update is called once per frame
    void Update () {
          //Distance:返回两者之间的距离。
        float distance = Vector3.Distance(dir.targetPosition,transform.position);
        if (distance >= 0.05f) {
            //调用人物管理者的SimpleMove方法,使其移动。里面传入速度和方向。
            controller.SimpleMove(transform.forward * speed);
        }
    }
}

相关文章

网友评论

      本文标题:Unity 3D的角色移动

      本文链接:https://www.haomeiwen.com/subject/kohdbxtx.html