You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2.9 KiB

UnitySingleton

可以在Editor和Runtime混用的Unity单例模块。稳定可靠懒加载无额外开销任何情况都不会出现多实例化。

GitHub last commit GitHub package.json version openupm

Features

  • 兼容所有场景,稳定可靠的提供一个单例:
    • Editor和Runtime混合使用
    • 中途重新编译脚本
    • 不同的Reload Domain选项
    • 场景切换
    • etc
  • 可以包含子物体基于MonoBehaviour可添加子GameObject
  • 独立于场景单例默认使用HideFlags隐藏不属于任何场景不需要考虑入口场景
  • 可检索可视化窗口检索单例列表Window/bbbirder/Singletons

Basic Usage

只需要继承Singleton<T>

using UnityEngine;
using com.bbbirder.unity;
public class YourComponent:Singleton<YourComponent>{
    protected override void Awake(){
        SayHello();
    }
    public void SayHello(){
        print("hello,world");
    }
}

需要调用的地方

    YourComponent.Instance.SayHello();

通过Window/bbbirder/Singletons窗口查看当前的单例

窗口截图

More Controls

指定实例化时机

[assembly: SingletonAutoLoad(typeof(Manager))]
public class Manager:Singleton<Manager>{ //Manager 将会自动实例化

}

SingletonAutoLoadAttribute接收2个参数

  • 目标单例类型
  • 实例化时机 enum SingletonCreateCondition
    • LazyLoad 懒加载通过Instance获取时才实例化。无SingletonAutoLoad属性时默认模式
    • DomainReload 即时加载,在脚本开始运行前实例化。SingletonAutoLoad缺省选项
    • EnterPlay 进入播放模式加载

使用形如[assembly:]的特性使得SingletonAutoLoadAttribute在内部检索所有单例类型时消耗小且非常迅速。可以放心的在Runtime环境下使用此模块。

指定销毁时机

public class Manager:Singleton<Manager>{
    public override SingletonDestroyCondition DestroyCondition => SingletonDestroyCondition.ExitEdit;
}

SingletonDestroyCondition 具有以下选项:

  • Never 不自动销毁
  • SceneUnload 场景卸载时
  • ReloadDomain 脚本重加载时 (默认)
  • ExitPlay 切出播放模式时
  • ExitEdit 切出编辑模式时

自定义实例化方法


public class TestSingleton : Singleton<TestSingleton>
{
    protected new static TestSingleton CreateInstance(){
        var go = Singleton<TestSingleton>.CreateInstance();
        go.name += " (Singleton)";
        return go;
    }
}