如何通过代码获取Unity资源文件夹中Prefab的引用?
获取Unity资源文件夹中Prefab引用的实现方法
你可以通过以下几种方式实现代码获取Unity资源文件夹内Prefab的引用,同时可以封装成类似GetComponent<>()的便捷调用形式:
方法一:Resources文件夹加载(简单场景)
如果你的Prefab放在Resources文件夹或其子目录下,直接用Resources.Load<T>()即可:
// 加载Resources/Prefabs/Enemy.prefab GameObject enemyPrefab = Resources.Load<GameObject>("Prefabs/Enemy");
注意:路径不需要加
.prefab后缀,且Prefab必须在Resources目录下,打包后无法动态添加该目录下的资源。
方法二:Addressable Assets系统(推荐大型项目)
Addressable是Unity官方推荐的资源管理方案,不依赖固定文件夹,支持本地/远程加载:
- 先在Package Manager中安装Addressable Assets包
- 将Prefab标记为Addressable并设置地址
- 通过代码异步加载:
using UnityEngine.AddressableAssets; using UnityEngine.ResourceManagement.AsyncOperations; // 异步加载指定地址的Prefab AsyncOperationHandle<GameObject> loadHandle = Addressables.LoadAssetAsync<GameObject>("EnemyPrefab"); loadHandle.Completed += operation => { if (operation.Status == AsyncOperationStatus.Succeeded) { GameObject enemyPrefab = operation.Result; // 在这里使用Prefab } };
方法三:编辑器模式下加载(仅开发阶段用)
如果是编辑器工具开发,可用AssetDatabase.LoadAssetAtPath<T>()直接通过项目路径加载:
#if UNITY_EDITOR using UnityEditor; // 路径为项目根目录相对路径,比如Assets/Prefabs/Enemy.prefab GameObject enemyPrefab = AssetDatabase.LoadAssetAtPath<GameObject>("Assets/Prefabs/Enemy.prefab"); #endif
该方法仅在编辑器环境生效,打包后无法使用。
封装成类似GetComponent<>()的便捷调用
你可以自己封装静态工具类,简化调用:
using UnityEngine; using UnityEngine.AddressableAssets; using System.Threading.Tasks; public static class PrefabLoader { // 同步加载Resources下的Prefab public static T Load<T>(string resourcePath) where T : Object { return Resources.Load<T>(resourcePath); } // 异步加载Addressable Prefab public static async Task<T> LoadAsync<T>(string addressableKey) where T : Object { var handle = Addressables.LoadAssetAsync<T>(addressableKey); var result = await handle.Task; Addressables.Release(handle); return result; } }
调用示例:
// 同步加载 GameObject enemyPrefab = PrefabLoader.Load<GameObject>("Prefabs/Enemy"); // 异步加载(需在异步方法中调用) GameObject enemyPrefab = await PrefabLoader.LoadAsync<GameObject>("EnemyPrefab");
内容的提问来源于stack exchange,提问作者Jakabi107
相关产品推荐
相关产品推荐

