Unity中鼠标点击地面控制人物移动

       代码实现了鼠标点击控制人物移动的功能,人物会朝向鼠标点击的目标点走去,双击鼠标为跑动。以后还会再添加鼠标点击时的提示效果。

    /// 
    /// 摄像机对象
    /// 
    public Camera _camPlayer;
    /// 
    /// 玩家的变换组件
    /// 
    public Transform _transPlayer;
    /// 
    /// 鼠标发出的射线
    /// 
    private Ray _rayMouseMove;
    /// 
    /// 射线起点与平面交点的距离
    /// 
    private float _fDistMouseMove;
    /// 
    /// 玩家所在的平面
    /// 
    private Plane _planePlayer;
    /// 
    /// 鼠标点击的三维坐标点
    /// 
    private Vector3 _vec3Target;
    /// 
    /// 鼠标点击的时间间隔
    /// 
    private float _fTime = 0f;
    /// 
    /// 玩家的角色控制器组件
    /// 
    private CharacterController _playerControl;
    /// 
    /// 玩家的动画组件
    /// 
    private Animation _aniPlayer;
    /// 
    /// 玩家的状态
    /// 
    private int _playerStatus = 0;
    private Vector3 _vec3;
    //玩家的状态
    private const int PLAYER_IDLE = 0;
    private const int PLAYER_WALK = 1;
    private const int PLAYER_RUN = 2;
    void Awake()
    {
        _playerControl = (CharacterController)GameObject.FindObjectOfType(typeof(CharacterController));
        _aniPlayer = GameObject.FindGameObjectWithTag("Player").GetComponent();
        _planePlayer = new Plane(_transPlayer.up, _transPlayer.position);
        _vec3Target = _transPlayer.position;
        //初始设置玩家的状态
        SetPlayerStatus(PLAYER_IDLE);
    }

    void Update()
    {
        if (Input.GetMouseButtonDown(0)) {
            //发射检测射线
            _rayMouseMove = _camPlayer.ScreenPointToRay(Input.mousePosition);
            //利用玩家平面,返回射线起点与平面交点的距离
            _planePlayer.Raycast(_rayMouseMove, out _fDistMouseMove);
            //根据距离获得鼠标点击的目标点三维坐标
            _vec3Target = _rayMouseMove.GetPoint(_fDistMouseMove);
            //玩家朝向目标点
            _transPlayer.LookAt(new Vector3(_vec3Target.x, _transPlayer.position.y, _vec3Target.z));
            //如果鼠标点击的时间间隔小于0.2秒,设定跑的状态
            if (Time.realtimeSinceStartup - _fTime <= 0.2f) {
                SetPlayerStatus(PLAYER_RUN);
            } else {//反之,设定走的状态
                SetPlayerStatus(PLAYER_WALK);
            }
            //保存鼠标点击时间
            _fTime = Time.realtimeSinceStartup;
        }
    }

    void FixedUpdate()
    {
        switch (_playerStatus) {
        case PLAYER_IDLE:
            //不移动
            break;
        case PLAYER_WALK:
            PlayerMove(0.05f);
            break;
        case PLAYER_RUN:
            PlayerMove(0.1f);
            break;
        default:
            break;
        }
    }

    /// 
    /// 设置玩家状态的方法
    /// 
    /// 状态编号
    void SetPlayerStatus(int status)
    {
        switch (status) {
        case PLAYER_IDLE:
            _aniPlayer.Play("idle");
            break;
        case PLAYER_WALK:
            _aniPlayer.Play("walk");
            break;
        case PLAYER_RUN:
            _aniPlayer.Play("run");
            break;
        default:
            break;
        }

        _playerStatus = status;
    }

    /// 
    /// 玩家移动的方法
    /// 
    /// 移动速度
    void PlayerMove(float speed)
    {
        if (Mathf.Abs(Vector3.Distance(_transPlayer.position, _vec3Target)) >= 0.1f) {
            _vec3 = Vector3.ClampMagnitude(_vec3Target - _transPlayer.position, speed);
            _playerControl.Move(_vec3);
        } else {
            SetPlayerStatus(PLAYER_IDLE);
        }
    }



 

你可能感兴趣的:(【Unity3D引擎】)