Unity小功能分享~预制体库

介绍

在平时开发的时候经常会用到预制体,还会结合Resources在运行时加载预制体,不过使用Resources的方式会把所有放在Resources目录下的东西都打包到build的程序包中,这样就会把测试的内容也打包进去,而且Resources文件夹可以在Assets的任意子目录中不方便管理,这并不是我们想要的。当当当主角登场~预制体库
预制体库继承自ScriptableObject,按本人理解ScriptableObject就像个配置文件,可以被脚本引用使用。它可以替代Resources达到相同的目的。

功能实现

using System.Collections.Generic;
using UnityEngine;
using Sirenix.OdinInspector;
#if UNITY_EDITOR
using UnityEditor;
#endif
namespace ZYF
{
    /*[TypeInfoBox("<color=#4F9F93><size=18>ଘ(੭ˊ꒳​ˋ)੭✧ 预制体库\n" +
     "<color=#FE856F><size=13>ଘ(੭ˊ꒳​ˋ)੭✧ 避免放到Resources</size></color>" +
     "</size></color>")]*/
    public class ZYF_PrefabDictionary : ScriptableObject
    {
        [System.Serializable]
        public class PrefabInfo
        {
            public string key;
            public GameObject prefab;
        }
        [SerializeField, Header("预制体列表")]
        private List<PrefabInfo> prefabList = new List<PrefabInfo>();
        private Dictionary<string, PrefabInfo> _dic;

        public Dictionary<string, PrefabInfo> Dic
        {
            get
            {
                if (_dic == null)
                {
                    _dic = new Dictionary<string, PrefabInfo>();
                    foreach (var item in prefabList)
                    {
                        _dic.Add(item.key, item);
                    }
                }
                return _dic;
            }
        }

        /// <summary>
        ///  获得对应key的预制体
        /// </summary>
        /// <param name="key"></param>
        public T GetPrefab<T>(string key) where T : Object
        {
            if (Dic.ContainsKey(key))
            {
                var info = Dic[key];
                if (info.prefab != null)
                {
                    T prefab = info.prefab.GetComponent<T>();
                    if (prefab != null)
                    {
                        return prefab;
                    }
                    else
                    {
                        Debug.LogError($"预制体 {key} 的期望类型为:({typeof(T).Name}),但找到的预制体不匹配", info.prefab);
                    }
                }
                else
                {
                    Debug.LogError($"预制体{key}丢失", this);
                }
            }
            else
            {
                Debug.LogError($"没有找到预制体:{key}", this);
            }
            return null;
        }





#if UNITY_EDITOR
        [MenuItem("ZYF/ScriptableObjects/PrefabDic")]
        public static void AddMenu()
        {
            SpawnScriptableObject2Project<ZYF_PrefabDictionary>(rename: "预制体库");
        }
#endif
        /// <summary>
        /// 实例化scriptableObject到Project中
        /// </summary>
        /// <param name="sbo"></param>
        public static void SpawnScriptableObject2Project<T>(string rename) where T : ScriptableObject
        {
#if UNITY_EDITOR
            var config = ScriptableObject.CreateInstance<T>();
            string name = string.IsNullOrEmpty(rename) == true ? typeof(T).Name : rename;
            string path = $"Assets/{name}.asset";
            UnityEditor.AssetDatabase.CreateAsset(config, path);
            UnityEditor.Selection.activeObject = config;
#endif
        }
    }

}

食用方法

1.生成配置
AddMenu()会自动在菜单栏添加一个按钮用来生成一个新的配置到Assets文件夹中。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2.引用生成的配置调用GetPrefab即可。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牙膏上的小苏打2333

哟,哟,切克闹,煎饼果子来一套

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值