デバッグ機能
https://gyazo.com/ea38e8d40023a4d62a667463b859b1d4
1. 基幹部分&ドロップダウン
◆ 欲しい機能
ドロップダウンで複数の選択肢から設定
画面上部タップでメニュー表示
メニュー表示時にゲーム一時停止
メニュー表示時にタイトル、現在値を表示(ドロップダウンも現在値の値に)
メニュー内で値を設定後確認ボタンを押すと、値を設定しなおしてシーンを再読み込み
メニュー内でキャンセルボタンを押すとメニュー非表示
◆ デバッグ対象
code:PlayerStatus.cs
public class PlayerStatus
{
public static class CurrentScenario {
public static string title = "現在シナリオ";
public static DebugItem.Input input = DebugItem.Input.Dropdown;
public static string[] optionList = Scenario.GetStringList();
public static Scenario.SCENARIO Get() {
return Scenario.GetFromInt(PlayerPrefs.GetInt("CurrentScenario", 0));
}
public static void Set(Scenario.SCENARIO scenario) {
PlayerPrefs.SetInt("CurrentScenario", Scenario.GetInt(scenario));
}
}
}
◆ タイプとSorting Orderを登録
code:App.cs
namespace App
{
public static class DebugMenu {
public const TextAnchor GUIDETEXT_POSITION = TextAnchor.UpperRight;
public const RenderMode BUTTON_RENDERMODE = RenderMode.ScreenSpaceOverlay;
public static System.Type[] DebugTypeList = {
typeof(PlayerStatus.CurrentScenario),
};
}
public static class LayerOrder {
public const int DEBUG_BUTTON = 10;
public static int DEBUG_MENU = 100;
}
}
◆ メニューオブジェクト
https://gyazo.com/22da5297a68bd8f0d584841427585b54
ItemGroup下にInstantiateする予定
https://gyazo.com/6290296c13963504e7399eda9539b0dc
https://gyazo.com/fa6a0cf52283f720fd3f6b1dfb417e69
◆ DebugMenu
DebugGroupオブジェクトにアタッチ
public修飾子のついたメソッドはButtonのイベントに登録してる
code:DebugMenu.cs
public class DebugMenu : MonoBehaviour
{
private GameObject menu = null;
private Canvas menuCanvas = null;
private GameObject itemPrefab = null;
private List<GameObject> itemList = new List<GameObject>();
private Transform itemGroup = null;
private Canvas debugButtonCanvas = null;
private void Awake() {
SetItemGroup();
menuCanvas.sortingOrder = App.LayerOrder.DEBUG_MENU;
debugButtonCanvas.sortingOrder = App.LayerOrder.DEBUG_BUTTON;
}
private void SetItemGroup() {
int posY = 200;
foreach (Type type in App.DebugMenu.DebugTypeList)
{
GameObject item = Instantiate(itemPrefab, itemGroup);
item.GetComponent<DebugItem>().Init(type);
itemList.Add(item);
item.GetComponent<RectTransform>().anchoredPosition = new Vector2(0, posY);
posY -= 100;
}
}
public void ShowDebugMenu() {
menu.SetActive(true);
Time.timeScale = 0;
}
public void HideDebugMenu() {
menu.SetActive(false);
Time.timeScale = 1;
}
public void ConfirmDebug() {
itemGroup.BroadcastMessage("Fix", SendMessageOptions.DontRequireReceiver);
SceneManager.LoadScene(SceneManager.GetActiveScene().name);
HideDebugMenu();
}
}
◆ DebugItem
▼ 参考
フィールドの値をTypeから読み取る
Type内にあるメソッドを呼び出す
Dropdownの操作
▼ スクリプト
DebugItemにアタッチ
code:DebugItem.cs
public class DebugItem : MonoBehaviour
{
private Dropdown dropdown = null;
private Toggle chekbox = null;
private InputField textField = null;
private Text title = null;
private Text currentValue = null;
public enum Input { Dropdown, Checkbox, TextField }
private Input input;
private Type group;
public void Init(Type type) {
group = type;
title.text = type.GetField("title").GetValue(null).ToString();
input = (Input)type.GetField("input").GetValue(null);
switch(input) {
case Input.Dropdown:
string[] optionList = (string[])type.GetField("optionList").GetValue(null);
dropdown.AddOptions(new List<string> (optionList));
dropdown.gameObject.SetActive(true);
break;
case Input.Checkbox:
chekbox.gameObject.SetActive(true);
break;
case Input.TextField:
textField.gameObject.SetActive(true);
break;
}
}
private void OnEnable() {
Show();
}
public void Show() {
object groupReturn = GetGroupReturn();
Type returnType = groupReturn.GetType();
string valueString = groupReturn.ToString();
currentValue.text = valueString;
switch(input) {
case Input.Dropdown:
int index = 0;
if(returnType.IsEnum) {
index = (int)Enum.Parse(returnType, valueString);
}
dropdown.value = index;
break;
}
}
public void Fix() {
MethodInfo method = group.GetMethod("Set");
switch(input) {
case Input.Dropdown:
string newValue = dropdown.captionText.text;
int index = dropdown.value;
Type returnType = GetGroupReturn().GetType();
if(returnType.IsEnum)
{
method.Invoke(null, new object[] {Enum.GetValues(returnType).GetValue(index)});
}
break;
}
}
private object GetGroupReturn() {
return group.GetMethod("Get").Invoke(null, null);
}
}