【Unity3D自学记录】Unity3D游戏开发之自由视角状态下的角色控制(二)

 在测试Unity3D游戏开发之自由视角状态下的角色控制这个项目的时候意外地发现了一个Bug。Bug出现在如下位置:[csharp] view plaincopyprint?

  1. //设置玩家跟随角度  
  2. if(Target.GetComponent<NoLockiVew_Player>().State==NoLockiVew_Player.PlayerState.Walk)  
  3. {  
  4.     Target.rotation=Quaternion.Euler(new Vector3(0,mX,0));  
  5. }  

该方法主要的作用是当玩家同时按下方向控制键和鼠标右键,玩家可以随着鼠标旋转到对应的角度,这主要是为了满足玩家双手操作的需求,不过由于这行代码,导致玩家在向左、向右、向后三个方向上的转身失效,如果除去这行代码,则原来的方向控制没有任何问题,可是没有这行代码,玩家的操作感就会下降。后来想到我们对角色的旋转实际上应该是放在鼠标右键事件里的,所以将代码修改如下,这样就解决了这个Bug:


  1. using UnityEngine;  
  2. using System.Collections;  
  3.   
  4. public class NoLockView_Camera : MonoBehaviour   
  5. {  
  6.     //观察目标  
  7.     public Transform Target;  
  8.     //观察距离  
  9.     public float Distance = 5F;  
  10.     //旋转速度  
  11.     private float SpeedX=240;  
  12.     private float SpeedY=120;  
  13.     //角度限制  
  14.     private float  MinLimitY = 5;  
  15.     private float  MaxLimitY = 180;  
  16.   
  17.     //旋转角度  
  18.     private float mX = 0.0F;  
  19.     private float mY = 0.0F;  
  20.   
  21.     //鼠标缩放距离最值  
  22.     private float MaxDistance=10;  
  23.     private float MinDistance=1.5F;  
  24.     //鼠标缩放速率  
  25.     private float ZoomSpeed=2F;  
  26.   
  27.     //是否启用差值  
  28.     public bool isNeedDamping=true;  
  29.     //速度  
  30.     public float Damping=10F;  
  31.   
  32.     private Quaternion mRotation;  
  33.   
  34.     void Start ()   
  35.     {  
  36.         //初始化旋转角度  
  37.         mX=transform.eulerAngles.x;  
  38.         mY=transform.eulerAngles.y;  
  39.     }  
  40.       
  41.     void LateUpdate ()   
  42.     {  
  43.         //鼠标右键旋转  
  44.         if(Target!=null && Input.GetMouseButton(1))  
  45.         {  
  46.             //获取鼠标输入  
  47.             mX += Input.GetAxis("Mouse X") * SpeedX * 0.02F;  
  48.             mY -= Input.GetAxis("Mouse Y") * SpeedY * 0.02F;  
  49.             //范围限制  
  50.             mY = ClampAngle(mY,MinLimitY,MaxLimitY);  
  51.             //计算旋转  
  52.             mRotation = Quaternion.Euler(mY, mX, 0);  
  53.             //根据是否插值采取不同的角度计算方式  
  54.             if(isNeedDamping){  
  55.                 transform.rotation = Quaternion.Lerp(transform.rotation,mRotation, Time.deltaTime*Damping);   
  56.             }else{  
  57.                 transform.rotation = mRotation;  
  58.             }  
  59.             //处理同时按下鼠标右键和方向控制键  
  60.             if(Target.GetComponent<NoLockiVew_Player>().State==NoLockiVew_Player.PlayerState.Walk){  
  61.                 Target.rotation=Quaternion.Euler(new Vector3(0,mX,0));  
  62.             }  
  63.         }  
  64.   
  65.         //鼠标滚轮缩放  
  66.         Distance-=Input.GetAxis("Mouse ScrollWheel") * ZoomSpeed;  
  67.         Distance=Mathf.Clamp(Distance,MinDistance,MaxDistance);  
  68.   
  69.         //重新计算位置  
  70.         Vector3 mPosition = mRotation * new Vector3(0.0F, 0.0F, -Distance) + Target.position;  
  71.   
  72.         //设置相机的角度和位置  
  73.         if(isNeedDamping){  
  74.            transform.position = Vector3.Lerp(transform.position,mPosition, Time.deltaTime*Damping);   
  75.         }else{  
  76.            transform.position = mPosition;  
  77.         }  
  78.   
  79.     }  
  80.   
  81.   
  82.     //角度限制  
  83.     private float  ClampAngle (float angle,float min,float max)   
  84.     {  
  85.         if (angle < -360) angle += 360;  
  86.         if (angle >  360) angle -= 360;  
  87.         return Mathf.Clamp (angle, min, max);  
  88.     }  
  89. }  
不过经过测试,如果不采用插值的话,似乎效果更为真实啊(为什么会和第一次测试的感觉不一样啊,囧!)


猜你喜欢

转载自blog.csdn.net/hackdjh/article/details/39893931