查看: 76|回复: 1

[简易教程] unity不想创建对象挂脚本实现单例模式

[复制链接]

393

主题

73

听众

3767

积分

头头

Rank: 12Rank: 12Rank: 12

发表于 2019-9-5 10:54 |显示全部楼层
共享资源获取更多积分!share your resources get more credits!
  1. using UnityEngine;

  2. /// <summary>
  3. /// Inherit from this base class to create a singleton.
  4. /// e.g. public class MyClassName : Singleton<MyClassName> {}
  5. /// </summary>
  6. public class Singleton<T> : MonoBehaviour where T : MonoBehaviour
  7. {
  8.     // Check to see if we're about to be destroyed.
  9.     private static bool m_ShuttingDown = false;
  10.     private static object m_Lock = new object();
  11.     private static T m_Instance;

  12.     /// <summary>
  13.     /// Access singleton instance through this propriety.
  14.     /// </summary>
  15.     public static T Instance
  16.     {
  17.         get
  18.         {
  19.             if (m_ShuttingDown)
  20.             {
  21.                 Debug.LogWarning("[Singleton] Instance '" + typeof(T) +
  22.                     "' already destroyed. Returning null.");
  23.                 return null;
  24.             }

  25.             lock (m_Lock)
  26.             {
  27.                 if (m_Instance == null)
  28.                 {
  29.                     // Search for existing instance.
  30.                     m_Instance = (T)FindObjectOfType(typeof(T));

  31.                     // Create new instance if one doesn't already exist.
  32.                     if (m_Instance == null)
  33.                     {
  34.                         // Need to create a new GameObject to attach the singleton to.
  35.                         var singletonObject = new GameObject();
  36.                         m_Instance = singletonObject.AddComponent<T>();
  37.                         singletonObject.name = typeof(T).ToString() + " (Singleton)";

  38.                         // Make instance persistent.
  39.                         DontDestroyOnLoad(singletonObject);
  40.                     }
  41.                 }

  42.                 return m_Instance;
  43.             }
  44.         }
  45.     }


  46.     private void OnApplicationQuit()
  47.     {
  48.         m_ShuttingDown = true;
  49.     }


  50.     private void OnDestroy()
  51.     {
  52.         m_ShuttingDown = true;
  53.     }
  54. }
复制代码
地址:https://wiki.unity3d.com/index.php/Singleton

其他类public class IAPManager : Singleton<IAPManager>, IStoreListener  继承此类自动初始化 自动销毁对象,免去策划忘记拉对象的尴尬
楼主热帖
人人为我 我为人人 互相分享 互相学习 互相进步 一带一路

393

主题

73

听众

3767

积分

头头

Rank: 12Rank: 12Rank: 12

发表于 2019-9-5 10:56 |显示全部楼层
  1. using UnityEngine;

  2. /// <summary>
  3. /// Inherit from this base class to create a singleton.
  4. /// e.g. public class MyClassName : Singleton<MyClassName> {}
  5. /// </summary>
  6. ///
  7. public class Singleton<T> : MonoBehaviour where T : MonoBehaviour
  8. {
  9.     public bool dontDestroy = false;
  10.     private static T m_instance;

  11.     public static T Instance
  12.     {
  13.         get
  14.         {
  15.             if (m_instance==null)
  16.             {
  17.                 m_instance = GameObject.FindObjectOfType<T>();
  18.                 if (m_instance==null)
  19.                 {
  20.                     GameObject singleton = new GameObject(typeof(T).Name);
  21.                     m_instance = singleton.AddComponent<T>();
  22.                 }
  23.             }

  24.             return m_instance;
  25.         }
  26.     }

  27.     public virtual void Awake()
  28.     {
  29.         if (m_instance==null)
  30.         {
  31.             m_instance = this as T;
  32.             if (dontDestroy)
  33.             {
  34.                 transform.parent = null;
  35.                 DontDestroyOnLoad(this.gameObject);
  36.             }
  37.         }
  38.         else
  39.         {
  40.             Destroy(gameObject);
  41.         }
  42.     }

  43. }
复制代码
人人为我 我为人人 互相分享 互相学习 互相进步 一带一路
回复

使用道具 举报

温馨提示:求助请到“Unity技术讨论”版块中发帖,便于集中解决!
您需要登录后才可以回帖 登录 | 立即注册

懒人模式:

关闭

站长推荐 上一条 /1 下一条

Unity3D游戏开发联盟(资源共享平台) -Unity3D,Unreal ( 苏ICP备12051100号 )   

GMT+8, 2019-9-18 17:48 , Processed in 0.132096 second(s), 43 queries .