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
相关产品推荐
相关产品推荐

