問(wèn)題描述
本文提供的功能是攝像機(jī)朝向目標(biāo)移動(dòng),并確定整個(gè)目標(biāo)出現(xiàn)在攝像機(jī)視角內(nèi),針對(duì)不同尺寸的模型優(yōu)化。
功能展示
提示:這里可以添加技術(shù)名詞解釋
技術(shù)細(xì)節(jié)
直接上代碼文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-732314.html
using UnityEngine;
public class CameraController : MonoBehaviour
{
public Transform target; // 模型的Transform組件
public float moveSpeed = 5.0f; // 攝像機(jī)移動(dòng)速度
public float rotationSpeed = 2.0f; // 攝像機(jī)旋轉(zhuǎn)速度
public float minDistance = 2.0f; // 攝像機(jī)與模型的最小距離
public float maxDistanceMultiplier = 1.0f; // 最大距離的倍數(shù)
private Vector3 targetOffset; // 目標(biāo)相對(duì)于中心的偏移
private void Start()
{
if (target == null)
{
Debug.LogWarning("目標(biāo)模型為空,請(qǐng)?jiān)贗nspector中指定目標(biāo)模型的Transform組件。");
return;
}
// 初始化目標(biāo)偏移
targetOffset = target.position - transform.position;
}
private void Update()
{
if (target == null)
return;
// 計(jì)算攝像機(jī)指向目標(biāo)的方向
Vector3 targetDirection = target.position - transform.position;
targetDirection.y = 0; // 如果只關(guān)注水平方向,可以將y軸置為0
// 計(jì)算攝像機(jī)應(yīng)該旋轉(zhuǎn)的角度
Quaternion targetRotation = Quaternion.LookRotation(targetDirection);
// 平滑地旋轉(zhuǎn)攝像機(jī)朝向目標(biāo)
transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, rotationSpeed * Time.deltaTime);
// 計(jì)算攝像機(jī)與目標(biāo)的距離
float distance = Vector3.Distance(transform.position, target.position);
// 根據(jù)模型的大小自動(dòng)調(diào)整最小距離
float modelSize = CalculateModelSize();
float minDistance = modelSize * 0.5f;
// 計(jì)算最大距離
float maxDistance = modelSize * maxDistanceMultiplier;
// 限制距離在最小和最大范圍內(nèi)
distance = Mathf.Clamp(distance, minDistance, maxDistance);
// 移動(dòng)攝像機(jī)向前
transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime);
// 計(jì)算目標(biāo)的期望位置
Vector3 desiredPosition = target.position - targetOffset - targetDirection.normalized * distance;
// 平滑移動(dòng)攝像機(jī)到期望位置
transform.position = Vector3.Lerp(transform.position, desiredPosition, Time.deltaTime * moveSpeed);
}
// 計(jì)算模型的大小
private float CalculateModelSize()
{
// 這里可以根據(jù)模型的具體情況來(lái)計(jì)算大小
// 例如,可以獲取模型的包圍盒尺寸
// 也可以根據(jù)模型中的特定標(biāo)記來(lái)計(jì)算大小
// 這里只是一個(gè)示例,需要根據(jù)實(shí)際情況進(jìn)行調(diào)整
Bounds bounds = new Bounds(target.position, Vector3.one);
Renderer[] renderers = target.GetComponentsInChildren<Renderer>();
foreach (Renderer renderer in renderers)
{
bounds.Encapsulate(renderer.bounds);
}
// 返回模型的大?。ò鼑械膶?duì)角線長(zhǎng)度)
return bounds.size.magnitude;
}
}
小結(jié)
后期可擴(kuò)展功能:類似點(diǎn)擊目標(biāo)完成視角移動(dòng)等。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-732314.html
到了這里,關(guān)于Unity丨移動(dòng)相機(jī)朝向目標(biāo)并確定目標(biāo)在攝像機(jī)可視范圍內(nèi)丨攝像機(jī)注釋模型丨攝像機(jī)移動(dòng)丨不同尺寸模型優(yōu)化丨的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!