0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Unityでmodalを作る

Posted at

やりたい事、Prefabでモーダルを作っておく。呼ぶだけでモーダルが出るようにする。モーダル側にある閉じるボタンやOK、キャンセルなどはコールバック関数で持ってこれるようにする。

Modal自体はGUIで普通にcanvas上で作ってprefabにしておく。

ModalManagerというクラスがついてる、modalPrefをprefabにしておく。

modal = Instantiate(modalPref).GetComponent<ModalManager>();
modal.onOpen += modalOpen;//モーダル側からのコールバック
modal.onClose += modalClose;//モーダル側からのコールバック

こんな感じにできたら良いなと思いました。

ModalManagerに入れておくと良いのが、

//ModalManager内
public delegate void EventHandler();
public event EventHandler onClose;
public event EventHandler onOpen;

この宣言をしておく、そして、これを親側のクラスにコールバックしたい時は、

//ModalManager内
onOpen();

とかしておく。これをprefab内でクリックなどに結びつけておけば問題ない。

これをするとprefabは追加されるが、うまくいかない部分が出てくる。自分の任意のcanvas内に配置がされない。ので

modal.transform.SetParent(canvas.transform,false);

をする。この時2つ目の値がfalseなのだが、例えばウインドウサイズに合わせてキャンバスのサイズを変えてる場合などに、倍率がおかしくなってしまうのでその機能をオフにしている

次のモーダルの方は、画面いっぱいに広げたいので、

//ModalManager内
public void open()
{
    GetComponent<RectTransform>().anchorMin = Vector2.zero;
    GetComponent<RectTransform>().anchorMax = Vector2.one;
    GetComponent<RectTransform>().offsetMin = Vector2.zero;
    GetComponent<RectTransform>().offsetMax = Vector2.zero;
}

としておく、これで完成です。

//MainManager
modal = Instantiate(modalPref).GetComponent<ModalManager>();
modal.transform.SetParent(canvas.transform,false);
modal.open();
modal.onOpen += modalOpen;
modal.onClose += modalClose;

でモーダル側は

public class ModalManager : MonoBehaviour
{

    public delegate void EventHandler();
    // イベントを宣言
    public event EventHandler onClose;
    public event EventHandler onOpen;


    public void setData()
    {

    }
    
    public void open()
    {
        GetComponent<RectTransform>().anchorMin = Vector2.zero;
        GetComponent<RectTransform>().anchorMax = Vector2.one;
        GetComponent<RectTransform>().offsetMin = Vector2.zero;
        GetComponent<RectTransform>().offsetMax = Vector2.zero;
    }
    public void close()
    {

    }


    public void onClickBG()
    {
        Debug.Log("BG CLICK");
        onOpen();
    }
    public void onClickClose()
    {
        Debug.Log("CLOSE CLICK");
        onClose();
    }

}

publicにしているのでタイトルや本文のデータなどを入れることができる状態にしている。こんな感じの概要でUnityでのモーダルを作れた。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?