【Unity脱出ゲーム】宴のParamTblで数値組み合わせギミックを実装する
今回は、宴のParamTblを利用した数値組み合わせギミックについてです。
宴の公式サイトの解説はこちら
現在開発中の脱出ゲーム部分の
数値を組み合わせで開けるギミックの一部です。
脱出ゲームではよくある機能です。
実現したこと
脱出ゲーム用の仕掛けである
数字組み合わせギミックにおいて、ギミックの答え(数値)、答えの桁数、初期値、
正解時のシナリオ再生用のラベル、ギミックを解いた後の獲得アイテム
上記を宴Excelのみで完結できる作りにしています。
宴のParamTbl活用方法について
簡易的なデータベーステーブルに近い使い方をしています。
宴にはParamシートがありますが、開発中のゲームが変数の数が多いのと
どの機能に紐付いている変数なのかが分かりづらい為、途中からParamTblをシートを増やしスクリプトから呼び出しや更新を行っています。
ScriptableObjectを使う手もありますが、Excel管理は簡単なのと宴のシナリオがExcelなので宴内で完結した方が管理しやすいのがParamTbl採用した理由です。
注意としては、パラメータキーとパラメータは1対1のみで利用する方法となり、
取得と更新はパラメータのみです。
A列がパラメータキーです。
B列以降にパラメータをデータ型と一緒に入力しています。
Answerがギミックの答え、Lengthが入力の桁数、
InitialValueが初期値(ギミック表示時の初期値)、
Answer_Labelは正解したときに、再生される宴のシナリオラベル、
Drop_Item_Numberは、正解時に獲得できるアイテムのIDです。
ExcelのParamTblの設定例です。
ParamTbl読み込み例は以下です。
/// <summary>
/// 数字組み合わせギミックの生成用情報をとるNumericCombinationGimmickTbl{}
/// </summary>
/// <returns>InitialValue(初期値), Length(長さ),TitleText(タイトルテキスト)</returns>
public (string, int, string) NumericCombinationGimmickInitiaInfo(string ID)
//
{
int Length =
Engine.Param.GetParameterInt
("NumericCombinationGimmickTbl[" + ID + "].Length");
string InitialValue =
Engine.Param.GetParameterString("NumericCombinationGimmickTbl[" + ID + "].InitialValue");
string TitleText =
Engine.Param.GetParameterString("NumericCombinationGimmickTbl[" + ID + "].TitleText");
return (InitialValue, Length, TitleText);
}
数字組み合わせギミック本体のスクリプトは以下です。
NumericCombinationGimmickController.txt (8.01kB)
Downloadpublic class NumericCombinationGimmickController : MonoBehaviour
{
[Header("NumericCombinationGimmic親")]
[SerializeField] GameObject NumericCombinationGimmick = default;
[Header("NumericCombinationGimmicのタイトルテキスト")]
[SerializeField] TextMeshProUGUI GimmickTitleText = default;
[Header("出力テキストボックス用_Prefab")]
[SerializeField] GameObject OutPutTextBoxPrefab = default;
[Header("出力テキストボックス用の親オブジェクト")]
[SerializeField] GameObject OutPutTextBoxParentobj = default;
[Header("NumericCombinationGimmic非表示用ボタン")]
[SerializeField] GameObject ButtonDown = default;
[Header("探索矢印右と左")]
[SerializeField] GameObject ButtonRigt = default;
[SerializeField] GameObject ButtonLeft = default;
[Header("入力用のUI")]
[SerializeField] GameObject InPutUI = default;
public static NumericCombinationGimmickController instance;
private void Awake()
{
instance = this;
}
/// <summary>
/// ステージ情報を元にギミックをセットする
/// </summary>
public void SetGimmic()
{
(bool isExist, string ID) =
EscapeParamUtageGet.instance.NumericCombinationGimmickID();
if (isExist == false)
{
Debug.Log("数字組み合わせギミック存在なし" + ID);
return;
}
NumericCombinationGimmick.SetActive(true);
ButtonRigt.SetActive(false); ButtonLeft.SetActive(false);
ButtonDown.SetActive(true);
//初期値と長さとタイトルテキストをget
(string InitialValue, int Length,string TitleText) =
EscapeParamUtageGet.instance.NumericCombinationGimmickInitiaInfo(ID);
Debug.Log("数字組み合わせギミックの情報" +"ID"+ ID +"桁数"+ Length+"初期値"+ InitialValue+"タイトルテキスト"+TitleText);
GimmickTitleText.text = TitleText;
string[] InitialValue_Array = new string[Length];
for (int i =0;i< InitialValue_Array.Length; i++)
{
//左から一文字ずつ取り出す
InitialValue_Array[i] = InitialValue.Substring(i, 1);
Debug.Log(InitialValue_Array[i]);
}
SetOutPutTextBox(InitialValue_Array);
}
/// <summary>
/// テキストボックスを生成し、初期値を設定
/// </summary>
/// <param name="InitialValue_Array"></param>
private void SetOutPutTextBox(string[] InitialValue_Array)
{
GameObject OutPutTextBox;
//表示用テキストボックスを生成
for (int i = 0; i < InitialValue_Array.Length; i++)
{
OutPutTextBox = Instantiate(OutPutTextBoxPrefab, OutPutTextBoxParentobj.transform.position, Quaternion.identity, OutPutTextBoxParentobj.transform);
OutPutTextBox.name = "TextBox" + i;
TextMeshProUGUI textmeshPro = OutPutTextBox.GetComponent<TextMeshProUGUI>();
//初期値を設定
textmeshPro.text = InitialValue_Array[i];
}
}
/// <summary>
/// 数字が押されるとカウントアップ
/// </summary>
public void InputNumber()
{
TextMeshProUGUI OutPutTextBoxTextmeshPro = GetComponent<TextMeshProUGUI>();
int TextNumber = int.Parse(OutPutTextBoxTextmeshPro.text);
//0-9の1桁制御
if (TextNumber == 9)
{
TextNumber = 0;
}
else
{
TextNumber = TextNumber + 1;
}
OutPutTextBoxTextmeshPro.text = TextNumber.ToString();
}
/// <summary>
/// OK押した時に答えをチェック
/// NGならUIを揺らす(transform.DOShakePosition)
/// </summary>
public void CheckAnswer()
{
GameObject[] OutPutTextBox = GameObject.FindGameObjectsWithTag("NumericOutPutText");
StringBuilder input = new StringBuilder("");
for (int i = 0; i < OutPutTextBox.Length; i++)
{
Debug.Log(OutPutTextBox[i].name);
TextMeshProUGUI OutPutTextBoxTextmeshPro = OutPutTextBox[i].GetComponent<TextMeshProUGUI>();
input.Append( OutPutTextBoxTextmeshPro.text);
}
Debug.Log(input+"入力された文字");
//答えを取得
string answer = EscapeParamUtageGet.instance.NumericCombinationGimmickAnswer();
if (input.ToString() == answer) AnswerAfter();
if (input.ToString() != answer)
{
//NGなのでUIを揺らす
InPutUI.transform.DOShakePosition(1f, 3f, 30, 0, false, true);
}
}
/// <summary>
/// 当たった後
/// ①宴にクリアフラグを立てる
/// ②UI消去
/// ③シナリオラベル取得
/// ④シナリオ再生
/// </summary>
private void AnswerAfter()
{
GameObject[] clones = GameObject.FindGameObjectsWithTag("NumericOutPutText");
foreach (GameObject clone in clones)
{
Destroy(clone);
}
ButtonDown.SetActive(false);
NumericCombinationGimmick.SetActive(false);
Destroy(GameObject.FindGameObjectWithTag("NumericCombinationGimmickThis"));
//クリアフラグ
EscapeParamUtageSet.instance.NumericCombinationGimmickClearFlag();
//タップ時のシナリオラベルをとる
string Label = EscapeParamUtageGet.instance.NumericCombinationGimmickAnswerLabel();
//脱出ゲームシステム→宴入れ替え
UtageInput.instance.ChangeSort();
//宴シナリオ呼ぶ(裏でスタートまで進んでポーズ状態であること)
UtageScenarioCall.instance.UtageScenarioPlay(Label);
}
/// <summary>
/// 宴からギミックIDを渡して獲得アイテムを表示
/// </summary>
/// <param name="command">宴のArg</param>
public void DropItemShow(AdvCommandSendMessageByName command)
{
string ID = (command.ParseCellOptional<string>(AdvColumnName.Arg3, "arg3"));
//ギミックIDを元に獲得アイテム情報をget
string itemNumber = EscapeParamUtageGet.instance.NumericCombinationGimmickDropItem(ID);
Debug.Log("獲得アイテム表示idとitemNumber" + ID +","+ itemNumber);
//アセットのファイル名と表示名をとる
(string ShowName, string FileName) =
EscapeParamUtageGet.instance.NumericCombinationGimmickDropItemInfo(itemNumber);
Debug.Log("獲得アイテム表示" + ShowName + FileName);
//表示名とアセット名を表示
FieldItemPopUp.instance.ShowItem(ShowName, FileName);
//
//アイテムbox_に渡す
ItemBox.instance.SetItemBox(FileName, ShowName, itemNumber);
//ユーザー情報更新(phaseの更新)
(int User_Progress_Stg, int User_Progress_StgPhase, int User_Progress_Bground) =
GetStageInfo.instance.SetUserPhaseUpdate();
HideNumericCombinationGimmic();
}
/// <summary>
/// 矢印↓でギミック消去
/// テキストボックス削除
/// </summary>
public void HideNumericCombinationGimmic()
{
GameObject[] clones = GameObject.FindGameObjectsWithTag("NumericOutPutText");
foreach (GameObject clone in clones)
{
Destroy(clone);
}
NumericCombinationGimmick.SetActive(false);
ButtonRigt.SetActive(true); ButtonLeft.SetActive(true);
ButtonDown.SetActive(false);
}
}
NumericCombinationGimmickControllerの中で
宴の連携以外は InPutUI.transform.DOShakePosition(1f, 3f, 30, 0, false, true);
でDOTweenの機能なども使っています。
宴のアセットは下記です。
本日は以上となります。少しでも参考になれば幸いです。