少年修仙传客户端代码仓库
client_Wu Xijin
2018-08-13 eda22bcd9683f3a94e0744da60d23808272c627f
UI/Common/UI3DModelFactory.cs
@@ -1,291 +1,291 @@
using UnityEngine;
using TableConfig;
using System.Collections.Generic;
using System;
public class UI3DModelFactory
{
    static UI3DModelFactory()
    {
        GlobalTimeEvent.Instance.minuteEvent += OnPerMinute;
    }
    static Dictionary<int, GameObject> jobModels = new Dictionary<int, GameObject>();
    public static void LoadCreateRole(int job, Action<bool, UnityEngine.Object> _callBack)
    {
        if (jobModels.ContainsKey(job))
        {
            if (_callBack != null)
            {
                _callBack(true, jobModels[job]);
            }
            return;
        }
        Action<bool, UnityEngine.Object> assetCallBack = (bool _ok, UnityEngine.Object _asset) =>
        {
            GameObject instance = null;
            if (_ok)
            {
                instance = GameObject.Instantiate(_asset) as GameObject;
                if (instance != null)
                {
                    jobModels[job] = instance;
                }
            }
            if (_callBack != null)
            {
                _callBack(_ok && instance != null, instance);
            }
        };
        InstanceResourcesLoader.LoadCreateRole(job, assetCallBack);
    }
    public static void ReleaseCreateRole(int job)
    {
        if (jobModels.ContainsKey(job))
        {
            jobModels[job].gameObject.SetActive(false);
        }
    }
    public static void ClearCreateRole()
    {
        jobModels.Clear();
        if (!AssetSource.mobFromEditor)
        {
            AssetBundleUtility.Instance.UnloadAssetBundle("mob/createrole", true, false);
        }
    }
    public static GameObject LoadUINPC(int id)
    {
        var config = ConfigManager.Instance.GetTemplate<NPCConfig>(id);
        var model = GameObjectPoolManager.Instance.RequestNpcGameObject(id);
        if (!model && config.NPCType == (int)E_NpcType.Func)
        {
            model = GameObjectPoolManager.Instance.RequestDefaultFuncNpc();
        }
        if (!model)
        {
            return null;
        }
        var animator = model.GetComponent<Animator>();
        if (animator != null)
        {
            animator.enabled = true;
            animator.SetInteger(GAStaticDefine.Param_Action, GAStaticDefine.Act_Idle);
            animator.Play(GAStaticDefine.State_IdleHash);
        }
        LayerUtility.SetLayer(model, LayerUtility.Monster, true);
        return model;
    }
    public static void ReleaseUINPC(int id, GameObject model)
    {
        var animator = model.GetComponent<Animator>();
        if (animator != null)
        {
            animator.enabled = false;
        }
        var prefab = InstanceResourcesLoader.LoadNpcPrefab(id);
        if (prefab)
        {
            GameObjectPoolManager.Instance.ReleaseGameObject(prefab, model);
        }
        else
        {
            GameObjectPoolManager.Instance.ReleaseDefaultFuncNPC(model);
        }
    }
    public static GameObject LoadUIHorse(int id)
    {
        var prefab = InstanceResourcesLoader.LoadModelRes(id);
        if (prefab == null)
        {
            return null;
        }
        var pool = GameObjectPoolManager.Instance.RequestPool(prefab);
        var model = pool.Request();
        var animator = model.GetComponent<Animator>();
        if (animator != null)
        {
            animator.enabled = true;
            animator.SetInteger(GAStaticDefine.Param_Action, GAStaticDefine.Act_Idle);
            animator.Play(GAStaticDefine.State_IdleHash);
        }
        return model;
    }
    public static void ReleaseUIHourse(int id, GameObject model)
    {
        var prefab = InstanceResourcesLoader.LoadModelRes(id);
        var pool = GameObjectPoolManager.Instance.RequestPool(prefab);
        var animator = model.GetComponent<Animator>();
        if (animator != null)
        {
            animator.enabled = false;
        }
        pool.Release(model);
    }
    static Dictionary<int, GameObject> treasureModels = new Dictionary<int, GameObject>();
    static Dictionary<int, DateTime> treasureModelReleaseTimes = new Dictionary<int, DateTime>();
    public static GameObject LoadUITreasure(int _id)
    {
        GameObject instance = null;
        if (treasureModels.ContainsKey(_id))
        {
            instance = treasureModels[_id];
            if (instance == null)
            {
                treasureModels.Remove(_id);
            }
        }
        if (instance == null)
        {
            var config = ConfigManager.Instance.GetTemplate<TreasureConfig>(_id);
            var prefab = UILoader.LoadPrefab(config.Model);
            instance = GameObject.Instantiate(prefab);
            treasureModels[_id] = instance;
            UILoader.UnLoadPrefab(config.Model);
        }
        var animator = instance.GetComponent<Animator>();
        if (animator != null)
        {
            animator.enabled = true;
        }
        LayerUtility.SetLayer(instance, LayerUtility.UILayer, true);
        if (treasureModelReleaseTimes.ContainsKey(_id))
        {
            treasureModelReleaseTimes.Remove(_id);
        }
        return instance;
    }
    public static void ReleaseUITreasure(int _id, GameObject _model)
    {
        treasureModelReleaseTimes[_id] = DateTime.Now;
        var animator = _model.GetComponent<Animator>();
        if (animator != null)
        {
            animator.enabled = false;
        }
        _model.SetActive(false);
    }
    private static void OnPerMinute()
    {
        var keys = new List<int>(treasureModelReleaseTimes.Keys);
        for (int i = 0; i < keys.Count; i++)
        {
            var key = keys[i];
            var releaseTime = treasureModelReleaseTimes[key];
            if ((DateTime.Now - releaseTime).TotalSeconds > Constants.UnUsedRes_Unload_Delay)
            {
                if (treasureModels.ContainsKey(key))
                {
                    var model = treasureModels[key];
                    treasureModels.Remove(key);
                    if (model != null)
                    {
                        GameObject.Destroy(model);
                    }
                }
            }
        }
    }
    public static GameObject LoadUIGodWeapon(int _type)
    {
        var prefab = UILoader.LoadPrefab(GeneralConfig.Instance.godWeaponMobs[_type]);
        var pool = GameObjectPoolManager.Instance.RequestPool(prefab);
        var model = pool.Request();
        var animator = model.GetComponent<Animator>();
        if (animator != null)
        {
            animator.enabled = true;
        }
        LayerUtility.SetLayer(model, LayerUtility.UILayer, true);
        return model;
    }
    public static void ReleaseUIGodWeapon(int _type, GameObject _model)
    {
        if (!GameObjectPoolManager.IsValid())
        {
            return;
        }
        if (!GeneralConfig.Instance.godWeaponMobs.ContainsKey(_type))
        {
            return;
        }
        var prefab = UILoader.LoadPrefab(GeneralConfig.Instance.godWeaponMobs[_type]);
        var pool = GameObjectPoolManager.Instance.RequestPool(prefab);
        var animator = _model.GetComponent<Animator>();
        if (animator != null)
        {
            animator.enabled = false;
        }
        pool.Release(_model);
    }
    public static GameObject LoadUIWing(int _id)
    {
        var prefab = InstanceResourcesLoader.LoadModelRes(_id);
        if (prefab == null)
        {
            return null;
        }
        var pool = GameObjectPoolManager.Instance.RequestPool(prefab);
        var model = pool.Request();
        var animator = model.GetComponent<Animator>();
        if (animator != null)
        {
            animator.enabled = true;
        }
        return model;
    }
    public static void ReleaseUIWing(int _id, GameObject _model)
    {
        var prefab = InstanceResourcesLoader.LoadModelRes(_id);
        var pool = GameObjectPoolManager.Instance.RequestPool(prefab);
        var animator = _model.GetComponent<Animator>();
        if (animator != null)
        {
            animator.enabled = false;
        }
        pool.Release(_model);
    }
}
using UnityEngine;
using TableConfig;
using System.Collections.Generic;
using System;
public class UI3DModelFactory
{
    static UI3DModelFactory()
    {
        GlobalTimeEvent.Instance.minuteEvent += OnPerMinute;
    }
    static Dictionary<int, GameObject> jobModels = new Dictionary<int, GameObject>();
    public static void LoadCreateRole(int job, Action<bool, UnityEngine.Object> _callBack)
    {
        if (jobModels.ContainsKey(job))
        {
            if (_callBack != null)
            {
                _callBack(true, jobModels[job]);
            }
            return;
        }
        Action<bool, UnityEngine.Object> assetCallBack = (bool _ok, UnityEngine.Object _asset) =>
        {
            GameObject instance = null;
            if (_ok)
            {
                instance = GameObject.Instantiate(_asset) as GameObject;
                if (instance != null)
                {
                    jobModels[job] = instance;
                }
            }
            if (_callBack != null)
            {
                _callBack(_ok && instance != null, instance);
            }
        };
        InstanceResourcesLoader.LoadCreateRole(job, assetCallBack);
    }
    public static void ReleaseCreateRole(int job)
    {
        if (jobModels.ContainsKey(job))
        {
            jobModels[job].gameObject.SetActive(false);
        }
    }
    public static void ClearCreateRole()
    {
        jobModels.Clear();
        if (!AssetSource.mobFromEditor)
        {
            AssetBundleUtility.Instance.UnloadAssetBundle("mob/createrole", true, false);
        }
    }
    public static GameObject LoadUINPC(int id)
    {
        var config = ConfigManager.Instance.GetTemplate<NPCConfig>(id);
        var model = GameObjectPoolManager.Instance.RequestNpcGameObject(id);
        if (!model && config.NPCType == (int)E_NpcType.Func)
        {
            model = GameObjectPoolManager.Instance.RequestDefaultFuncNpc();
        }
        if (!model)
        {
            return null;
        }
        var animator = model.GetComponent<Animator>();
        if (animator != null)
        {
            animator.enabled = true;
            animator.SetInteger(GAStaticDefine.Param_Action, GAStaticDefine.Act_Idle);
            animator.Play(GAStaticDefine.State_IdleHash);
        }
        LayerUtility.SetLayer(model, LayerUtility.Monster, true);
        return model;
    }
    public static void ReleaseUINPC(int id, GameObject model)
    {
        var animator = model.GetComponent<Animator>();
        if (animator != null)
        {
            animator.enabled = false;
        }
        var prefab = InstanceResourcesLoader.LoadNpcPrefab(id);
        if (prefab)
        {
            GameObjectPoolManager.Instance.ReleaseGameObject(prefab, model);
        }
        else
        {
            GameObjectPoolManager.Instance.ReleaseDefaultFuncNPC(model);
        }
    }
    public static GameObject LoadUIHorse(int id)
    {
        var prefab = InstanceResourcesLoader.LoadModelRes(id);
        if (prefab == null)
        {
            return null;
        }
        var pool = GameObjectPoolManager.Instance.RequestPool(prefab);
        var model = pool.Request();
        var animator = model.GetComponent<Animator>();
        if (animator != null)
        {
            animator.enabled = true;
            animator.SetInteger(GAStaticDefine.Param_Action, GAStaticDefine.Act_Idle);
            animator.Play(GAStaticDefine.State_IdleHash);
        }
        return model;
    }
    public static void ReleaseUIHourse(int id, GameObject model)
    {
        var prefab = InstanceResourcesLoader.LoadModelRes(id);
        var pool = GameObjectPoolManager.Instance.RequestPool(prefab);
        var animator = model.GetComponent<Animator>();
        if (animator != null)
        {
            animator.enabled = false;
        }
        pool.Release(model);
    }
    static Dictionary<int, GameObject> treasureModels = new Dictionary<int, GameObject>();
    static Dictionary<int, DateTime> treasureModelReleaseTimes = new Dictionary<int, DateTime>();
    public static GameObject LoadUITreasure(int _id)
    {
        GameObject instance = null;
        if (treasureModels.ContainsKey(_id))
        {
            instance = treasureModels[_id];
            if (instance == null)
            {
                treasureModels.Remove(_id);
            }
        }
        if (instance == null)
        {
            var config = ConfigManager.Instance.GetTemplate<TreasureConfig>(_id);
            var prefab = UILoader.LoadPrefab(config.Model);
            instance = GameObject.Instantiate(prefab);
            treasureModels[_id] = instance;
            UILoader.UnLoadPrefab(config.Model);
        }
        var animator = instance.GetComponent<Animator>();
        if (animator != null)
        {
            animator.enabled = true;
        }
        LayerUtility.SetLayer(instance, LayerUtility.UILayer, true);
        if (treasureModelReleaseTimes.ContainsKey(_id))
        {
            treasureModelReleaseTimes.Remove(_id);
        }
        return instance;
    }
    public static void ReleaseUITreasure(int _id, GameObject _model)
    {
        treasureModelReleaseTimes[_id] = DateTime.Now;
        var animator = _model.GetComponent<Animator>();
        if (animator != null)
        {
            animator.enabled = false;
        }
        _model.SetActive(false);
    }
    private static void OnPerMinute()
    {
        var keys = new List<int>(treasureModelReleaseTimes.Keys);
        for (int i = 0; i < keys.Count; i++)
        {
            var key = keys[i];
            var releaseTime = treasureModelReleaseTimes[key];
            if ((DateTime.Now - releaseTime).TotalSeconds > Constants.UnUsedRes_Unload_Delay)
            {
                if (treasureModels.ContainsKey(key))
                {
                    var model = treasureModels[key];
                    treasureModels.Remove(key);
                    if (model != null)
                    {
                        GameObject.Destroy(model);
                    }
                }
            }
        }
    }
    public static GameObject LoadUIGodWeapon(int _type)
    {
        var prefab = UILoader.LoadPrefab(GeneralConfig.Instance.godWeaponMobs[_type]);
        var pool = GameObjectPoolManager.Instance.RequestPool(prefab);
        var model = pool.Request();
        var animator = model.GetComponent<Animator>();
        if (animator != null)
        {
            animator.enabled = true;
        }
        LayerUtility.SetLayer(model, LayerUtility.UILayer, true);
        return model;
    }
    public static void ReleaseUIGodWeapon(int _type, GameObject _model)
    {
        if (!GameObjectPoolManager.IsValid())
        {
            return;
        }
        if (!GeneralConfig.Instance.godWeaponMobs.ContainsKey(_type))
        {
            return;
        }
        var prefab = UILoader.LoadPrefab(GeneralConfig.Instance.godWeaponMobs[_type]);
        var pool = GameObjectPoolManager.Instance.RequestPool(prefab);
        var animator = _model.GetComponent<Animator>();
        if (animator != null)
        {
            animator.enabled = false;
        }
        pool.Release(_model);
    }
    public static GameObject LoadUIWing(int _id)
    {
        var prefab = InstanceResourcesLoader.LoadModelRes(_id);
        if (prefab == null)
        {
            return null;
        }
        var pool = GameObjectPoolManager.Instance.RequestPool(prefab);
        var model = pool.Request();
        var animator = model.GetComponent<Animator>();
        if (animator != null)
        {
            animator.enabled = true;
        }
        return model;
    }
    public static void ReleaseUIWing(int _id, GameObject _model)
    {
        var prefab = InstanceResourcesLoader.LoadModelRes(_id);
        var pool = GameObjectPoolManager.Instance.RequestPool(prefab);
        var animator = _model.GetComponent<Animator>();
        if (animator != null)
        {
            animator.enabled = false;
        }
        pool.Release(_model);
    }
}