You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动