Unity3D学习笔记(二十二)模仿WOW镜头操作

用多了Unity自带的First Person Controller,总感觉只使用第一人称视角有点不爽,如果能想WOW那样镜头拉远了就是第三人称,拉到最近就是第一人称,那该多好啊。稍微看了下Unity自带的Third Person Controller,发现也不是我需要的效果。那看来只好自己动手丰衣足食咯……


▇ 知识点 

  • Input.GetAxis:用这个可以获取鼠标滚轮滚动的幅度,也可以获取鼠标移动的幅度;
  • Input.GetMouseButton:获取鼠标按钮状态,0-鼠标左键,1-鼠标右键,2-鼠标中键;
  • Quaternion.Euler:通过欧拉角创建一个四元数,可以用来代表一个物体的三维旋转;
  • 四元数乘以一个向量,等同于将这个向量按四元数旋转;

▇ 思路 

创建一个空游戏对象Player,在其中创建一个Capsule作为临时使用的玩家模型,一个MainCamera作为主镜头;

  • 创建一个WowCamera脚本,附加到MainCamera上,响应玩家鼠标操作,并实时调整自己的位置;
  • 为Player附加Unity自带的3rd Person Controller,这样可以控制角色;
  • 旋转镜头的时候要把鼠标指针隐藏;

▇ 脚本

  1. using UnityEngine;
  2. using System.Collections;

  3. /// 
  4. /// 将此脚本附加到任意镜头上,可以使其拥有WOW镜头的控制方式
  5. /// 
  6. public class WowCamera : MonoBehaviour
  7. {
  8. /// 
  9. /// 镜头目标
  10. /// 
  11. public Transform Target;

  12. /// 
  13. /// 镜头离目标的距离
  14. /// 
  15. public float Distance = 30.0f;

  16. /// 
  17. /// 最大镜头距离
  18. /// 
  19. public float MaxDistance = 30.0f;

  20. /// 
  21. /// 鼠标滚轮拉近拉远速度系数
  22. /// 
  23. public float ScrollFactor = 10.0f;

  24. /// 
  25. /// 镜头旋转速度比率
  26. /// 
  27. public float RotateFactor = 10.0f;

  28. /// 
  29. /// 镜头水平环绕角度
  30. /// 
  31. public float HorizontalAngle = 45;

  32. /// 
  33. /// 镜头竖直环绕角度
  34. /// 
  35. public float VerticalAngle = 0;

  36. private Transform mCameraTransform;

  37. void Start()
  38. {
  39. mCameraTransform = transform;
  40. }

  41. void Update()
  42. {
  43. //滚轮向前:拉近距离;滚轮向后:拉远距离
  44. var scrollAmount = Input.GetAxis(GameSetting.MouseScrollWheel);
  45. Distance -= scrollAmount * ScrollFactor;



  46. //保证镜头距离合法
  47. if (Distance < 0)
  48. Distance = 0;
  49. else if (Distance > MaxDistance)
  50. Distance = MaxDistance;



  51. //按住鼠标左右键移动,镜头随之旋转
  52. var isMouseLeftButtonDown = Input.GetMouseButton(0);
  53. var isMouseRightButtonDown = Input.GetMouseButton(1);
  54. if (isMouseLeftButtonDown || isMouseRightButtonDown)
  55. {
  56. Screen.lockCursor = true;

  57. var axisX = Input.GetAxis(GameSetting.MouseX);
  58. var axisY = Input.GetAxis(GameSetting.MouseY);

  59. HorizontalAngle += axisX * RotateFactor;
  60. VerticalAngle += axisY * RotateFactor;
  61. if (isMouseRightButtonDown)
  62. {
  63. //如果是鼠标右键移动,则旋转人物在水平面上与镜头方向一致
  64. Target.rotation = Quaternion.Euler(0, HorizontalAngle, 0);
  65. }
  66. }
  67. else
  68. {
  69. Screen.lockCursor = false;
  70. }



  71. //按镜头距离调整位置和方向
  72. var rotation = Quaternion.Euler(-VerticalAngle, HorizontalAngle, 0);
  73. var offset = rotation * Vector3.back * Distance;
  74. mCameraTransform.position = Target.position + offset;
  75. mCameraTransform.rotation = rotation;
  76. }
  77. }
复制代码

▇ 效果 

 

其实没有实现的功能还很多,比如可以任意旋转镜头,可以从角色的脚底下穿过,也会穿透地面,囧。解决起来也不难,用Raycast从角色向摄像机做碰撞检测,如果有碰撞则将摄像机和人物的距离变为到碰撞点的距离即可,为什么不做呢?

因为正当我兴冲冲写下这篇笔记的时候,发现网上已经有大神写了一个素材包,专门用来WOW的镜头和角色控制。不仅实现了上述功能,还有水下效果、动作动画等等,需要花点时间研究消化一下……再结合从WOW导出的角色模型动画,这样就可以摆脱这个白色的“小药丸”咯。

总之虽然重复造了轮子(而且还造得不完美),但从中也学到了很多。特别是那个四元数的概念,在度娘知道里看得我一愣一愣的,走路在想,吃饭在想,洗澡也在想。还好最后还是啃下来了,后来回过头来发现也并不是那么难以逾越的坎,关键在于能够沉下心来思考。

白洞,白色的明天在等着我们!

你可能感兴趣的:(Unity3D学习笔记(二十二)模仿WOW镜头操作)