网站挂百度推广,网站建设方案预算,wordpress降低使用内存,大学生做网站兼职前言 在Unity程序设计过程中#xff0c;我们处理的第一个对象是Application Instance。 它的主要职责是启动流程管理、卸载流程管理#xff0c;次要职责是管理在内部的子系统生命周期。其他职责#xff0c;提供或桥接应用程序的配置信息、及其他第三方接口。 它通常以单例的…前言 在Unity程序设计过程中我们处理的第一个对象是Application Instance。 它的主要职责是启动流程管理、卸载流程管理次要职责是管理在内部的子系统生命周期。其他职责提供或桥接应用程序的配置信息、及其他第三方接口。 它通常以单例的形式存在在场景中即使在切换场景时也不会被删除。
设计需求
可以自定义异步启动流程、或卸载流程App 自动完成子系统的初始化和卸载工作子系统是可轻松扩展的通过App Instance可以轻松访问到子系统实例
UML结构 UML类结构示例 代码示例
// XApplication.Utils.cs
// Create by UniMarknamespace XF
{public interface IApplication {void Startup();void Initialize();void Deinitialize();void Shutdown();}public interface IApplicationSubSystem {int InitializeSequence { get; }void Initialize(XApplication application);void Deinitialize();}
}
// XApplication.cs
// Create by UniMarkusing System;
using System.Collections.Generic;
using UnityEngine;namespace XF
{public sealed class XApplication : MonoBehaviour{private IApplication Application;private IApplicationSubSystem[] ApplicationSubSystems new IApplicationSubSystem[0];private DictionaryType, IApplicationSubSystem QuickReferenceTable;private void Awake (){Debug.Log($启动 [XApplication] 实例 ({gameObject.name}));if ( ( Application GetComponentIApplication() ) null ){throw new Exception(你需要实现IApplication的接口);}ApplicationSubSystems GetAllApplicationSubSystemWithSequence();QuickReferenceTable GetQuickReferenceTableWithAppSubSystem(ApplicationSubSystems);Application.Startup();}private void Start (){if ( ApplicationSubSystems.Length 0 ){Debug.Log(实例化应用内联系统 ...);for ( int index 0; index ApplicationSubSystems.Length; index ){var subSystem ApplicationSubSystems[index];var time Time.time;subSystem.Initialize(this);Debug.Log($释放: {subSystem.GetType().Name} 耗时 {( Time.time - time ).ToString({0.000})}s);}}if ( Application ! null ){Debug.Log(实例化应用 ...);Application?.Initialize();}}private void OnDestroy (){if ( Application ! null ){Debug.Log(释放应用 ...);Application?.Deinitialize();}if ( ApplicationSubSystems.Length 0 ){Debug.Log(释放应用内联系统 ...); for ( int index ApplicationSubSystems.Length - 1; index 0; index-- ){var subSystem ApplicationSubSystems[index];var time Time.time;subSystem.Deinitialize();Debug.Log($释放: {subSystem.GetType().Name} 耗时 {(Time.time - time).ToString({0.000})}s);}}Debug.Log($关闭 [XApplication] 实例 ({gameObject.name}));Application.Shutdown();Application null;ApplicationSubSystems null;QuickReferenceTable null;}private IApplicationSubSystem[] GetAllApplicationSubSystemWithSequence (){var list new ListIApplicationSubSystem();GetComponentsInChildren(true, list);list.Sort(( a, b ) a.InitializeSequence.CompareTo(b.InitializeSequence));return list.ToArray();}private DictionaryType, IApplicationSubSystem GetQuickReferenceTableWithAppSubSystem ( IApplicationSubSystem[] systems ){DictionaryType, IApplicationSubSystem result new DictionaryType, IApplicationSubSystem();foreach ( var system in systems ){if ( false result.TryAdd(system.GetType(), system) ){throw new Exception($包含相同类型的子系统 {system.GetType().Name});}}return result;}#region APIpublic T GetSubSystemT () where T : MonoBehaviour, IApplicationSubSystem{if ( QuickReferenceTable.TryGetValue(typeof(T), out var system) ){return system as T;}throw new Exception($不存在的子系统 {typeof(T).Name});}#endregion}
}
// XGame.cs
// Create by UniMarkusing System;
using UnityEngine;
using XF;public abstract class XGameT : MonoBehaviour, IApplicationwhere T : XGameT
{public static T Instance{get; private set;}public XApplication Owner{get; private set;}// 定义你自己的系统在这里 public TestSubSystem TestSystem { get; private set; }void IApplication.Startup (){if ( Instance ! null ){throw new Exception($[{gameObject.name}]{this.GetType().Name}类存在多实例异常!);}Instance this as T;GameObject.DontDestroyOnLoad(gameObject);Owner GetComponentXApplication();// 初始化你的系统在这里TestSystem Owner.GetSubSystemTestSubSystem();}void IApplication.Shutdown (){Instance null;Owner null;// 释放你的系统在这里TestSystem null;}void IApplication.Initialize () StartGame();void IApplication.Deinitialize () QuitGame();protected abstract void StartGame ();protected abstract void QuitGame ();
}// GameIns.cs
// Create by UniMarkusing UnityEngine;
using XF;public class GameIns : XGameGameIns
{#region 生命周期protected override async void StartGame (){// 加载配置文件 // await 配置文件加载完毕// 做个测试var testSystem Owner.GetSubSystemTestSubSystem ();Debug.Log(testSystem.GetMessage());// 进入第一个场景}protected override void QuitGame (){// 在这里卸载业务载入的资源和数据}#endregion
}// TestSubSystem.cs
// Create by UniMarkusing UnityEngine;namespace XF
{#region 非正式代码public class TestSubSystem : MonoBehaviour, IApplicationSubSystem{[SerializeField]private int InitializeSequence;int IApplicationSubSystem.InitializeSequence InitializeSequence;private XApplication Owner;void IApplicationSubSystem.Initialize ( XApplication application ){Owner application;}void IApplicationSubSystem.Deinitialize (){Owner null;}public string GetMessage (){return Hello Here!;}}#endregion
}
代码组织结构 -| Scripts --| Core ---| SubSystems ---- TestSubSystem.cs --- XApplication.cs --- XApplication.Utils.cs --- XGame.cs -- GameIns.cs 创建应用程序预制体 预制体组织结构 XApplication 节点 TestSubSystem 节点 下载代码示例 下载demo