Unity基础之单例:单例脚本、单例模板

目录

1.单件脚本,需提前挂载到场景内

2.自动挂载,跨场景不销毁(尽量不要挂载多个)

3.单例模板类,泛型单例

4.测试


1.单件脚本,需提前挂载到场景内

using UnityEngine;
using System.Collections;

public class SingletonA : MonoBehaviour {
    //第一种单例:单件脚本
    public static SingletonA Instance{get;private set;}
    void Awake()
    {
        Instance = this;
    }
    public  void Test()
    {
        print("SingletonA");    
    }
}

2.自动挂载,跨场景不销毁(尽量不要挂载多个)

using UnityEngine;
/// <summary>
/// singleton 不需要手动拖拽给游戏物体
/// </summary>
public class SingletonB : MonoBehaviour
{
    private static SingletonB instance;
    public static SingletonB Instance
    {
        get
        {
            if (instance == null)
            {
                SingletonB[] sts = FindObjectsOfType<SingletonB>();
                if (sts.Length > 0)
                {
                    for (int i = 0; i < sts.Length; i++)
                    {
                        Debug.LogWarning(sts[i].gameObject.name + " is already Added SingletonB");
                        Destroy(sts[i]);
                    }
                }
                GameObject obj = new GameObject("B");
                instance = obj.AddComponent<SingletonB>();
                DontDestroyOnLoad(obj);//跨场景不销毁游戏物体
            }
            return instance;
        }
    }
    public void Test()
    {
        print("SingletonB");
    }
}

3.单例模板类,泛型单例

using UnityEngine;
using System.Collections;
/// <summary>
/// 单例模板类
/// </summary>
public class Singleton<T> : MonoBehaviour where T : MonoBehaviour
{
    private static T instance;
    public static T Instance
    {
        get
        {
            if (instance == null)
            {
                GameObject obj = new GameObject();
                obj.name = typeof(T).Name + "<Singleton>";
                instance = obj.AddComponent<T>();
                DontDestroyOnLoad(obj);
            }

            return instance;
        }
    }
}

使用方法,例如音乐管理类

using UnityEngine;
using System.Collections;

[RequireComponent(typeof(AudioSource))]//如果没有组件添加组件
public class MusicManager : Singleton<MusicManager>
{
    private AudioSource _audio;//音乐播放器
    private AudioClip music;//背景音乐
    private bool isInitialized;//表示是否初始化
    void Init()
    {
        _audio = GetComponent<AudioSource>();
        music = Resources.Load("bg") as AudioClip;
        _audio.clip = music;
        isInitialized = true;
    }
    public void Play()
    {
        if (!isInitialized)
        {
            Init();
        }
        _audio.Play();
    }
}

4.测试

A需要提前挂载,B和音乐管理类自动生成

using UnityEngine;
using System.Collections;

public class Test : MonoBehaviour {

	void Start () {
        SingletonA.Instance.Test();
        SingletonB.Instance.Test();

        MusicManager.Instance.Play();
	}
}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Jack Yan

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值