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

Unity:while循环中获取预制体实例化GameObject的Volume值返回0

Unity实例化Cube后获取体积始终为0的解决方法

问题本质

核心问题是生命周期执行顺序和MeshRenderer bounds更新延迟:

  • 实例化Cube时,Test.cs的Awake/OnEnable/Start会在你设置localScale之前执行,此时计算的是预制体原始尺寸的体积;
  • 修改localScale后,MeshRenderer的bounds不会立即同步更新,且你的代码没有重新触发体积计算,所以获取到的还是初始计算的旧值(大概率为0)。

可行解决方案

方案1:手动触发体积计算(最直接)

修改Test.cs,把体积计算逻辑抽成独立方法,在设置scale后手动调用:

// Test.cs
using UnityEngine;

public class Test : MonoBehaviour
{
    public float Volume { get; private set; }
    private MeshRenderer _meshRenderer;

    private void Awake()
    {
        // 提前获取组件引用,避免重复调用开销
        _meshRenderer = GetComponent<MeshRenderer>();
    }

    // 公共方法,供外部触发体积计算
    public void RefreshVolume()
    {
        if (_meshRenderer == null) return;
        Vector3 size = _meshRenderer.bounds.size;
        Volume = size.x * size.y * size.z;
    }
}

在Calculate.cs的MakeButtonClick方法中,设置完localScale后调用该方法:

// Calculate.cs
using UnityEngine;

public class Calculate : MonoBehaviour
{
    public GameObject cubePrefab;

    public void MakeButtonClick()
    {
        int count = 0;
        // 示例循环条件,可替换为你的业务逻辑
        while (count < 3)
        {
            GameObject clone = Instantiate(cubePrefab);
            // 设置目标缩放
            clone.transform.localScale = new Vector3(2f, 2f, 2f);
            
            // 获取组件并刷新体积
            Test testComp = clone.GetComponent<Test>();
            testComp.RefreshVolume();
            
            Debug.Log("Cube体积:" + testComp.Volume);
            count++;
        }
    }
}

方案2:基于原始Mesh尺寸计算(更高效)

如果Cube不会修改Mesh形状,直接用原始Mesh尺寸 × 缩放比例计算体积,无需依赖MeshRenderer的bounds,避免更新延迟:

// Test.cs
using UnityEngine;

public class Test : MonoBehaviour
{
    public float Volume { get; private set; }
    private Vector3 _originalMeshSize;
    private MeshFilter _meshFilter;

    private void Awake()
    {
        _meshFilter = GetComponent<MeshFilter>();
        if (_meshFilter != null && _meshFilter.mesh != null)
        {
            // 保存预制体原始Mesh尺寸,仅初始化一次
            _originalMeshSize = _meshFilter.mesh.bounds.size;
        }
    }

    public void RefreshVolume()
    {
        Vector3 scale = transform.localScale;
        // 原始尺寸与各轴缩放的乘积即为体积
        Volume = _originalMeshSize.x * scale.x * _originalMeshSize.y * scale.y * _originalMeshSize.z * scale.z;
    }
}

Calculate.cs的调用逻辑与方案1完全一致。

额外注意点

  • 确保Cube预制体上的MeshRenderer和MeshFilter组件处于启用状态,否则无法获取正确尺寸;
  • 避免在循环中频繁调用GetComponent,获取一次组件引用后复用可提升性能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 23:17:43