Unity丨移动相机朝向目标并确定目标在摄像机可视范围内丨摄像机注释模型丨摄像机移动丨不同尺寸模型优化丨

文章目录

问题描述

本文提供的功能是摄像机朝向目标移动,并确定整个目标出现在摄像机视角内,针对不同尺寸的模型优化。

功能展示

提示:这里可以添加技术名词解释

技术细节

直接上代码

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;
    }
}

小结

后期可扩展功能:类似点击目标完成视角移动等。

相关推荐
90后小陈老师20 小时前
Unity教学 项目2 2D闯关游戏
游戏·unity·游戏引擎
噗噗夹的TA之旅21 小时前
Unity Shader 学习20:URP LitForwardPass PBR 解析
学习·unity·游戏引擎·图形渲染·技术美术
nnsix21 小时前
Unity ReferenceFinder插件 多选资源查找bug解决
unity·游戏引擎·bug
gzroy1 天前
Unity Shader Graph实现全息瞄准器
unity·游戏引擎
90后小陈老师1 天前
Unity教学 基础介绍
unity·游戏引擎
90后小陈老师1 天前
Unity教学 项目3 3D坦克大战
3d·unity·游戏引擎
秦奈1 天前
Unity复习学习随笔(五):Unity基础
学习·unity·游戏引擎
nnsix1 天前
Unity ReferenceFinder插件 窗口中选择资源时 同步选择Assets下的资源
java·unity·游戏引擎
麷飞花1 天前
unity3d scene窗口选中物体, 在 hierarchy高光显示
unity·editor·unity3d·u3d·hierarchy
AomanHao1 天前
【ISP】提升工业相机图像亮度,改善画面暗
数码相机·工业相机