Unity的三种人物移动方式(ET,键盘,鼠标点击)

核心都是求出输出input的移动方向乘以给定的速度乘以时间间隔,以一定角速度进行旋转来计算。注意这里的CamCtrl的rotation是和主角的forward前方是一致的。过段时间发Camera的设计试试看。

Unity 三种常用人物移动方式,手机触屏移动,键盘移动,鼠标点击移动,在不同类型的游戏中就可能会用到,不过不管是哪种移动方式,都是根据玩家的输入来获得主角移动的朝向:x方向,y方向,在根据主角的角速度,移动速度来每帧改变主角的朝向和行走。

ET移动:

//使用ET Move
            float axisXValue = _RoleFSMMgr.RoleCtrl.JoyStick.axisX.axisValue;
            float axisYValue = _RoleFSMMgr.RoleCtrl.JoyStick.axisY.axisValue;
            speed = (Mathf.Abs(axisXValue) >Math.Abs(axisYValue)) ? axisXValue : axisYValue;  //选择按的最大的哪一个按键来判断主角是不是全力冲刺
            speed = Mathf.Abs(speed);
            if (axisXValue != 0 || axisYValue != 0)
            {
                Vector3 _Dir = new Vector3(axisXValue, 0, axisYValue);
                _Dir = _Dir.normalized;  //获得方向
                _Dir = CamCtrl.Instance.transform.rotation * _Dir;
                Quaternion q = Quaternion.LookRotation(_Dir);
                if (Quaternion.Angle(_RoleFSMMgr.RoleCtrl.transform.rotation, q) > 1)
                {
                    _RotSpeed += 10 * Time.deltaTime;
                    _RoleFSMMgr.RoleCtrl.transform.rotation = Quaternion.Slerp(_RoleFSMMgr.RoleCtrl.transform.rotation, q, _RotSpeed);
                }
                else
                {
                    _RotSpeed = 0;
                }
                _RoleFSMMgr.RoleCtrl.CC.Move(new Vector3(_Dir.x, _Gravity, _Dir.z) * _MoveSpeed * Time.deltaTime*speed);
            }

手机上我都是使用EasyTouch的,放在有限状态机中的RoleStateMove状态脚本中,可以每帧的随时更新主角的行动信息。这里我的角速度是每帧加10*Time.deltaTime到1的时候就朝向一致了,我使用CharacterController的Move方法来控制移动,通过Gravity来让主角一直处于地面,因为摄像机也是有旋转的,为了让角度的计算不是始终都是绝对坐标轴来算,这里特地乘以摄像机的旋转,以摄像机视角为前方计算。

键盘:

//使用KeyBoard Move
            if (Input.GetAxis("Horizontal") != 0 || Input.GetAxis("Vertical") != 0)
            {
                float hh = Input.GetAxis("Horizontal");
                float vv = Input.GetAxis("Vertical");
                speed = (Mathf.Abs(hh)>Mathf.Abs(vv)) ? hh : vv;
                speed = Mathf.Abs(speed);
                _Dir = new Vector3(hh, 0, vv);
                _Dir = _Dir.normalized;
                _Dir = CamCtrl.Instance.transform.rotation * _Dir;
                Quaternion q = Quaternion.LookRotation(_Dir);
                if (Quaternion.Angle(_RoleFSMMgr.RoleCtrl.transform.rotation, q) > 1)
                {
                    _RotSpeed += 10 * Time.deltaTime;
                    _RoleFSMMgr.RoleCtrl.transform.rotation = Quaternion.Slerp(_RoleFSMMgr.RoleCtrl.transform.rotation, q, _RotSpeed);
                }
                else
                {
                    _RotSpeed = 0;
                }
                _RoleFSMMgr.RoleCtrl.CC.Move(new Vector3(_Dir.x,_Gravity,_Dir.z)*_MoveSpeed*Time.deltaTime*speed);
            }

键盘除了获得X,Y方向的方法不一样以外,其余都是和EasyTouch一样的。

鼠标点击:

 //使用A* Path Auto Move
        if (_RoleFSMMgr.RoleCtrl.APath!=null)
        {
            speed = 1;
            if (_RoleFSMMgr.RoleCtrl.CurWayPointIndex>=_RoleFSMMgr.RoleCtrl.APath.vectorPath.Count)
            {
                _RoleFSMMgr.RoleCtrl.ToIdle();
                _RoleFSMMgr.RoleCtrl.CurWayPointIndex = 1;
                _RoleFSMMgr.RoleCtrl.APath = null;
                return;
            }
            else
            {
                _NextPos = new Vector3(_RoleFSMMgr.RoleCtrl.APath.vectorPath[_RoleFSMMgr.RoleCtrl.CurWayPointIndex].x, _RoleFSMMgr.RoleCtrl.transform.position.y, _RoleFSMMgr.RoleCtrl.APath.vectorPath[_RoleFSMMgr.RoleCtrl.CurWayPointIndex].z);
                _Dir = _NextPos - _RoleFSMMgr.RoleCtrl.transform.position;
                _Dir = _Dir.normalized;
                Quaternion q = Quaternion.LookRotation(_Dir);
                if (Quaternion.Angle(_RoleFSMMgr.RoleCtrl.transform.rotation,q)>1)
                {
                    _RotSpeed += 10 * Time.deltaTime;
                    _RoleFSMMgr.RoleCtrl.transform.rotation = Quaternion.Slerp(_RoleFSMMgr.RoleCtrl.transform.rotation,q,_RotSpeed);
                }
                else
                {
                    _RotSpeed = 0;
                }
                _RoleFSMMgr.RoleCtrl.CC.Move(new Vector3(_Dir.x, _Gravity, _Dir.z) * _RoleFSMMgr.RoleCtrl.RoleInfo.MoveSpeed * Time.deltaTime * speed);
                if (Vector3.Distance(_NextPos, _RoleFSMMgr.RoleCtrl.transform.position) < _RoleFSMMgr.RoleCtrl.RoleInfo.MoveSpeed * Time.deltaTime + .2f)
                {
                    _RoleFSMMgr.RoleCtrl.CurWayPointIndex++;
                }
            }
        }

鼠标点击自然是要先通过A*计算出路径来,根据下一个要行走的点和角色当前的位置算出移动的向量方向,再向前面说的那样移动就好了,等到了目标点之后就要切换下一个目标点,直到终点让路径为NULL。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JustEasyCode

谢谢您

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值