4.3 摄像机 因为游戏的场景可能会比较大,我们需要移动摄像机才能观察到场景的各个部分。接下来我们将为摄像机添加脚本,在移动鼠标的时候可以移动摄像机。 在为摄像机创建脚本前我们需要先创建一个空游戏体作为摄像机观察的目标点,并为其创建脚本CameraPoint.cs,它只有很少的代码。 using UnityEngine; using System.Collections; public class CameraPoint : MonoBehaviour { public static CameraPoint Instance = null; void Awake() { Instance = this; } void OnDrawGizmos() { Gizmos.DrawIcon(transform.position, "CameraPoint.tif"); } } 创建脚本GameCamera.cs,并将其指定给场景中的摄像机。 using UnityEngine; using System.Collections; public class GameCamera : MonoBehaviour { public static GameCamera Inst = null; // 摄像机距离地面的距离 protected float m_distance = 15; // 摄像机的角度 protected Vector3 m_rot = new Vector3(-55, 180, 0); // 摄像机的移动速度 protected float m_moveSpeed = 60; // 摄像机的移动值 protected float m_vx = 0; protected float m_vy = 0; // Transform组件 protected Transform m_transform; // 摄像机的焦点 protected Transform m_cameraPoint; void Awake() { Inst = this; m_transform = this.transform; } // Use this for initialization void Start() { // 获得摄像机的焦点 m_cameraPoint = CameraPoint.Instance.transform; Follow(); } // 在Update之后执行 void LateUpdate() { Follow(); } // 摄像机对齐到焦点的位置和角度 void Follow() { m_transform.position = m_cameraPoint.position; m_transform.eulerAngles = m_rot; m_transform.Translate(0, 0, m_distance); this.transform.LookAt(m_cameraPoint); } // 控制摄像机移动 public void Control(bool mouse, float mx, float my) { if (!mouse) return; m_cameraPoint.Translate(-mx * m_moveSpeed * Time.deltaTime, 0, -my * m_moveSpeed * Time.deltaTime); } } 在这个脚本的Start函数中,我们首先获得了前面创建的CameraPoint,它将作为摄像机目标点的参考。 在Follow函数中,摄像机会按预设的旋转和距离始终跟随CameraPoint目标点。 LateUpdate函数和Update函数的作用一样,不同的是它始终会在执行完Update后执行,我们在这个函数中调用Follow函数,确保在所有的操作完成后再移动摄像机。 Control函数的作用是移动CameraPoint目标点,因为摄像机的角度和位置始终跟随这个目标点,所以也会随着目标点的移动而移动。 虽然我们完成了摄像机的脚本,但运行游戏后摄像机还不能移动,这是因为我们并没有在摄像机的脚本中添加鼠标操作。在塔防游戏中,每个防守单位都是由一个按下按钮的操作创建出来,因为这个操作和移动摄像机都是由鼠标左键完成,所以我们将在一个地方集中处理鼠标操作,使按钮和移动摄像机操作不会发生冲突。