オンラインゲームの開発フレームワーク02-ETクライアントの起動プロセス分析の高度なETユニティ

著作権:

  • 次のWebサイトで始まるこの記事オリジナル:
  1. ブログパーク「優れた夢のメイカーズムーブメント」空間にします。https://www.cnblogs.com/raymondking123
  2. 優秀な夢メイカーズムーブメント公式ブログます。https://91make.top
  3. 優れたゲーム夢のメーカー文化講演します。https://91make.ke.qq.com
  4. マイクロチャンネル公衆数の「優秀な夢メイカーズムーブメント」:umaketop
  • あなたは転載は自由ですが、完全な著作権表示を含めなければなりません!

すべての起源:Init.cs

  • サンプルシナリオinit.unityを開き、次のようなシーンは、その階層に見つけることができます:
    • 唯一重要なことは、そのコード分析に基づいて、init.csスクリプトにぶら下がっグローバルオブジェクトであるか、の兆候を示しているチュートリアルを見てみることをお奨め(ghithubはリンクを持っています)
    • ここだけで、誰もが気になり、問題の分析に集中したい:最初のインタフェースをロードする方法init.csです

初期インタフェースをロードする方法init.cs:

  • レッスンの分析、UILoadingは、後に図貼付シーケンスコード解析と連動して、実質的にローディングプロセス、最初のシーケンス図である最初のインタフェースを、ロードinit.cs。
シーケンス図ユニティ - >> + INIT:StartAsync初期化 - >> BundleHelper:DownloadBundle()BundleHelper - >> EventSystem:ファイル名を指定して実行(EventIdType.LoadingBegin)EventSystem - >> LoadingBeginEvent_CreateLoadingUI:ファイル名を指定して実行()LoadingBeginEvent_CreateLoadingUI - >> UILoadingFactory:作成()音符の右UILoadingFactoryの:インスタンスUILoadingプリフォーム、および追加UILoadingComponent(更新およびロードの進行状況を表示する)初期 - >> - ユニティ:startAsync
  • 次のように初期のインターフェイスいくつかのステップをロードします:
  1. コールはEventSystem.Run(EventIdType.LoadingBegin)LoadingBeginイベントをトリガ:
public static class BundleHelper
{
	public static async ETTask DownloadBundle()
	{
		if (Define.IsAsync)
		{
			try
			{
				using (BundleDownloaderComponent bundleDownloaderComponent = Game.Scene.AddComponent<BundleDownloaderComponent>())
				{
					await bundleDownloaderComponent.StartAsync();

					Debug.Log("EventIdType.LoadingBegin");
					Game.EventSystem.Run(EventIdType.LoadingBegin);
					
					await bundleDownloaderComponent.DownloadAsync();
				}
				
				Game.EventSystem.Run(EventIdType.LoadingFinish);
				
				Game.Scene.GetComponent<ResourcesComponent>().LoadOneBundle("StreamingAssets");
				ResourcesComponent.AssetBundleManifestObject = (AssetBundleManifest)Game.Scene.GetComponent<ResourcesComponent>().GetAsset("StreamingAssets", "AssetBundleManifest");
			}
			catch (Exception e)
			{
				Log.Error(e);
			}

		}
	}
}
  • ユニティ・エディタ環境でのisAsyncフラグがfalseに設定されているので(VS環境のisAsyncメンバーで選択し、右→概要の定義が表示されている)、それは資源の非同期読み込みが画面をロード見られたので、実際にロード画面は表示されません!
  • 非同期トリガLoadingFinishイベントロード19個の行為を待った後、プロセスはLoadingBeginに似ている、誰かが自分の分析を頼みます!
  1. LoadingBeginイベントハンドラを達成:

     [Event(EventIdType.LoadingBegin)]
     public class LoadingBeginEvent_CreateLoadingUI : AEvent
     {
     	public override void Run()
     	{
     		UI ui = UILoadingFactory.Create();
     		Game.Scene.GetComponent<UIComponent>().Add(ui);
     	}
     }
    

    ここでメソッド定義されたイベントのクラスを習得する必要があることに注意してください:1.クラスのイベントフラグを追加します(特定のイベント型パラメータを記入)このときAEvent 3. 2.から継承された、ETは、自動的にイベントハンドラクラスのクラスとして認識さ(反射による)、およびEventSystem.RunRunメソッドLoadingBeginEvent_CreateLoadingUIイベントクラスの実装と呼ばれています!

  2. コードの6行UILoadingFactory.Create()UILoadingインターフェースを作成する責任は、次のコードは、メモを追加しました:

     public static class UILoadingFactory
     {
     	public static UI Create()
     	{
     		try
     		{
     			// KV是Resources文件夹下存储的本地预制体资源,主要存储一些键值对数据
     			// 从KV加载UIType.UILoading预制体,并实例化UI对象:
     			GameObject bundleGameObject = ((GameObject)ResourcesHelper.Load("KV")).Get<GameObject>(UIType.UILoading);
     			GameObject go = UnityEngine.Object.Instantiate(bundleGameObject);
     			go.layer = LayerMask.NameToLayer(LayerNames.UI);
    
     			// 创建UI这个Entity,并将上面创建的UI对象作为该Entity的图形表示
     			UI ui = ComponentFactory.Create<UI, string, GameObject>(UIType.UILoading, go, false);
    
     			// 添加UILoadingComponent,该组件负责更新loading进度并刷新显示
     			ui.AddComponent<UILoadingComponent>();
     			return ui;
     		}
     		catch (Exception e)
     		{
     			Log.Error(e);
     			return null;
     		}
     	}
     }
    

    説明: - UIクラスは、エンティティ・クラスがあり、エンティティは、間接的にComponentクラスから継承されたが、唯一のエンティティ・クラスがアドオンをすることができ、動作しませんComponentクラス - エンティティとコンポーネント間の関係は、実際にあるデザインパターンCompositeパターン - UIクラスを再利用することができ、ときあなたが長いETの枠組みの中で、UIを作成する場合: - UIの静的ファクトリクラスを追加し、具体的な実施UILoadingFactoryを参照して、静的Createメソッドを定義 - コンポーネントクラスから(植物のための新しいUIコンポーネントを追加します。継承)、およびイベントは、(下記参照するシステムを実装)

  3. システムイベントのコンポーネントを達成し、実装UILoadingComponent:

    • UILoadingコンポーネント
     public class UILoadingComponent : Component
     {
     	public Text text;
     }
    
    • UILoadingイベントシステム:
     [ObjectSystem]
     public class UiLoadingComponentAwakeSystem : AwakeSystem<UILoadingComponent>
     {
     	public override void Awake(UILoadingComponent self)
     	{
     		self.text = self.GetParent<UI>().GameObject.Get<GameObject>("Text").GetComponent<Text>();
     	}
     }
    
     [ObjectSystem]
     public class UiLoadingComponentStartSystem : StartSystem<UILoadingComponent>
     {
     	public override void Start(UILoadingComponent self)
     	{
     		StartAsync(self).Coroutine();
     	}
    
     	public async ETVoid StartAsync(UILoadingComponent self)
     	{
     		TimerComponent timerComponent = Game.Scene.GetComponent<TimerComponent>();
     		long instanceId = self.InstanceId;
     		while (true)
     		{
     			await timerComponent.WaitAsync(1000);
    
     			if (self.InstanceId != instanceId)
     			{
     				return;
     			}
    
     			BundleDownloaderComponent bundleDownloaderComponent = Game.Scene.GetComponent<BundleDownloaderComponent>();
     			if (bundleDownloaderComponent == null)
     			{
     				continue;
     			}
     			self.text.text = $"{bundleDownloaderComponent.Progress}%";
     		}
     	}
     }
    

    定義されたイベントクラスは:1加える[ObjectSystem] XxxSystemクラスから継承、仮想基底クラス実装対応2.フラグ - Unityのイベントクラスと同様の意味は、自身のソースを学習参照します

要約:

  • UILoadingを学習することによって、我々は、ECSとの完全な接触がETオブジェクトがあります。
    • E:エンティティ、対応するUIクラス
    • C:成分、対応するクラスUILoadingComponent
    • S:システム、および対応するUiLoadingComponentAwakeSystemクラスUiLoadingComponentStartSystem

おすすめ

転載: www.cnblogs.com/raymondking123/p/11369623.html
おすすめ