您当前的位置: 首页 >  unity
  • 4浏览

    0关注

    157博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Unity小功能分享~预制体库

牙膏上的小苏打2333 发布时间:2020-12-14 17:13:28 ,浏览量:4

预制体库
  • 介绍
  • 功能实现
  • 食用方法

介绍

在平时开发的时候经常会用到预制体,还会结合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("ଘ(੭ˊ꒳​ˋ)੭✧ 预制体库\n" +
     "ଘ(੭ˊ꒳​ˋ)੭✧ 避免放到Resources" +
     "")]*/
    public class ZYF_PrefabDictionary : ScriptableObject
    {
        [System.Serializable]
        public class PrefabInfo
        {
            public string key;
            public GameObject prefab;
        }
        [SerializeField, Header("预制体列表")]
        private List prefabList = new List();
        private Dictionary _dic;

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

        /// 
        ///  获得对应key的预制体
        /// 
        /// 
        public T GetPrefab(string key) where T : Object
        {
            if (Dic.ContainsKey(key))
            {
                var info = Dic[key];
                if (info.prefab != null)
                {
                    T prefab = info.prefab.GetComponent();
                    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(rename: "预制体库");
        }
#endif
        /// 
        /// 实例化scriptableObject到Project中
        /// 
        /// 
        public static void SpawnScriptableObject2Project(string rename) where T : ScriptableObject
        {
#if UNITY_EDITOR
            var config = ScriptableObject.CreateInstance();
            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即可。

关注
打赏
1664520285
查看更多评论
立即登录/注册

微信扫码登录

0.0694s