zoukankan      html  css  js  c++  java
  • Unity组件式思想框架 非常好用

    改良了几代版本

    组件式设计思想

    using System;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Entity
    {
        public static Dictionary<Type, object> compDic = new Dictionary<Type, object>();
        
        /// <summary>
        /// 添加组件
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        public static T AddComp<T>() where T : new()
        {
            Type type = typeof (T);
            T t = (T)Activator.CreateInstance(type);
            
            if (!compDic.ContainsKey(type))
            {
                compDic.Add(type, t);
            }
            else
            {
                Debug.LogError("不能重复添加组件");
            }
            
            return t;
        }
        
        /// <summary>
        /// 添加挂在场景中的MonoBehaviour组件脚本
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        public static T AddMonoComp<T>() where T : MonoBehaviour
        {
            Type type = typeof (T);
            T t = UnityEngine.Object.FindObjectOfType<T>();
            if (t == null)
            {
                GameObject go = new GameObject(typeof(T).ToString());
                t = go.AddComponent<T>();
            }
            if (!compDic.ContainsKey(type))
            {
                compDic.Add(type, t);
            }
            else
            {
                Debug.LogError("不能重复添加组件");
            }
    
            return t;
        }
        
        /// <summary>
        /// 获取组件
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        public static T GetComp<T>()
        {
            Type type = typeof (T);
            try
            {
                return (T)compDic[type];
            }
            catch (Exception e)
            {
                Debug.LogError(e);
                throw;
            }
        }
    }
    using System;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class EntityMono : MonoBehaviour
    {
        public Dictionary<Type, object> compDic = new Dictionary<Type, object>();
        
        /// <summary>
        /// 添加组件
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        public T AddComp<T>() where T : new()
        {
            Type type = typeof (T);
            T t = (T)Activator.CreateInstance(type);
            
            if (!compDic.ContainsKey(type))
            {
                compDic.Add(type, t);
            }
            else
            {
                Debug.LogError("不能重复添加组件");
            }
            
            return t;
        }
        
        /// <summary>
        /// 添加挂在场景中的MonoBehaviour组件脚本
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        public T AddMonoComp<T>() where T : MonoBehaviour
        {
            Type type = typeof (T);
            T t = UnityEngine.Object.FindObjectOfType<T>();
            if (t == null)
            {
                GameObject go = new GameObject(typeof(T).ToString());
                t = go.AddComponent<T>();
            }
            if (!compDic.ContainsKey(type))
            {
                compDic.Add(type, t);
            }
            else
            {
                Debug.LogError("不能重复添加组件");
            }
    
            return t;
        }
        
        /// <summary>
        /// 获取组件
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        public T GetComp<T>()
        {
            Type type = typeof (T);
            try
            {
                return (T)compDic[type];
            }
            catch (Exception e)
            {
                Debug.LogError(e);
                throw;
            }
        }
    }

    实例

  • 相关阅读:
    How to resolve mysql problem when you get code 2003(10061) and 1130
    Windows connect to mysql failed: can't get hostname for your address
    Python基础教程总结(二)
    Python基础教程总结(一)
    Begin to study Deep Learning
    再坚持一点点
    技术到管理的必经之路(2)
    技术到管理的必经之路(1)
    c#进阶(7)—— 异步编程基础(async 和 await 关键字)
    c#进阶(6)—— 网络通信基础知识
  • 原文地址:https://www.cnblogs.com/sanyejun/p/12115634.html
Copyright © 2011-2022 走看看