电脑建设银行怎样设置网站查询密码,广告公司是干什么的,网站集约化建设意见,有限责任公司公司章程范本上一篇中我们完成了不借助第三方插件实现手游的虚拟摇杆#xff0c;现在借助这个虚拟摇杆来实现控制角色的移动。 虚拟摇杆实际上就给角色输出方向#xff0c;类似于键盘的WSAD#xff0c;也是一个二维坐标#xff0c;也就是(-1,1)的范围#xff0c;将摇杆的方向进行归一化… 上一篇中我们完成了不借助第三方插件实现手游的虚拟摇杆现在借助这个虚拟摇杆来实现控制角色的移动。 虚拟摇杆实际上就给角色输出方向类似于键盘的WSAD也是一个二维坐标也就是(-1,1)的范围将摇杆的方向进行归一化传递给角色即可创建一个名为PlayerManager的脚本通过Character组件来控制角色的移动。这里在上一篇文章在一. Unity实现虚拟摇杆及屏幕自适应功能讲述过了这里拖拽的时候将位移的向量归一化后传递给角色松手的时候归0. mUIEvtListener.OnPointerUpEvent (eventData {mPointImg.transform.localPosition mDefaultPos;mPointImg.SetActiveState(false);mDirImg.transform.localPosition mDefaultPos;PlayerManager.Instance.SetPlayerDir(Vector2.zero);});mUIEvtListener.OnDragFunc (eventData {Vector2 dir eventData.position - mStartPos;float length dir.magnitude;PlayerManager.Instance.SetPlayerDir(dir.normalized);if (length mTouchMaxDir){Vector2 clampDir Vector2.ClampMagnitude(dir, mTouchMaxDir);mPointImg.transform.position mStartPos clampDir;}else{mPointImg.transform.position eventData.position;}});在PlayerManager中就是一些常规操作设置方向这里用了一个Vector2.SignedAngle的API其作用就是返回传入向量和目标向量之间的角度我们设定的目标向量是(0,1)也就是二维向量的正前方下面画了一张图应该会很清楚。其中为什么要mCamTrans.eulerAngles.y是因为相机是倾斜的照着角色摄像机于角色之间有一个相对角度是为了能够确保玩家的移动方向与摄像机视角一致不论摄像机朝哪个方向玩家的输入都能按照当前摄像机的视角调整角色的朝向。 public class PlayerManager : ComponentPlayerManager{private const float TouchSpeed 5;private CharacterController mCC;private Animator mAnim;private Vector2 mDir;private Transform mCamTrans;private Vector3 mOffset;private float mCurAnimSpeed;private float mTargerAnimSpeed;private const float AccelerSpeed 5;public override void IStart(){base.IStart();mCC GetComponentCharacterController();mAnim GetComponentInChildrenAnimator();mCamTrans Camera.main.transform;mOffset transform.position - mCamTrans.transform.position;}public override void IUpdate(){base.IUpdate();if (mDir ! Vector2.zero){SetDir();SetMove();SetCamera();}}/// summary/// 通过摇杆控制玩家方向/// /summary/// param namedir/parampublic void SetPlayerDir(Vector2 dir){if (dir ! Vector2.zero){mDir dir;SetAnimSpeed(1);}else{mDir Vector2.zero;SetAnimSpeed(0);}}private void SetDir(){float angle Vector2.SignedAngle(mDir, new Vector2(0, 1)) mCamTrans.eulerAngles.y;transform.eulerAngles new Vector3(0, angle, 0);}private void SetMove(){mCC.Move(transform.forward * Time.deltaTime * TouchSpeed);}private void SetCamera(){mCamTrans.transform.position transform.position - mOffset;}}
}最后简单设置一下角色的动画将Idle和Run进行一个简单的混合通过插值的形式让当前的Speed以平缓的过渡到目标值。 public class PlayerManager : ComponentPlayerManager{private float mCurAnimSpeed;private float mTargerAnimSpeed;private const float AccelerSpeed 5;public override void IUpdate(){base.IUpdate();if (mDir ! Vector2.zero){SetDir();SetMove();SetCamera();}if (mCurAnimSpeed ! mTargerAnimSpeed){UpdateAnimFixed();}}private void SetAnimSpeed(float speed){mTargerAnimSpeed speed;}private void UpdateAnimFixed(){if (Mathf.Abs(mCurAnimSpeed - mTargerAnimSpeed) AccelerSpeed){mCurAnimSpeed AccelerSpeed;}else if(mCurAnimSpeed mTargerAnimSpeed){mCurAnimSpeed - Time.deltaTime * AccelerSpeed;}else if(mCurAnimSpeed mTargerAnimSpeed){mCurAnimSpeed Time.deltaTime * AccelerSpeed;}mAnim.SetFloat(Speed,mCurAnimSpeed);}}测试运行结果如下: