やりたい事、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でのモーダルを作れた。