using UnityEngine;
public class CameraOrbitController : MonoBehaviour {
public float orbitSpeed = 10f; // 控制相机旋转速度的变量
public float distance = 10f; // 相机到目标的距离
public float minRotationY = -89f; // 相机的最小旋转角度
public float maxRotationY = 89f; // 相机的最大旋转角度
public Transform target; // 要围绕旋转的目标对象的Transform组件
public float waitTime = 5f; // 等待时间
public float autoOrbitSpeed = 5f; // 自转速度
public bool autoOrbitClockwise = true; // 自转方向
public bool canZoom = true; // 是否可以滚轮缩放
public float minZoom = 1; // 是否可以滚轮缩放
public float maxZoom = 100; // 是否可以滚轮缩放
private Vector3 cameraPosition; // 相机的位置向量
private float orbitX = 0f; // 相机在X轴上的旋转角度
private float orbitY = 0f; // 相机在Y轴上的旋转角度
private Vector3 lastMousePosition; // 上一次鼠标的位置
private bool isDragging = false; // 是否正在拖动鼠标
private float idleTime = 0f; // 相机空闲时的计时器
void Start () {
cameraPosition = new Vector3 (0f, 0f, -distance); // 初始化相机的位置向量
transform.position = target.position + cameraPosition; // 将相机的位置设置为目标的位置加上相机的位置向量
}
void Update () {
if (Input.GetMouseButtonDown (0)) {
// 如果按下鼠标左键
lastMousePosition = Input.mousePosition; // 记录下鼠标的位置
isDragging = true; // 开始拖动鼠标
} else if (Input.GetMouseButtonUp (0)) {
// 如果松开鼠标左键
isDragging = false; // 停止拖动鼠标
}
if (isDragging) {
// 如果正在拖动鼠标
idleTime = 0f; // 重置相机空闲计时器
Vector3 delta = Input.mousePosition - lastMousePosition; // 计算鼠标的移动距离
lastMousePosition = Input.mousePosition; // 记录下当前鼠标的位置
orbitX += delta.x * orbitSpeed * Time.deltaTime; // 根据鼠标在X轴上的移动距离,调整相机在X轴上的旋转角度
orbitY -= delta.y * orbitSpeed * Time.deltaTime; // 根据鼠标在Y轴上的移动距离,调整相机在Y轴上的旋转角度
orbitY = Mathf.Clamp (orbitY, minRotationY, maxRotationY); // 将相机在Y轴上的旋转角度限制在最小角度和最大角度之间
Quaternion rotation = Quaternion.Euler (orbitY, orbitX, 0f); // 根据相机的旋转角度创建一个旋转四元数
cameraPosition = rotation * new Vector3 (0f, 0f, -distance); // 根据相机的旋转角度计算相机的位置向量
transform.position = target.position + cameraPosition; // 将相机的位置设置为目标的位置加上相机的位置向量
transform.LookAt (target); // 将相机的朝向设置为目标的位置
} else {
// 如果没有在拖动鼠标
idleTime += Time.deltaTime; // 增加相机的空闲计时器
if (idleTime >= waitTime) {
// 如果相机空闲时间达到5秒
orbitX += (autoOrbitClockwise ? -1 : 1) * autoOrbitSpeed * Time.deltaTime; // 根据相机旋转速度,调整相机在X轴上的旋转角度
Quaternion rotation = Quaternion.Euler (orbitY, orbitX, 0f); // 根据相机的旋转角度创建一个旋转四元数
cameraPosition = rotation * new Vector3 (0f, 0f, -distance); // 根据相机的旋转角度计算相机的位置向量
transform.position = target.position + cameraPosition; // 将相机的位置设置为目标的位置加上相机的位置向量
transform.LookAt (target); // 将相机的朝向设置为目标的位置
}
}
if (canZoom && Input.mouseScrollDelta != Vector2.zero) {
// 如果鼠标滚轮有滚动
float scroll = Input.mouseScrollDelta.y; // 获取鼠标滚动的值
distance -= scroll; // 根据鼠标滚动的值调整相机到目标的距离
distance = Mathf.Clamp (distance, minZoom, maxZoom); // 将相机到目标的距离限制在最小值和最大值之间
Quaternion rotation = Quaternion.Euler (orbitY, orbitX, 0f); // 根据相机的旋转角度创建一个旋转四元数
cameraPosition = rotation * new Vector3 (0f, 0f, -distance); // 根据相机的旋转角度和相机到目标的距离计算相机的位置向量
transform.position = target.position + cameraPosition; // 将相机的位置设置为目标的位置加上相机的位置向量
transform.LookAt (target); // 将相机的朝向设置为目标的位置
}
}
}
Unity 仿Orb控制
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 背景 总是点击那个Console窗口的Clear 来清log,如果高频率的点击也是挺烦的,何不找个快捷方式,让清理...
- 运行时Transform 控制组件。类似于UnityEditor Transform Handle Gizmos ...
- 关卡创建 本文会探讨如何在Unity中使用时间控制进行关卡创建。在探讨之前,可以观看视频了解拥有时间控制玩法的解谜...
- 1、项目根目录新建.gitignore文件 2、项目根目录新建.gitattributes文件 3、Unity工程...
- 功能大概是这个样子的,用鼠标的上下、左右移动来控制unity中某个物体的左右、上下转转。 transform.Ro...