まず最初に、このような UIManager クラスを定義する必要があります。
パブリック クラス UIManager
{
UI マネージャーは、名前が示すように、ゲームの UI を管理するために使用する必要があり、ゲームの UI は通常、パネルに分割されています。したがって、UI パネル クラスも必要です。次に、UI マネージャーを通じて UI パネルを管理します。
パブリック クラス UIPanel
{
次に
、辞書を使用して UI マネージャーで UI パネルを管理します。
public class UIManager
{ Dictionary<string, UIPanel>panelDic; public UIManager() { panelDic = new Dictionary<string, UIPanel>(); } }次に、UI パネルにはいくつかの基本属性があります。
たとえば、最も基本的なライフサイクル関数である OnShow、OnHide は、パネルの開閉時に実行される関数です。そして、このパネルに対応するプレハブのリソース パスまたは名前。
パブリック抽象クラス UIPanel
{ プライベート文字列パス; public string Path { get { return path; } }
パブリックゲームオブジェクトルート。
パブリック抽象 void OnShow();
パブリック抽象 void OnHide();
public UIPanel(文字列パス)
{ this.path = パス; }
まず
第一に、このパネル クラスは抽象クラスです。ログイン パネルや登録パネル、その他の UI パネルはそれを継承する必要があるため、このパネル クラス自体はインスタンス化されるべきではないため、抽象クラスであり、次にパスです。は、UI パネルに対応するプレハブのリソース パスです。UI マネージャーを通じてパネルを開くとき、このパスに従ってパネル リソースをロードし、このリソースの参照を取得して、ルートに割り当てる必要があります。はこのプレハブのルート ノードであり、スクリプトはこのオブジェクトを操作できます。次に、開くときと非表示にするときに OnShow メソッドと OnHide メソッドを呼び出します。これら 2 つのメソッドには、特定の達成を記述するためのサブクラスがあります。
それでは次に UIManager を書きましょう。
public class UIManager
{ Transform Canvas; Dictionary<string, UIPanel>panelDic; public UIManager() { Canvas = GameObject.Find("Canvas").transform; GameObjecteventSystem = GameObject.Find("EventSystem"); GameObject.DontDestroyOnLoad(canvas) ); GameObject.DontDestroyOnLoad(eventSystem); panelsDic = new Dictionary<string, UIPanel>(); } }先ほど述べたように、すべての UI パネルを保存するために辞書を使用します。
次に、Unity インターフェイスに Canvas と EventSystem も作成する必要があります。これら 2 つのオブジェクト、前者はすべての UI パネルの親ノードであり、後者は UI イベントを検出します。両方とも存在する必要があります。
次に、シーンを切り替えるときにこれら 2 つのオブジェクトが破壊されないように、これら 2 つのオブジェクトも破壊されないように設定する必要があります。
次に、パネルを開く、パネルを閉じるという 2 つの最も基本的な操作も提供する必要があります。
public class UIManager
{ キャンバスを変換します。 Dictionary<string, UIPanel> パネルDic; public UIManager() { Canvas = GameObject.Find("Canvas").transform; GameObject イベントシステム = GameObject.Find("イベントシステム"); GameObject.DontDestroyOnLoad(キャンバス); GameObject.DontDestroyOnLoad(eventSystem); パネルDic = new Dictionary<string, UIPanel>(); }
public void OpenPanel<T>(T パネル) where T : UIPanel
{
}
public void ClosePanel<T>(T パネル) where T : UIPanel
{
ここでは
、
パネルを閉じたり開いたり、パネルを渡すための汎用インターフェイスを提供しますが、毎回パネル オブジェクトを渡す必要があると面倒なので、パネル クラスを再度拡張します。
パブリック抽象クラス UIPanel
{ プライベート文字列パス; public string Path { get { return path; } }
パブリックゲームオブジェクトルート。
パブリック抽象 void OnShow();
パブリック抽象 void OnHide();
public void OpenPanel() => Singleton<UIManager>.Instance.OpenPanel(this);
public void ClosePanel() => Singleton<UIManager>.Instance.ClosePanel(this);
public UIPanel(文字列パス)
{ this.path = パス; }
このとき、UI マネージャーを通じてパネルを開いたり非表示にしたりする必要はなく、このオブジェクトのメソッドを直接呼び出します。
次に、これら 2 つのメソッドの具体的な実装について説明します。
public class UIManager
{ キャンバスを変換します。 Dictionary<string, UIPanel> パネルDic; public UIManager() { Canvas = GameObject.Find("Canvas").transform; GameObject イベントシステム = GameObject.Find("イベントシステム"); GameObject.DontDestroyOnLoad(キャンバス); GameObject.DontDestroyOnLoad(eventSystem); パネルDic = new Dictionary<string, UIPanel>(); }
public void OpenPanel<T>(T パネル) where T : UIPanel
{ if(panelsDic.TryGetValue(typeof(T).Name,out UIPanel oldPanel)) { oldPanel.root.SetActive(true); oldPanel.OnShow(); } else { GameObject newGO = Singleton<ResourcesManager>.Instance.Load<GameObject>(panel.Path); パネル.ルート = 新しいGO; パネル.ルート名 = パネル.パス; パネル.OnShow(); newGO.transform.SetParent(キャンバス); パネルDic.Add(typeof(T).Name,パネル); } }
public void ClosePanel<T>(T パネル) where T : UIPanel
{ if(panelsDic.TryGetValue(typeof(T).Name,out UIPanel oldPanel)) { oldPanel.root.SetActive(false); } }
}
は実際には非常に簡単です. パネルを開くために、ここでの実装では、まずパネルがディクショナリに存在するかどうかを確認します. 存在する場合は、直接表示され、その OnShow メソッドが呼び出されます。存在しない場合は、リソースはリソース マネージャーからロードされます。その後、OnShow メソッドを呼び出します。閉じるのはさらに簡単で、辞書に存在するかどうかを判断し、存在する場合は非表示にし、存在しない場合は非表示にします。はロジックに問題があります。開くたびに発生するためです。辞書に追加すると、ここでエラーをキャッチできます。おそらく誤操作です。
最後に、前の 2 つの記事の内容が使用されているため、コード全体を完全に投稿します。
public class Singleton<T> where T : new()
{ 静的 T インスタンス; public static T インスタンス { get { if (instance == null) インスタンス = new T(); インスタンスを返します。 } } }
public class ResourcesManager
{ private Dictionary<string, IResource> ressDic; public ResourcesManager() { ressDic = new Dictionary<string, IResource>(); }
public T Load<T>(string path) where T : UnityEngine.Object
{ if (ressDic.TryGetValue(path, out IResource iRes)) return (iRes as Resource<T>).Res; T res = Resources.Load<T>(パス); ressDic.Add(path, new Resource<T>(path, res)); 応答を返します。 } }
パブリック インターフェイス IResource
{
}
public class Resource<T> : IResource
{ public Resource(string path, T res) { this.path = path; this.res = レス; }
プライベート文字列パス。
プライベート T リソース。
パブリック文字列パス { get; パブリック
T Res {取得; }
}
public class UIManager
{ キャンバスを変換します。 Dictionary<string, UIPanel> パネルDic; public UIManager() { Canvas = GameObject.Find("Canvas").transform; GameObject イベントシステム = GameObject.Find("イベントシステム"); GameObject.DontDestroyOnLoad(キャンバス); GameObject.DontDestroyOnLoad(eventSystem); パネルDic = new Dictionary<string, UIPanel>(); }
public void OpenPanel<T>(T パネル) where T : UIPanel
{ if(panelsDic.TryGetValue(typeof(T).Name,out UIPanel oldPanel)) { oldPanel.root.SetActive(true); oldPanel.OnShow(); } else { GameObject newGO = Singleton<ResourcesManager>.Instance.Load<GameObject>(panel.Path); パネル.ルート = 新しいGO; パネル.ルート名 = パネル.パス; パネル.OnShow(); newGO.transform.SetParent(キャンバス); パネルDic.Add(typeof(T).Name,パネル); } }
public void ClosePanel<T>(T パネル) where T : UIPanel
{ if(panelsDic.TryGetValue(typeof(T).Name,out UIPanel oldPanel)) { oldPanel.root.SetActive(false); } }
}
パブリック抽象クラス UIPanel
{ プライベート文字列パス; public string Path { get { return path; } }
パブリックゲームオブジェクトルート。
パブリック抽象 void OnShow();
パブリック抽象 void OnHide();
public void OpenPanel() => Singleton<UIManager>.Instance.OpenPanel(this);
public void ClosePanel() => Singleton<UIManager>.Instance.ClosePanel(this);
public UIPanel(文字列パス)
{ this.path = パス; }
}
著者:Engine Cat https://www.bilibili.com/read/cv12007091?spm_id_from=333.999.0.0 出典:bilibili