Unity中如何不使用Inspector通过代码初始化预制体数组?
无需手动在Inspector赋值的prefab数组初始化方案
以下是Unity环境下三种常用的实现方案:
方法1:使用
Resources文件夹动态加载(运行时可用)- 在项目
Assets目录下新建名为Resources的文件夹,将所有方块预制体存入该文件夹的子目录中,例如Resources/Blocks - 改写Spawner代码,在生命周期函数中自动加载所有预制体:
public class Spawner : MonoBehaviour { private GameObject[] blocks; private void Awake() { // 加载Resources/Blocks目录下所有GameObject类型的资源 blocks = Resources.LoadAll<GameObject>("Blocks"); } //... }注意:Resources文件夹下的所有资源都会被强制打进包体,无法自动裁剪未使用的资源,适合确定所有预制体都会被用到的场景
- 在项目
方法2:编辑器模式下用
AssetDatabase批量赋值(仅Editor可用,适合提前赋值降低运行时开销)
如果你希望保留序列化的public数组,提前在编辑阶段完成赋值,可以写个轻量Editor工具实现批量填充:#if UNITY_EDITOR using UnityEditor; using UnityEngine; [CustomEditor(typeof(Spawner))] public class SpawnerEditor : Editor { public override void OnInspectorGUI() { base.OnInspectorGUI(); Spawner spawner = (Spawner)target; if (GUILayout.Button("自动加载所有方块预制体")) { // 自行修改路径参数为你的预制体存放路径,例如Assets/Prefabs/Blocks string[] guids = AssetDatabase.FindAssets("t:GameObject", new[] {"Assets/Prefabs/Blocks"}); spawner.blocks = new GameObject[guids.Length]; for (int i = 0; i < guids.Length; i++) { string path = AssetDatabase.GUIDToAssetPath(guids[i]); spawner.blocks[i] = AssetDatabase.LoadAssetAtPath<GameObject>(path); } EditorUtility.SetDirty(spawner); } } } #endif将上述脚本放在项目的
Editor文件夹下,选中Spawner对象后Inspector会多出一个功能按钮,点击即可自动完成数组填充,无需手动拖入资源。方法3:使用Addressables可寻址资源系统(适合千级以上大量资源、有热更需求的场景)
给所有方块预制体打上同一个自定义标签(例如BlockPrefab),运行时通过标签即可批量加载所有对应资源,该方案支持资源热更新,也不会出现Resources文件夹的包体冗余问题。
内容的提问来源于stack exchange,提问作者404 Name Not Found
相关产品推荐
相关产品推荐

