Unity预制体实例化异常:原始预制体出现在场景而非仅克隆体
嘿,这个问题我之前踩过坑!咱们来拆解一下问题所在,顺便理清楚预制体的工作逻辑~
为什么会出现原始预制体和克隆体共存的情况?
其实Resources.Load本身只是把Project面板里的预制体模板加载到内存中,不会自动把它放到场景里——出现这个问题大概率是下面两种情况之一:
- 场景里早就有一个手动拖入的CubePrefab实例:有时候不小心把预制体从Project面板拖到Hierarchy里,自己没注意到,代码实例化后就会出现两个。先去Hierarchy面板搜一下CubePrefab,看看是不是有个多余的实例,删掉它试试。
- 代码里误操作了加载后的预制体对象:如果你直接对
Resources.Load返回的对象做场景相关操作(比如设置父物体、修改transform),Unity会偷偷把这个预制体模板实例化到场景里!比如下面这种错误写法:
正确的做法是只对GameObject prefab = Resources.Load<GameObject>("CubePrefab"); // 错误:直接修改加载的预制体对象,导致它被自动实例化到场景 prefab.transform.position = new Vector3(0, 0, 0); // 然后再实例化克隆体,就会有两个了 Instantiate(prefab);Instantiate返回的克隆体做操作,碰都别碰加载出来的预制体模板。
正确的代码写法参考
你应该确保只操作克隆出来的实例,代码示例如下:
// 加载预制体模板(仅内存加载,不进入场景) GameObject cubeTemplate = Resources.Load<GameObject>("CubePrefab"); if (cubeTemplate != null) { // 实例化克隆体到场景中 GameObject playerCube = Instantiate(cubeTemplate); // 只对克隆体做后续操作,比如设置位置、标签等 playerCube.transform.position = new Vector3(0, 1, 0); playerCube.tag = "Player"; } else { Debug.LogError("找不到CubePrefab!请确认它放在Resources文件夹下,路径拼写正确"); }
补充:预制体的核心逻辑再理一遍
预制体是Project面板里的"模板文件",本质是一种资源。Resources.Load是把这个资源加载到内存中供你使用,但不会自动生成场景实例;只有调用Instantiate(),才会基于这个模板在场景里创建一个独立的实例。你另一款预制体没出问题,大概率是没犯上面两个错误~
内容的提问来源于stack exchange,提问作者nflacco




