Unity 2D C# 卡车生成货箱无法正确设置父对象问题求助
问题排查和修复方案
核心问题点如下:
Instantiate调用后未接收返回的新生成实例,你当前代码修改的是场景中原始的crateUpgrade1对象的父级,而非新生成的货箱对象。由于GameObject.Find只会返回场景中第一个匹配名称的对象,因此第一辆卡车绑定了原始货箱后,其余卡车拿到的crateUpgrade1已经是第一辆卡车的子对象,重复设置父级不会生效,也不会生成新的货箱绑定到自身。- 不应该使用
GameObject.Find加载货箱资源,正确做法是将货箱预制体直接赋值到脚本的对应public字段,避免查找误差和性能损耗。 - 当前逻辑会直接修改原始货箱对象的层级,不符合运行时生成对象的规范,也会导致原始资源被意外修改。
修正后的代码
using System.Collections; using System.Collections.Generic; using UnityEngine; public class CarScript : MonoBehaviour { private float speed = 0.01f; private Vector3 dropoffLocation; private bool hasCrates = true; private float dropCratesCooldown = 500f; GameObject cratess; private float crateUpgrade = 1; // 提前在Inspector面板将对应货箱预制体拖入这四个字段,无需代码查找 public GameObject crateUpgrade1; public GameObject crateUpgrade2; public GameObject crateUpgrade3; public GameObject crateUpgrade4; private void Start() { dropoffLocation = new Vector3(3.5f, -7f, 0); // 删除所有GameObject.Find逻辑 if (crateUpgrade == 1) { // 接收生成的新货箱实例,传入transform直接完成父级绑定 GameObject newCrate = Instantiate(crateUpgrade1, transform); // 按需设置货箱相对卡车的坐标 newCrate.transform.localPosition = Vector3.zero; } } // Update is called once per frame void Update() { if (transform.position.x > 40) { Destroy(gameObject); } if (transform.position.x > dropoffLocation.x && hasCrates) { dropCratesCooldown--; if (dropCratesCooldown < 0) { cratess = transform.GetChild(0).gameObject; Destroy(cratess); hasCrates = false; } transform.Translate(0, 0, 0); } else { transform.Translate(speed, 0, 0); } } }
补充注意点
- 直接在
Instantiate的第二个参数传入父对象,生成时直接完成绑定,不需要额外调用transform.parent赋值。 - 后续如果要操作生成的货箱,直接操作生成的实例变量即可,不要修改原始的
crateUpgrade1预制体对象。 - 如果你一定要用场景内的对象作为模板,建议提前将货箱模板设置为禁用状态,避免误操作。
内容的提问来源于stack exchange,提问作者yassin eltaramsi
相关产品推荐
相关产品推荐

