Unity中如何获取BlendShape?代码运行遇NullReferenceException错误
解决Unity获取BlendShape时的NullReferenceException问题
嘿,这个空引用错误我在Unity开发里踩过好多次坑,咱们一步步来排查和解决!
首先,你碰到的NullReferenceException本质是代码里的meshTarget变量没被正确赋值——要么是找不到名为"BlendShapes"的GameObject,要么是这个对象上没挂SkinnedMeshRenderer组件,咱们先从最基础的排查开始:
第一步:排查场景中的基础问题
- 先去Unity场景里确认是否存在**名字完全一致(包括大小写)**的GameObject——Unity的对象名字是大小写敏感的,别把"BlendShapes"写成"blendshapes"或者"Blendshape",差一个字符都找不到!
- 选中这个GameObject,去Inspector面板里检查:有没有挂载
SkinnedMeshRenderer组件?如果没有,右键添加组件→搜索"Skinned Mesh Renderer"挂上。
第二步:用更稳妥的方式获取引用(推荐)
其实Unity开发里,直接在Inspector面板赋值引用是最不容易出错的方式,比用代码查找靠谱多了,修改后的代码如下:
using UnityEngine; public class UnityRecieve : MonoBehaviour { // 用[SerializeField]让private变量也能在Inspector面板显示并赋值 [SerializeField] private SkinnedMeshRenderer meshTarget; void Start() { // 不需要再用Find查找了,直接用编辑器里赋值好的引用 } void Update() { // 操作前先判空,避免空引用报错 if (meshTarget == null) return; // 举个例子:获取第一个BlendShape的权重 float firstShapeWeight = meshTarget.GetBlendShapeWeight(0); Debug.Log("第一个BlendShape的权重:" + firstShapeWeight); // 如果要遍历所有BlendShape的信息: for (int i = 0; i < meshTarget.sharedMesh.blendShapeCount; i++) { string shapeName = meshTarget.sharedMesh.GetBlendShapeName(i); float shapeWeight = meshTarget.GetBlendShapeWeight(i); Debug.Log($"BlendShape [{i}] {shapeName}: {shapeWeight}"); } } }
修改后回到Unity编辑器,选中挂载了这个脚本的对象,在Inspector里找到Mesh Target字段,把带BlendShape的SkinnedMeshRenderer对象拖进去就搞定了。
第三步:如果必须用代码查找,增加错误检测
如果你一定要通过代码动态查找,那一定要加空值判断,这样能明确告诉你哪里出问题,而不是抛出模糊的空引用错误:
using UnityEngine; public class UnityRecieve : MonoBehaviour { private SkinnedMeshRenderer meshTarget; void Start() { // 先查找GameObject GameObject blendShapeObj = GameObject.Find("BlendShapes"); if (blendShapeObj == null) { Debug.LogError("找不到名为BlendShapes的GameObject!请检查场景中的对象名字"); return; } // 再获取组件 meshTarget = blendShapeObj.GetComponent<SkinnedMeshRenderer>(); if (meshTarget == null) { Debug.LogError("BlendShapes对象上没有SkinnedMeshRenderer组件!请添加该组件"); } } void Update() { if (meshTarget == null) return; // 这里写你的BlendShape操作逻辑 } }
额外提醒
- 如果你的BlendShape对象是某个对象的子对象,
GameObject.Find只能查找根对象,这时候可以用transform.Find("子对象的路径"),比如transform.Find("ParentObject/BlendShapes"); - 也可以给BlendShape对象打标签,用
GameObject.FindGameObjectWithTag("你的标签名")来查找,这种方式比名字查找更稳定。
内容的提问来源于stack exchange,提问作者taichi
相关产品推荐
相关产品推荐

