文章目录
问题描述
本文提供的功能是摄像机朝向目标移动,并确定整个目标出现在摄像机视角内,针对不同尺寸的模型优化。
功能展示
提示:这里可以添加技术名词解释
技术细节
直接上代码
csharp
using UnityEngine;
public class CameraController : MonoBehaviour
{
public Transform target; // 模型的Transform组件
public float moveSpeed = 5.0f; // 摄像机移动速度
public float rotationSpeed = 2.0f; // 摄像机旋转速度
public float minDistance = 2.0f; // 摄像机与模型的最小距离
public float maxDistanceMultiplier = 1.0f; // 最大距离的倍数
private Vector3 targetOffset; // 目标相对于中心的偏移
private void Start()
{
if (target == null)
{
Debug.LogWarning("目标模型为空,请在Inspector中指定目标模型的Transform组件。");
return;
}
// 初始化目标偏移
targetOffset = target.position - transform.position;
}
private void Update()
{
if (target == null)
return;
// 计算摄像机指向目标的方向
Vector3 targetDirection = target.position - transform.position;
targetDirection.y = 0; // 如果只关注水平方向,可以将y轴置为0
// 计算摄像机应该旋转的角度
Quaternion targetRotation = Quaternion.LookRotation(targetDirection);
// 平滑地旋转摄像机朝向目标
transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, rotationSpeed * Time.deltaTime);
// 计算摄像机与目标的距离
float distance = Vector3.Distance(transform.position, target.position);
// 根据模型的大小自动调整最小距离
float modelSize = CalculateModelSize();
float minDistance = modelSize * 0.5f;
// 计算最大距离
float maxDistance = modelSize * maxDistanceMultiplier;
// 限制距离在最小和最大范围内
distance = Mathf.Clamp(distance, minDistance, maxDistance);
// 移动摄像机向前
transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime);
// 计算目标的期望位置
Vector3 desiredPosition = target.position - targetOffset - targetDirection.normalized * distance;
// 平滑移动摄像机到期望位置
transform.position = Vector3.Lerp(transform.position, desiredPosition, Time.deltaTime * moveSpeed);
}
// 计算模型的大小
private float CalculateModelSize()
{
// 这里可以根据模型的具体情况来计算大小
// 例如,可以获取模型的包围盒尺寸
// 也可以根据模型中的特定标记来计算大小
// 这里只是一个示例,需要根据实际情况进行调整
Bounds bounds = new Bounds(target.position, Vector3.one);
Renderer[] renderers = target.GetComponentsInChildren<Renderer>();
foreach (Renderer renderer in renderers)
{
bounds.Encapsulate(renderer.bounds);
}
// 返回模型的大小(包围盒的对角线长度)
return bounds.size.magnitude;
}
}
小结
后期可扩展功能:类似点击目标完成视角移动等。