首页 > 代码库 > Unity3D游戏开发之自由视角状态下的角色控制(二)
Unity3D游戏开发之自由视角状态下的角色控制(二)
在测试Unity3D游戏开发之自由视角状态下的角色控制这个项目的时候意外地发现了一个Bug。Bug出现在如下位置:
[csharp] view plaincopyprint?
- //设置玩家跟随角度
- if(Target.GetComponent<NoLockiVew_Player>().State==NoLockiVew_Player.PlayerState.Walk)
- {
- Target.rotation=Quaternion.Euler(new Vector3(0,mX,0));
- }
该方法主要的作用是当玩家同时按下方向控制键和鼠标右键,玩家可以随着鼠标旋转到对应的角度,这主要是为了满足玩家双手操作的需求,不过由于这行代码,导致玩家在向左、向右、向后三个方向上的转身失效,如果除去这行代码,则原来的方向控制没有任何问题,可是没有这行代码,玩家的操作感就会下降。后来想到我们对角色的旋转实际上应该是放在鼠标右键事件里的,所以将代码修改如下,这样就解决了这个Bug:
[csharp] view plaincopyprint?
- using UnityEngine;
- using System.Collections;
- public class NoLockView_Camera : MonoBehaviour
- {
- //观察目标
- public Transform Target;
- //观察距离
- public float Distance = 5F;
- //旋转速度
- private float SpeedX=240;
- private float SpeedY=120;
- //角度限制
- private float MinLimitY = 5;
- private float MaxLimitY = 180;
- //旋转角度
- private float mX = 0.0F;
- private float mY = 0.0F;
- //鼠标缩放距离最值
- private float MaxDistance=10;
- private float MinDistance=1.5F;
- //鼠标缩放速率
- private float ZoomSpeed=2F;
- //是否启用差值
- public bool isNeedDamping=true;
- //速度
- public float Damping=10F;
- private Quaternion mRotation;
- void Start ()
- {
- //初始化旋转角度
- mX=transform.eulerAngles.x;
- mY=transform.eulerAngles.y;
- }
- void LateUpdate ()
- {
- //鼠标右键旋转
- if(Target!=null && Input.GetMouseButton(1))
- {
- //获取鼠标输入
- mX += Input.GetAxis("Mouse X") * SpeedX * 0.02F;
- mY -= Input.GetAxis("Mouse Y") * SpeedY * 0.02F;
- //范围限制
- mY = ClampAngle(mY,MinLimitY,MaxLimitY);
- //计算旋转
- mRotation = Quaternion.Euler(mY, mX, 0);
- //根据是否插值采取不同的角度计算方式
- if(isNeedDamping){
- transform.rotation = Quaternion.Lerp(transform.rotation,mRotation, Time.deltaTime*Damping);
- }else{
- transform.rotation = mRotation;
- }
- //处理同时按下鼠标右键和方向控制键
- if(Target.GetComponent<NoLockiVew_Player>().State==NoLockiVew_Player.PlayerState.Walk){
- Target.rotation=Quaternion.Euler(new Vector3(0,mX,0));
- }
- }
- //鼠标滚轮缩放
- Distance-=Input.GetAxis("Mouse ScrollWheel") * ZoomSpeed;
- Distance=Mathf.Clamp(Distance,MinDistance,MaxDistance);
- //重新计算位置
- Vector3 mPosition = mRotation * new Vector3(0.0F, 0.0F, -Distance) + Target.position;
- //设置相机的角度和位置
- if(isNeedDamping){
- transform.position = Vector3.Lerp(transform.position,mPosition, Time.deltaTime*Damping);
- }else{
- transform.position = mPosition;
- }
- }
- //角度限制
- private float ClampAngle (float angle,float min,float max)
- {
- if (angle < -360) angle += 360;
- if (angle > 360) angle -= 360;
- return Mathf.Clamp (angle, min, max);
- }
- }
更多精彩请点击http://www.gopedu.com/article
Unity3D游戏开发之自由视角状态下的角色控制(二)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。