使用Tag定义Material.SetVector变换时出现空引用异常求助
问题排查与修复
空引用异常的核心原因
- 初始化时机错误:
GameObject.FindWithTag("Character")在字段声明时直接执行,此时场景尚未完成加载,无法找到目标对象,导致character为null,后续访问character.transform触发异常。 - 未做空值校验:
Material m如果未在Inspector面板赋值,调用m.SetVector也会触发空引用异常。
修复后的代码
public Material m; private Transform player; void Start() { // 场景加载完成后再查找目标对象 GameObject character = GameObject.FindWithTag("Character"); if (character != null) { player = character.transform; } } void MoveGrass() { // 先检查所有关键对象是否为空,避免异常 if (m == null || player == null) return; m.SetVector("_PlayerPos", player.position); } private void OnDrawGizmos() { MoveGrass(); } private void Update() { MoveGrass(); }
额外优化建议
- 若目标对象可能动态生成(比如场景切换后重新创建),可以把查找逻辑放到
Update里,但要加判断避免重复查找:void Update() { if (player == null) { GameObject character = GameObject.FindWithTag("Character"); if (character != null) { player = character.transform; } } MoveGrass(); } - 在Inspector面板给
m赋值对应的材质,确保引用有效。
内容的提问来源于stack exchange,提问作者prkash
相关产品推荐
相关产品推荐

