変数システム(暫定1)【Unity】

unity技術

ド素人が独自にUnityの「変数」を扱ってみます。
スクリプトはAI頼みであり、構築しながら知識を得ていった、という感じでした。

「変数」の型

型/概念役割Unityでの主な用途注意点
int整数レベル、HP、アイテム個数小数点以下は切り捨てられる
float浮動小数点数座標、時間、速度、HP(割合)精度の限界(丸め誤差)がある
bool真偽値(true/false)死亡フラグ、接地判定状態が増えると管理が破綻しやすい
string文字列キャラクター名、ダイアログメモリ確保(GC)の負荷が高い
Trigger瞬間的な信号アニメーション遷移のキック変数というより「イベント」に近い

「変数」の扱い方

必要なシステム

一時的保存場所」と「変数(フラグ)付与」「変数(フラグ)チェック」の3つのスクリプトが必要になります

  • 変数を一時的に保存しておく場所を作るためのスクリプト
  • 変数を付与するスクリプト
  • 変数をチェックするスクリプト

独自構築

今回作った「変数システム」は独自構築なので、理解が深まった際には再構築もあります。
ちなみにこの時点では「セーブロードシステム」を前提にした構築にはなっていないかもです。

AIにとりあえずの要望を伝えて、新提案されて、取捨選択して、構築していったものになります。
変数取り扱い構築の概要だと思ってください。

  • 3つのスクリプトを2つにしました。
    • 一時的保存場所のスクリプトを「Flag_Manager」としました
    • 変数(フラグ)付与と変数(フラグ)チェックを1つのスクリプト「Flag_Controller」に統合
  • Flag_Manager
    • 本体はタイトルSceneに設置(最初のScene)
    • 各Sceneにおいてのテスト再生では、自動生成する方式をとりました
    • テスト再生中に、インスペクターに取得変数が表示されるように設計しました
  • Flag_Controller
    • インスペクターで変数を編集可能にする設計にしました
    • 変数付与のオブジェクト指定
    • 変数名・種類・オンオフ・数値・範囲
    • 変数をチェックするオブジェクト指定
    • 変数名・種類・オンオフ・数値・条件
    • 変数確認後にアクティブにするオブジェクト指定・非アクティブにするオブジェクト指定
  • 変数自体の種類分け
    • 一時的に使用する変数を「単発」接頭辞(無)
    • セーブデータに保存される変数を「保存」接頭辞(SAV_)
    • 一回取得したらアプリ終了時にも消えない半永久保存変数を「絶対」接頭辞(SYS_)
    項目接頭辞なし・その他SAV_(保存) / SYS_(絶対)
    保存先メモリ上のみ(閉じたら消える)JSONファイル(永久保存)
    起動時の挙動常に初期値(false等)から開始JSONがあれば、その値を最優先で復元
    Controllerの上書き防止なし(何度でも上書きOK)あり(Controllerの初期値では上書きされない)
    値をリセットしたい時Sceneを再読み込み・再生し直しManagerの右クリックメニューから削除

    Flag_Manager

    取得した変数を一時的に保存しておく、変数の置き場所「箱」の役割をするスクリプトです。

    実装初期のころは「bool型」のみが保存される仕組みのスクリプトでした。
    扱う変数を増やしたくて(全対応にすべく)、
    int」「float」「string」のどれも保存できるように改修してもらいました。
    ただただ「変数を保存」とするだけではダメなようです。

    ちなみに初期スクリプトは3つとも合体させたものとなっており、Managerだけは単品で設置する必要があると知って、
    分解を試みるも、無残なスクリプトにしかならずに、最初から作り直す羽目になりました(´・ω・`)

    Flag_Manager」スクリプトは、スタートScene(タイトル画面Scene)に設置しておきます。
    開発中ゲームが、複数Sceneで構成されているため、「Flag_Manager」スクリプトをそれぞれのSceneに設置する必要があるのかと調べたところ、「最初に一回読み込ませておけば大丈夫」という回答だったため、そうなりました。

    そうなると次の疑問が出てきます。
    「開発中の、テスト再生するSceneには「Flag_Manager」スクリプトがないけれど、どうなるの?」と。

    もちろんそのSceneになければ確認しようがないしエラーにもなるかも、という回答。
    その問題の解決方法は、
    「テスト再生中にだけ、そのSceneに自動で「Flag_Manager」スクリプトを生成する」というものでした。

    もちろんそんなものがある知識もスクリプト記述技術もないので、すべてAIに書いてもらっています。
    上記の疑問をそのまま聞いたら、こういう方法がありますと教えてくれたので、そのまま採用してもらいました。

    テスト中に取得した変数は、
    上記「Sys_Flag_Manager(Auto-Generated)」のインスペクターに随時表示される仕組みになっています。
    テスト中じゃないと表示はされないところが落とし穴です。

    ちなみにScene共有させている仕組みは「DontDestryOnLoad」というものらしいです。
    最初に読み込んだものを、そのまま引き継いでいってねということみたいです。

    これを使用すれば、コンフィグUIなども一回設置だけで共有するシステムも構築できるとか。

    Flag_Controller

    変数(フラグ)付与と変数(フラグ)チェックを追加・編集するためのスクリプトです。

    このスクリプトは「Flag_Manager」とは違い、
    各Sceneにそれぞれ設置し、そのSceneで取得させる変数を編集していきます。
    変数が必要ないSceneには設置不要です。

    こちらも初期段階では「bool型」のみの追加・編集でした。
    開発していく中で、それだけではダメだと「int」「float」「string」の追加・編集をできるようにしてもらいました。

    int」「float」を追加する際には、数値の範囲などの条件も付け加える必要があり、
    システム構築見切り発車したことを少し後悔しました。
    「変数」について、もう一度復習しておけば、実装がスムーズになったかと思われます。

    「その機能を追加すると、後々これも欲しくなりますよ」とか「この構築だと将来地獄を見ますよ」とか
    AIに言われるがままに、追加修正していく羽目になりました(´・ω・`)

    逆に言うと、そういうことも考えて返事をだしてくれるAIが凄いということになりますね。
    実際、想定通り以上のことを記述してくれて、いまのところ問題はない状態です。

    ■ 各変数条件
    インスペクター上で、型の種類、単体・複数の設置、数値、数値範囲の有無、チェック条件などを追加・編集できます。

    • Bool型:AllTrue/AnyTrue/AllFalse/AnyFalse
      • Equal(==)/ NotEqual(!=)
      • Single // 単一フラグ(従来通り)
      • AllTrue // すべてTrue(AND条件)
      • AnyTrue // どれかTrue(OR条件)
      • AllFalse // すべてFalse
      • AnyFalse // どれかFalse
    • Int型・Float型
      • Equal(==)/ NotEqual(!=)
        GreaterThan(>)/ LessThan(<)
        GreaterOrEqual(>=)/ LessOrEqual(<=)
      • Equal // 完全一致
      • NotEqual // 不一致
      • Contains // 部分一致
      • StartsWith // 前方一致
      • EndsWith // 後方一致

    変数自体の種類分け

    他のゲームエンジンでの変数の扱い方で、「」ではなく「種類」もあったことが印象的でした。
    上記で作った「Flag_Manager」に保存される変数は、一時的にしか保存されないということに気がつきます。

    つまり変数には、

    • 一時的保存で良い変数
      (初めからスタート、ゲーム終了、どんな場合でも特に保存されなくてよいもの・したくないもの)
    • セーブしたときに保存して欲しい変数
      (初めからスタート時には消えていて欲しいが、続きで始めるセーブデータには保存しておきたいもの)
    • 半永久的に保存しておきたい変数
      (コンフィグ設定やクリア後のエクストラ出現条件など、アプリを落としても保存されてたいもの)

    3種類があります。

    その違いを出すことが、Unityではどのようになっているのか、なっていないのか、違う概念があるのか、
    という知識がまったくないため、このままの疑問を呈したところ、「接頭辞」案を出してくれました。

    ようするに、変数名で区別すれば良いよね、ということです。

    • 一時的に使用する変数名は、特に考えなくてよい
    • セーブデータに保存したい変数名の冒頭には「SAV_」と書き加える
    • 一回取得したら半永久的に保存される変数名の冒頭には「SYS_」と書き加える

    変数名の違いによって、自動で振り分ける仕組みになっています。
    今回の接頭辞は任意でつけたもので、それに合わせてスクリプトを書いてもらっています。

    それらの変数を便宜上「単発」「保存」「絶対」と勝手に呼ぶことにします。
    保存」は、まだ構築していないセーブロードシステムと絡んでくるので、後々また改修することになると思います。

    絶対」のほうはAIの助言で、自動保存(オート)の仕組みも作ってもらいました。
    SYS_」を感知したら、自動でJSONファイルをPC内に作成し、そこに保存される仕組みらしいです。
    こういうことも勝手に記述してくれるので、とんでもないですねAI(´・ω・`)タスカルワァ

    ファイル場所オープンや削除方法も隙はなく、テスト中スクリプトのコンテクストで操作できるようになっていました。

    まとめ

    Unityでの変数の扱い方、ド素人まとめ。

    • 保存する箱スクリプト
    • 変数型条件を指定するスクリプト
    • 変数・条件をチェックするスクリプト
    • 一時保存セーブ保存永久保存の種類分け

    知識がない場合、AIに構築してもらうときは、上記を理解・まとめてからにすると良いと思います。

    コメント