Unity シンプル UI マネージャー

まず最初に、このような 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

 

おすすめ

転載: blog.csdn.net/m0_69824302/article/details/131157522
おすすめ