无法在 Unity 编辑器中加载预制件

Posted

技术标签:

【中文标题】无法在 Unity 编辑器中加载预制件【英文标题】:Can't load prefab in Unity Editor 【发布时间】:2021-01-25 05:51:03 【问题描述】:

我正在尝试在编辑器中的特定位置创建一个 [ExecuteInEditMode] 脚本生成游戏对象(链接到同一个预制件),这样我就可以通过在检查器中触发布尔值来快速创建不同的六边形瓷砖贴图。但是,即使路径正确,Resources.Load() 方法也找不到预制件,因此出现以下错误:

NullReferenceException:对象引用未设置为对象的实例。

代码如下:

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;

[ExecuteInEditMode]
public class PositionChecker : MonoBehaviour

    [SerializeField] float tileGap = 1.5f;
    [SerializeField] GameObject tilePrefab; // alternatively tried dragging the prefab in the field in the inspector - it worked

    [SerializeField] bool tileUpLeft;

    GameObject tilesParent;

    private void Awake()
    
        tilesParent = GameObject.Find("All Tiles");
        tilePrefab = Resources.Load("Assets/Prefabs/Tile.prefab") as GameObject;
    

    // Update is called once per frame
    void Update()
    
        CheckForCreateTile();
    

    private void CheckForCreateTile()
    
        if (tileUpLeft)
           
            tileUpLeft = false;
            InstantiateTilePrefab(new Vector3(transform.position.x - 0.6f * tileGap, transform.position.y, transform.position.z - tileGap));
        
    

    private void InstantiateTilePrefab(Vector3 vector3)
    
        GameObject newTile = PrefabUtility.InstantiatePrefab(tilePrefab, tilesParent.transform) as GameObject;
        Debug.Log(tilePrefab); // null
        Debug.Log(tilesParent); // ok
        Debug.Log(newTile); // Null
        newTile.transform.position = vector3;
    




如果我在检查器中手动将预制件拖到每个创建的图块的序列化字段上,而不是尝试加载它,那么一切正常。

【问题讨论】:

【参考方案1】:

资产必须位于“资源”文件夹中。因此,要解决您的问题,您可以将“Tile.prefab”放入文件夹“Assets/Resources”并使用相对路径:Resources.Load("Tile.prefab");

https://docs.unity3d.com/ScriptReference/Resources.Load.html

【讨论】:

感谢您提及!我创建了“资源”文件夹,将资产移到那里并将路径更改为“Tile.prefab”。但是,它仍然不起作用 - 实例化 Tile 后 tilePrefab 仍然是 None (GameObject)。有什么想法还有什么问题吗?提前致谢! 我认为这可能与 Tile.prefab 在 tilePrefab 中引用自己的事实有关 是的,终于通过将实例化方法提取到场景中一个空的“管理器”游戏对象来实现它。【参考方案2】:

文件路径字符串自动以“Resources/”开头。所以你不应该输入那个。另外我不认为统一喜欢字符串中的文件类型,所以不要输入那个。这对我有用:

GameObject tilePrefab;
tilePrefab = Resources.Load<GameObject>("Prefabs/Tile");

GameObject tile = Instantiate(tilePrefab, Vector3.zero, Quaternion.identity);

【讨论】:

以上是关于无法在 Unity 编辑器中加载预制件的主要内容,如果未能解决你的问题,请参考以下文章

Unity在编辑器模式下修改预制体

无法在 SharePoint 页面中加载 Web 部件

unity实用技能unity编辑器工具之加载预制(Prefab)和场景(Scene)

在 Unity 中,通过编辑器删除另一个组件时,如何通过脚本删除一个组件?

unity编辑器扩展一批量生成图片预制

场景在 Unity 中加载但无法加载场景 Android