You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity C#脚本如何运行时修改组件属性(以相机近裁剪面为例)

动态调整相机近裁剪面实现方法

核心API说明

Unity的Camera组件提供可运行时读写的nearClipPlane浮点属性,对应Inspector面板中的Clipping Planes - Near参数,直接赋值即可修改近裁剪面距离。

原代码问题修正点

  • 列表初始化需要补充构造函数括号:new List<Transform>()、new List<float>()
  • 将需要跨方法访问的变量(节点列表、相机引用)提到类层级定义,避免作用域限制导致无法访问
  • 用Unity原生GetComponentsInChildren<Transform>()获取子节点,注意该方法默认会返回当前物体自身的Transform,可根据需求过滤
  • 数学计算方法需调用Mathf类下的静态方法:开方用Mathf.Sqrt(),取最小值需要自行遍历比对
  • 查找相机的Transform后,需要调用GetComponent<Camera>()拿到相机组件实例才能修改裁剪面参数
  • 距离计算逻辑调整为:计算相机位置到各个节点的距离,而非当前挂载物体到节点的距离
  • 建议在Start()阶段缓存相机组件引用,避免Update()里每帧调用Find产生不必要的性能开销

完整可运行代码

using System.Collections.Generic;
using UnityEngine;

public class NodeManager : MonoBehaviour
{
    [Header("近裁剪面调整参数")]
    public float minNearClip = 0.05f;
    public float defaultNearClip = 0.3f;
    public float adjustThreshold = 10f;
    
    private List<Transform> nodeArray = new List<Transform>();
    private Camera mainCam;

    void Start()
    {
        // 启动时缓存主相机引用
        Transform camOffset = transform.Find("Camera Offset");
        if (camOffset != null)
        {
            Transform camTrans = camOffset.Find("Main Camera");
            if (camTrans != null)
            {
                mainCam = camTrans.GetComponent<Camera>();
            }
        }

        // 收集所有子节点(过滤当前挂载物体自身)
        Transform[] allChildren = GetComponentsInChildren<Transform>();
        foreach (Transform child in allChildren)
        {
            if (child != transform)
            {
                nodeArray.Add(child);
            }
        }
    }

    void Update()
    {
        if (mainCam == null || nodeArray.Count == 0) return;

        float minSqrDistance = float.MaxValue;
        // 遍历所有节点计算到相机的平方距离(比直接算距离性能更好)
        foreach (Transform node in nodeArray)
        {
            float sqrDis = (node.position - mainCam.transform.position).sqrMagnitude;
            if (sqrDis < minSqrDistance)
            {
                minSqrDistance = sqrDis;
            }
        }

        float closestDistance = Mathf.Sqrt(minSqrDistance);
        // 距离小于阈值时动态调整近裁剪面,可根据自己的需求修改映射逻辑
        if (closestDistance < adjustThreshold)
        {
            // 示例逻辑:距离越近近裁剪面越小,避免模型被近裁剪面裁切
            float targetNear = Mathf.Clamp(closestDistance / adjustThreshold * defaultNearClip, minNearClip, defaultNearClip);
            mainCam.nearClipPlane = targetNear;
        }
        else
        {
            // 距离超过阈值恢复默认近裁剪面
            mainCam.nearClipPlane = defaultNearClip;
        }
    }
}

使用说明

  • 将脚本挂载到所有节点的父物体上
  • 可根据实际项目需求在Inspector面板调整近裁剪面的上下限、触发调整的距离阈值
  • 代码中用平方距离做遍历比较,省去不必要的开方运算,运行性能更高
  • 所有查找、获取组件的逻辑都放在启动阶段执行,避免每帧重复调用产生性能浪费

内容的提问来源于stack exchange,提问作者Jonathon Reilly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 21:21:32