实现:通过键盘控制相机围绕角色进行上下左右旋转以及相机视角的缩放。
-
相机的创建
创建四个空物体,分别为下图的命名,给相机四层父物体结构,以方便实现相机在三维场景中围绕角色旋转以及缩放
CameraFollowAndRotate
position=player.position
rotation=(0,y,0)
rotation.y控制视角围绕角色水平方向移动且实时
CameraUpAndDown
position=(0,0,0)
rotation=(0,0,z)
rotation.z控制视角围绕角色竖直方向移动
CameraZoomContainer
position=(10,0,0);
rotation=(0,0,0);
position.x控制视角缩放
CameraContainer
position=(0,0,0)
rotation为实时LookAt角色。
Main Camera上面暂时什么都不用加,位置和角度均为0,后期相机上可以挂载一些震屏,屏幕特效之类的需要。
自此准备相机的准备工作就好了。下面是代码部分 -
代码控制视角转变
首先是相机代码:
将相机设置成简单的单例,并添加控制相机的几种方法,然后可以在角色代码中进行调用。将代码挂载在CameraFollowAndRotate下。public class CameraCtrl : MonoBehaviour
{//单例 public static CameraCtrl Instance; /// <summary> /// 控制摄像机水平方向旋转 /// </summary> [SerializeField] private Transform m_CameraFollowAndRotate; /// <summary> /// 控制摄像机上下旋转 /// </summary> [SerializeField] private Transform m_CameraUpAndDown; /// <summary> /// 控制摄像机的缩放 /// </summary> [SerializeField] private Transform m_CameraZoomContainer; /// <summary> /// 摄像机容器 /// </summary> [SerializeField] private Transform m_CameraContainer; void Awake() { Instance=this; } /// <summary> /// 初始化 /// </summary> public void Init() { m_CameraUpAndDown.transform.localEulerAngles = new Vector3(0, 0, Mathf.Clamp(m_CameraUpAndDown.localEulerAngles.z, 35f, 80f)); m_CameraZoomContainer.transform.localPosition = new Vector3(Mathf.Clamp(m_CameraZoomContainer.transform.localPosition.x, 3f, 5f), 0, 0); } /// <summary> /// 设置摄像机水平旋转 /// </summary> /// <param name="rotateDir">0=左 1=右</param> public void SetCameraRotate(int rotateDir) { m_CameraFollowAndRotate.Rotate(0, 40 * Time.deltaTime * (rotateDir == 0 ? 1 : -1), 0); } /// <summary> /// 设置摄像机上下旋转 /// </summary> /// <param name="rotateDir">0=上 1=下</param> public void SetCameraUpAndDown(int rotateDir) { m_CameraUpAndDown.Rotate(0, 0, 30 * Time.deltaTime * (rotateDir == 0 ? 1 : -1)); m_CameraUpAndDown.transform.localEulerAngles = new Vector3(0, 0, Mathf.Clamp(m_CameraUpAndDown.localEulerAngles.z, 35f, 80f)); } /// <summary> /// 设置摄像机缩放 /// </summary> /// <param name="type">0=拉近,1=拉远</param> public void SetCameraZoom(int type) { m_CameraZoomContainer.Translate(10 * Time.deltaTime * (type == 1 ? -1 : 1), 0, 0); m_CameraZoomContainer.transform.localPosition = new Vector3(Mathf.Clamp(m_CameraZoomContainer.transform.localPosition.x, 3f, 5f), 0, 0); } /// <summary> /// 实时看着主角 /// </summary> /// <param name="pos"></param> public void AutoLookAt(Vector3 pos) { m_CameraContainer.LookAt(pos); } void OnDrawGizmos() { Gizmos.color = Color.red; Gizmos.DrawWireSphere(transform.position, 15f); Gizmos.color = Color.blue; Gizmos.DrawWireSphere(transform.position, 14f); Gizmos.color = Color.green; Gizmos.DrawWireSphere(transform.position, 12f); }
}
3.角色代码中调用这几种方法
void Start ()
{
if(CameraCtrl.Instance!=null)
{
CameraCtrl.Instance.Init();
}
}
void Update()
{
CameraAutoFollow();
}
/// <summary>
/// 相机自动跟随
/// </summary>
private void CameraAutoFollow()
{
if (CameraCtrl.Instance == null) return;
CameraCtrl.Instance.transform.position = this.transform.position;
CameraCtrl.Instance.AutoLookAt(transform.position);
if (Input.GetKey(KeyCode.A))
{
CameraCtrl.Instance.SetCameraRotate(0);
}
if (Input.GetKey(KeyCode.D))
{
CameraCtrl.Instance.SetCameraRotate(1);
}
if (Input.GetKey(KeyCode.W))
{
CameraCtrl.Instance.SetCameraUpAndDown(0);
}
if (Input.GetKey(KeyCode.S))
{
CameraCtrl.Instance.SetCameraUpAndDown(1);
}
if (Input.GetKey(KeyCode.I))
{
CameraCtrl.Instance.SetCameraZoom(0);
}
if (Input.GetKey(KeyCode.L))
{
CameraCtrl.Instance.SetCameraZoom(1);
}
}
自此,我们已经通过角色移动以及视角的上下左右旋转以及缩放,下一篇,主要讲通过EasyTouch插件的事件来,控制在移动平台下对视角的控制。