yosita/たんすかい 2023/10/25 23:33

【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)

ダウンロード
public 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の機能なども使っています。



宴のアセットは下記です。

本日は以上となります。少しでも参考になれば幸いです。

1件のチップが贈られています

チップを贈るにはユーザー登録が必要です。チップについてはこちら

月別アーカイブ

記事を検索