背景
デジゲー博に展示して試遊してる様子を見て気づいたんですが、押させたい場所にポップを表示させるだけでは人は押してくれませんでした(見ててまじかよと思った)。
そこで、押させたい場所しか押せない仕組みが必須と分かり実装してみました。
概要
UIで押させたいボタンだけフォーカスさせる実装方法
— アズマゴロー@デジゲー博B-03a (@azumagoro) November 24, 2019
①Stopper用Canvas(+Image)を通常のUIのCanvasより前に表示させる
②押させたいボタンにAddComponentで動的にCanvasを追加し、SortOrderをStopperCanvasより前に表示させる。
③するとUIのレイヤー関係を壊さずに最前面に表示できる。 pic.twitter.com/TRnADbzk1L
コードとか
StopperController.cs
usingUnityEngine;publicclassStopperController:MonoBehaviour{[SerializeField]privateCanvas_stopperCanvas;publicstaticStopperControllerInstance;privatevoidAwake(){Instance=this;}publicvoidFocus(GameObjectgo){_stopperCanvas.gameObject.SetActive(true);varcanvas=go.AddComponent<Canvas>();// ここtrueにしてからでないとsortingOrderの値を変更できない!canvas.overrideSorting=true;canvas.sortingOrder=_stopperCanvas.sortingOrder+1;canvas.renderMode=RenderMode.ScreenSpaceOverlay;}publicvoidRemoveFocus(GameObjectgo){varcanvas=go.GetComponent<Canvas>();if(canvas!=null){Object.Destroy(canvas);}_stopperCanvas.gameObject.SetActive(false);}#if UNITY_EDITOR
// 動作テスト用のコードは#if UNITY_EDITORで囲ってビルドに含まれないようにするのをよくやります[SerializeField]privateGameObjecttestGameObject;[ContextMenu("TestFocus")]voidTestFocus(){Focus(testGameObject);}[ContextMenu("TestRemoveFocus")]voidTestRemoveFocus(){RemoveFocus(testGameObject);}#endif
}
StopperCanvas
StopperController
参考になった場合はよろしければいいねお願いします😊
おわり