Unity相机控制小技巧
2016-10-16 11:37
585 查看
开始做一些RPG或者其他涉及到视角运动的游戏时,发现对摄像机的控制很头疼,有时可能需要同时控制摄像机的跟随、旋转、拉远拉进,一不小心就会乱套。我们可以利用分解思想,将大问题拆分为小问题来分析这个问题。我们考虑相机运动有多少种运动状态:跟随主角、朝向主角、沿Z轴拉进拉远、沿X、Y、Z轴旋转,一共六种方式。如果直接在摄像机上对这六种状态进行控制就会很乱,我们可以考虑循环嵌套的方式,将摄像机放在一层层空物体下,每层空物体控制一种运动状态:
分好层级后,下面便对每一层级进行控制,写一个单例类挂载到最外层的CameraController上,负责总控以及相机的跟随。
下一步在主角的控制脚本上去调用这个类中的方法,其中 AutoFollow()和LookAt()需要在FixedUpdate中实时调用,其他方法在需要时调用。这样便可以完美的实现相机跟随以及运动的控制。
分好层级后,下面便对每一层级进行控制,写一个单例类挂载到最外层的CameraController上,负责总控以及相机的跟随。
public class CameraController : MonoBehaviour { #region 单例 private static CameraController instance; public static CameraController Instance { get { return instance; } } void Awake() { instance = this; } #endregion #region 字段 [SerializeField] private Transform mContainerRotateX; [SerializeField] private Transform mContainerRotateY; [SerializeField] private Transform mContainerZoomZ; [SerializeField] private Transform mContainerLookAt; #endregion #region 属性 public float ZoomMinVal = -10f; //最大值 public float ZoomMaxVal = -3f; //最近距离 public float ZoomSensitive = 3f; //移动速度 public float RotateYSensitive = 60; //每秒沿着Y轴的旋转角度 public float RotateXSensitive = 60; public float RotateXMinVal = 20f; public float RotateXMaxVal = 60f; #endregion #region 方法 /// <summary> /// 摄像头跟随方法 /// </summary> /// <param name="position">位置</param> public void AutoFollow(Vector3 position) { //transform.position = position; transform.position = Vector3.Lerp(transform.position, position, Time.deltaTime); } /// <summary> /// 摄像机绕着X轴旋转 /// </summary> /// <param name="id">id = 0表示正方向,id=1表示负方向</param> public void RotateX(int id) { float value = Time.deltaTime * RotateXSensitive * id; Debug.Log(value); if (mContainerRotateX.localEulerAngles.x < 45) { mContainerRotateX.localEulerAngles += new Vector3(value, 0, 0); } } /// <summary> /// 摄像机绕着y轴旋转 /// </summary> /// <param name="id">id = -1表示正方向,id=1表示负方向</param> public void RotateY(int id) { float value = Time.deltaTime * RotateYSensitive * id; mContainerRotateY.localEulerAngles += new Vector3(0, value, 0); } /// <summary> /// 摄像机沿着Z轴缩放 /// </summary> /// <param name="id">id = 1表示正方向,id=-1表示负方向</param> public void ZoomZ(int id) { float value = mContainerZoomZ.localPosition.z + Time.deltaTime * ZoomSensitive * id; value = Mathf.Clamp(value, ZoomMinVal, ZoomMaxVal); mContainerZoomZ.localPosition = new Vector3(0, 0, value); } /// <summary> /// 摄像 4000 头始终朝向某一个点 /// </summary> /// <param name="position"></param> public void LookAt(Vector3 position) { mContainerLookAt.LookAt(position); } #endregion }
下一步在主角的控制脚本上去调用这个类中的方法,其中 AutoFollow()和LookAt()需要在FixedUpdate中实时调用,其他方法在需要时调用。这样便可以完美的实现相机跟随以及运动的控制。
相关文章推荐
- unity中结合oculus制作VR场景控制相机的移动的三种方式
- 转一篇Unity的相机动画控制
- unity。。。完美简单解决靠鼠标在屏幕上的移动来控制相机水平,垂直旋转的c#脚本
- Unity 控制相机绕物体的旋转
- Unity中使用鼠标控制相机的视口方向以及移动
- Unity鼠标自由查看3D物体之控制摄相机Camera
- Unity 相机控制集合。。。。
- Unity 3D:控制相机旋转、移动、缩放等功能
- Unity 2D游戏相机控制(水平,竖直,角色居中三种模式)
- Unity 小技巧:Scene视图 和 Game视图 中 视角(Camera)的控制
- unity 手指旋转物体双手控制相机的远近
- Unity 控制相机绕物体的旋转
- Unity学习笔记——Unity基础五:相机控制
- unity 用鼠标控制相机绕着物体旋转脚本
- 用代码控制unityeditor的暂停/播放状态
- unity 实现键盘控制物体移动和转向
- 正交相机视野控制
- unity5 Orthographic模式相机视截体尺寸计算
- OpenGL教程翻译 第十四课 相机控制(一)
- printf函数小技巧:用变量控制宽度