unity3d 相机平移源码
### Unity3D 相机平移源码解析 在Unity3D中,为了实现更加灵活且真实的场景浏览体验,开发者经常需要对相机的行为进行自定义编程。本文将深入分析一个用于控制Unity3D中相机平移行为的脚本——`maxCamera.cs`。 #### 一、脚本概览 该脚本名为`maxCamera.cs`,它通过继承`MonoBehaviour`类来实现场景中的相机控制。脚本的主要功能是通过鼠标操作(如平移、旋转、缩放)来控制相机的位置和视角,为用户提供更加自然的交互体验。 #### 二、脚本结构与变量定义 ##### 1. 导入命名空间 ```csharp using UnityEngine; using System.Collections; ``` - `UnityEngine`:包含了Unity的基础API。 - `System.Collections`:用于处理集合数据类型,例如`IEnumerator`等。 ##### 2. 脚本元数据 ```csharp [AddComponentMenu("Camera-Control/3dsMaxCameraStyle")] ``` 此元数据表示该脚本可以在Unity编辑器的“添加组件”菜单下的“Camera-Control/3dsMaxCameraStyle”分类下找到。 ##### 3. 公开变量 这些变量决定了相机控制的基本行为: ```csharp public Transform target; // 目标物体 public Vector3 targetOffset; // 目标偏移量 public float distance = 5.0f; // 默认距离 public float maxDistance = 20; // 最大距离 public float minDistance = 0.6f; // 最小距离 public float xSpeed = 200.0f; // X轴旋转速度 public float ySpeed = 200.0f; // Y轴旋转速度 public int yMinLimit = -80; // Y轴最小限制角度 public int yMaxLimit = 80; // Y轴最大限制角度 public int zoomRate = 40; // 缩放率 public float panSpeed = 0.3f; // 平移速度 public float zoomDampening = 5.0f; // 缩放阻尼 ``` - `target`:指定相机追踪的目标对象。 - `distance`、`maxDistance`、`minDistance`:控制相机与目标之间的距离。 - `xSpeed`、`ySpeed`:旋转速度。 - `yMinLimit`、`yMaxLimit`:限制Y轴旋转的角度范围。 - `zoomRate`:控制缩放的速度。 - `panSpeed`:平移速度。 - `zoomDampening`:缩放时的阻尼效果。 ##### 4. 私有变量 用于存储当前状态: ```csharp private float xDeg = 0.0f; // 当前X轴旋转角度 private float yDeg = 0.0f; // 当前Y轴旋转角度 private float currentDistance; // 当前距离 private float desiredDistance; // 目标距离 private Quaternion currentRotation; // 当前旋转 private Quaternion desiredRotation; // 目标旋转 private Quaternion rotation; // 旋转值 private Vector3 position; // 位置 ``` #### 三、关键函数 ##### 1. 初始化函数 `Init()` 初始化函数主要负责设置初始状态,包括创建临时目标点(如果未提供目标点)、设置相机与目标之间的初始距离、获取当前旋转等。 ```csharp public void Init() { // 如果没有目标,创建一个临时目标 if (!target) { GameObject go = new GameObject("CamTarget"); go.transform.position = transform.position + (transform.forward * distance); target = go.transform; } distance = Vector3.Distance(transform.position, target.position); currentDistance = distance; desiredDistance = distance; // 获取当前旋转等 position = transform.position; rotation = transform.rotation; currentRotation = transform.rotation; desiredRotation = transform.rotation; xDeg = Vector3.Angle(Vector3.right, transform.right); yDeg = Vector3.Angle(Vector3.up, transform.up); } ``` ##### 2. 更新逻辑 `LateUpdate()` `LateUpdate()`方法在所有物理更新之后执行,用于确保相机的更新不会干扰到其他物体的物理计算。 ```csharp void LateUpdate() { // 如果按住Ctrl+Alt+中键,则进行缩放 if (Input.GetMouseButton(2) && Input.GetKey(KeyCode.LeftAlt) && Input.GetKey(KeyCode.LeftControl)) { desiredDistance -= Input.GetAxis("MouseY") * Time.deltaTime * zoomRate * 0.125f * Mathf.Abs(desiredDistance); } // 如果仅按住Alt+中键,则进行旋转 else if (Input.GetMouseButton(2) && Input.GetKey(KeyCode.LeftAlt)) { xDeg += Input.GetAxis("MouseX") * xSpeed * Time.deltaTime; yDeg += Input.GetAxis("MouseY") * ySpeed * Time.deltaTime; } // 其他控制逻辑 // ... } ``` ### 四、总结 该脚本通过简单的鼠标操作实现了相机的平移、旋转以及缩放功能,能够有效提升用户的交互体验。通过对脚本的深入分析,我们不仅了解了其基本的工作原理,还学习了如何在Unity中通过脚本实现高级相机控制技术。这为开发更为复杂的交互式应用提供了坚实的基础。