UnityEditorを使って2D格闘(2D Fighting game)作るときのモーション遷移図作成の半自動化に挑戦しよう<その5>

  • 0
    いいね
  • 0
    コメント

    201701272149a83.png
    Made by me. Mayby 3day,4day... Simple program.
    なんか 3日か4日ぐらいで ちょちょっと作ったスクリプト StellaQL を技術解説する。

    ソース公開中 Open source https://github.com/muzudho/KifuwarabeFighter2

    201701211744gif33.gif

    前回からの続き
    <その1> http://qiita.com/muzudho1/items/9c50b8b894e3cf4c90da
    <その2> http://qiita.com/muzudho1/items/8455c0c7a26d5788b541
    <その3> http://qiita.com/muzudho1/items/a1669f4d1721428790c1
    <その4> http://qiita.com/muzudho1/items/baf4b06cdcda96ca9a11

    Demonstration デモ

    (1)Add Transition (トランジション追加)
    201701272205gif35.gif

    (2)Add Transitions by Regex (正規表現でトランジション追加)
    201701272205gif36.gif

    (3)Update Transition Properties (トランジションのプロパティ変更)
    201701272205gif38.gif

    (4)Update State Properties (ステートのプロパティ変更)
    201701272205gif40.gif

    (5)Select States (ステートのプロパティ一覧)
    201701272205gif41d.gif

    (6)TO ATTR TAG ( )  (属性で検索)
    201701291517gif42.gif

    (7)Command Reference (コマンド一覧)
    201701291517gif43c.gif

    (8)STATE INSERT, STATE DELETE (ステートの作成と削除)
    201701291517gif44.gif

    How to Install. (StellaQLの導入の仕方)

    ステートマシンのトランジションを テキストで入力するスクリプト、StellaQL の導入の仕方を説明する。

    (1) Get! 取ってくる場所

    Git Hub 「KifuwarabeFighter2」
    https://github.com/muzudho/KifuwarabeFighter2
    201701272149a78b.png

    「StellaQL」
    201702070448a1b.png
    File composition change often. 中身のファイルはよく変わる。
    (2017-02-07 Change 変更 StellaQLEditor -> StellaQL)
    (2017-02-07 Change 変更 StellaQLEngine -> StellaQL)

    (2) Distribution 配置場所

    (2017-02-09 変更 Modify Assets/Editor/StellaQLEditor/~ -> Assets/StellaQL/Editor)
    201701272149a86b.png
    Unityの扱いに慣れてるなら もちろん変えて構わない。

    (2017-02-09 変更 Modify Assets/Engine/StellaQLEngine/~ -> Assets/StellaQL)
    201701272149a87b.png
    便利かと思ってEngine側にコード汚染しているが、嫌だったら改造してくれ。オープンソース。

    (3)Set up (下準備)

    (2017-01-29 追記)

    (Step 1.) Full path (フルパス)

    201702050112gif57d.gif
    (2017-01-30 追記Add)
    (2017-02-05 変更Modify Step 4. -> Step 3.)
    (2017-02-05 変更Modify Step 3. -> Step 1.)

    • Drag and drop the animation controller file to StellaQL. (アニメーション・コントローラー・ファイルを StellaQL にドラッグ&ドロップしてください)

    • Please,click [Generate C# (Fullpath of all states)] button. Automatically generate constant. ([Generate C# (Fullpath of all states)]ボタンをクリックしてください)
      記事: http://qiita.com/muzudho1/items/0d38dcb4e2232608cbd2
      (2017-02-05 仕様変更 Specification changed.)
      (2017-02-09 変更Modify. [Generate fullpath constant C#] button -> [Generate C# (Fullpath of all states)] button)

    (Step 2.) You can extend AControl class. (AControlクラスを拡張してもいい)

    Open Assets/StellaQL/AnimatorControllers/Demo_Zoo.cs file. (Assets/StellaQL/AnimatorControllers/Demo_Zoo.csファイルを開いてください)
    (2017-01-30 追記Add)
    (2017-02-05 変更Modify UserDefinedStateRecord -> AcState )
    (2017-02-05 変更Modify Step 1. -> Step 2.)
    (2017-02-05 変更Modify Assets/Scripts/StellaQLEngine/Test_UserDefinedStateTable.cs -> Assets/Scripts/StellaQLEngine/acon_zoo/Zoo_AControll.cs)
    (2017-02-09 変更Modify Assets/Scripts/StellaQLEngine/acon_zoo/Zoo_AControll.cs -> Assets/StellaQL/AnimatorControllers/Demo_Zoo.cs)
    (2017-02-09 変更Modify AcState -> AControl)

    201701301526a31b.png
    Please, create record definition of statemachine or state.
    Extend XXXX_YYYY_AbstractAControl class.
    (Unity のステートマシンや ステートに、好きなようにデータを関連付ける仕組みです。 XXXX_YYYY_AbstractAControl クラスを継承してください)
    (2017-02-05 変更Modify AbstractUserDefinedStateRecord -> AbstractAControll )
    (2017-02-09 変更Modify AbstractAControll -> XXXX_YYYY_AbstractAControl)

    (Step 3.) Initialize record (レコードの初期設定)

    (2017-01-30 追記)
    (2017-02-05 変更 Step 2. -> Step 3.)
    201701301526a32b.png
    empty string array is OK for userDefinedTags. new string[]{}; Other parameters is option.
    (ユーザー定義タグは空セットで構いません。 new string[]{}; 他に初期データが欲しいときは引数を好きなように増やしてください)
    (2017-02-09 削除Delete StellaQLは、ステートマシン名またはステート名のフルパスが必要です。スーパークラスのコンストラクタを使って設定してください。)

    (Step 4.) AControll is User defined animation controll data. (ユーザー定義ステート・テーブル)

    (2017-01-30 追記)
    (2017-02-05 変更 UserDefinedStateTable -> AControll )
    (2017-02-05 Step 3. -> Step 4.)
    201701301526a33b.png
    Please, create table definition of statemachines or states.
    Extend generated class.
    (ステートマシン、ステートのテーブル定義を作成してください。
    ([Generate fullpath constant C#]ボタンで作ったクラスを継承してください)

    (Step 5.) User defined tags (ユーザー定義タグ)

    (2017-01-30 追記)
    201701301526a35b.png
    Unfortunaly, Please, list user defined tags for StellaQL.
    (残念ですが、StellaQL用のユーザー定義タグを定数にしてください)

    (Step 6. & Step 7.) Activate tags (タグの有効化)

    (2017-01-30 追記Add)
    (2017-02-09 追記Add "& Step 7.")
    201701301526a36b.png
    Activate your defined tags.
    (ユーザー定義タグの有効化)

    201702081906a85.png
    Setting tags. (タグを設定してください)

    (Step 7.) Activate records (レコードの有効化)

    201701301526a37b.png
    Register and activate user defined record of statemachines or states.
    (ステートマシン、ステートのユーザー定義レコードを設定してください)
    (2017-01-30 追記)
    (2017-02-09 削除Delete)

    (Step 8.) Singleton (シングルトン)

    201701301526a38b.png
    Please, make singleton. Use by StellaQLEngine/UserDefinedDatabase.cs file. ~~
    ~~(シングルトンにしてください。 StellaQLEngine/UserDefinedDatabase.cs ファイルで使います)

    (2017-01-30 追記)
    (2017-02-09 削除Delete)

    (Step 9.) Activate tables (テーブルの有効化)

    201701301526a39b.png
    Assets/StellaQL/UserDefinedDatabase.cs

    Link A to B. A is animation controller file path. B is AControll instance.
    (アニメーション・コントローラーと、ユーザー定義テーブルの紐付けを、ユーザー定義データベースに追加して有効化)
    (2017-01-30 変更Modify StateEx → UserDefinedState。
    (2017-02-05 変更Modify UserDefinedStateTable -> AControll)
    (2017-02-09 追記Add Assets/StellaQL/UserDefinedDatabase.cs)

    Overview 全体図

    201701272149a83.png

    Animation Controller(アニメーション・コントローラー)欄にファイルパスを指定し、

    Assets/StellaQL/AnimatorControllers/Demo_Zoo.controller
    

    (2017-01-30 変更Modify AniCon@Char3→AniCon@StellaQL)
    (2017-02-05 変更Modify AniCon@StellaQL.controllerAcon@Zoo.controller)
    (2017-02-09 変更Modify Assets/Resources/AnimatorControllers/AniCon@StellaQL.controller -> Assets/StellaQL/AnimatorControllers/Demo_Zoo.controller)

    Command line (Stella QL) 欄に クエリーを入力し、

    TRANSITION INSERT
    FROM "Base Layer\.Dog"
    TO "Base Layer\.Cat"
    

    (2017-01-30 仕様変更 "Base Layer.StellaQL Practice.Dog" → "Base Layer.Dog" Catも同様)

    [Execute] ボタンをクリック。

    どんなクエリーが実装されているかは これから書いていく。仕様とか決まってないんで、 オープンソースなので自分で好き勝手に作ってはどうか。

    2017-01-27 22:59 TRANSITION INSERT

    TRANSITION INSERT
    FROM "Base Layer\.Dog"
    TO "Base Layer\.Cat"
    

    (2017-01-30 変更Modify "Base Layer.StellaQL Practice.Dog" → "Base Layer.Dog" Catも同様)

    201701272205gif35.gif

    2017-01-28 00:29 TRANSITION DELETE

    TRANSITION DELETE
    FROM "Base Layer\.Dog"
    TO "Base Layer\.Cat"
    

    (2017-01-30 変更Modify "Base Layer.StellaQL Practice.Dog" → "Base Layer.Dog" Catも同様)

    201701272205gif37.gif

    フル・パスの部分は正規表現になっているので注意されたい。オープンソースなんで自分で好きなように改変、拡張してくれ。

    この他に 属性を指定する方法を追加してあり、この記事に続けて書いていきたい。

    各部名称

    201701272149a84.png

    主要なのが6つ。
    (1) Layer
    (2) StateMachine
    (3) State
    (4) Transition StateとStateを結んでいる線。 StateMachineともつながる。
    (5) Condition
    (6) Position

    StellaQL は Transition を結ぶのを楽しようと思って作ったスクリプトだ。

    SetTag( ) レコードに結び付けて 属性を付けよう!

    (2017-01-30 変更Modify StateEx→UserDefinedState)
    (2017-02-09 変更Modify UserDefinedState class→SetTag method)

    201701272149a85.png
    (2017-01-29 23:54 追記 上図のEx Record[0]、[1]……は廃止し、フルパスハッシュをキーにそのまま利用。
    (2017-01-30 変更Modify Attribute→ User Defined Tags)
    (2017-01-30 変更Modify StateExTable.Attr 廃止 → const 定数とハッシュへ)
    (2017-01-30 変更Modify StateExRecord → UserDefinedStateRecord)
    (2017-01-30 変更Modify UserDefinedStateRecord → DefaultAcState)

    Unity とは別に勝手に データを用意しておき、State に1対1で結び付けておく。この拡張したレコードに 属性 を付けておくことで、属性を使って検索しようという試みだ。

    まだ この記事の後ろに続く。

    トランジションのプロパティを更新しよう。

    機能を追加した。

    2017-01-28 11:16 TRANSITION UPDATE

    TRANSITION UPDATE
    SET solo true mute true hasExitTime true
    exitTime 12.3 hasFixedDuration false
    duration 4.56 offset 7.89
    orderedInterruption false tag excellent
    FROM "Base Layer\.StellaQL Practice\.Cat"
    TO "Base Layer\.StellaQL Practice\.Dog"
    

    201701272205gif38.gif

    name list 各部名称

    201701281119a89b.png

    implementation 実装

    201701281119a88.png
    It's simple. 実に単純な実装。

    また この記事の後ろに追記していく。

    ステートのプロパティを更新しよう。

    機能を追加した。

    2017-01-28 12:05 STATE UPDATE

    STATE UPDATE
    SET name WhiteCat tag enjoy
    speed 1.23 speedParameterActive true speedParameter Monday
    mirror true mirrorParameterActive true mirrorParameter Tuesday
    cycleOffset 4.56 cycleOffsetParameterActive true cycleOffsetParameter Wednesday
    iKOnFeet true writeDefaultValues false
    WHERE "Base Layer\.StellaQL Practice\.Cat"
    

    201701272205gif40.gif

    name list 各部名称

    201701281119a91c.png

    implementation 実装

    201701281119a90.png
    Dictionary<string,string> property に SET句の値を入れて1つ1つ実行してるだけ。

    また この記事の後ろに追記していく。

    ステートのプロパティを確認しよう。

    機能を追加した。

    2017-01-28 20:47 STATE SELECT

    # Sample
    STATE SELECT
    WHERE ".*Dog"
    

    201701272205gif41d.gif
    設定ミスを探すときに役に立つんじゃないだろうか?

    implementation 実装

    201701281119a93.png
    1件ずつ プロパティーの中身を取り出している。

    また この記事の後ろに追記していく。

    属性で検索しよう

    テストしやすいように、テスト用の Assets/StellaQL/AnimatorControlers/Demo_Zoo.controller アニメーション・コントローラーを用意した。アニメーション・コントローラーを プロジェクト・ビューからドラッグ&ドロップできるようにもした。
    (2017-02-09 変更Modify Anicon@StellaQL -> Assets/StellaQL/AnimatorControlers/Demo_Zoo.controller)

    2017-01-29 15:27 FROM TAG ( )、TO TAG ( )

    # Sample
    TRANSITION INSERT
    FROM "Base Layer\.Foo"
    TO TAG (Horn)
    

    (2017-01-29 23:01 変更Modify ATTR → TAG)

    201701291517gif42.gif

    implementation 実装

    属性検索するには、各ステートに 属性を設定しておく必要がある。
    201701291118a95.png
    コーディングの手間を減らしたいので、「列挙型のAstateIndex」は廃止し、フルパスのハッシュをキーにした Dictionaryコレクションにレコードを格納することにした。
    キータイピング量を減らすために、リストに1回入れて、Dictionaryに移し替えている。

    また この記事の後ろに追記していく。

    (追記 2017-01-29 23:41)Command Reference コマンド一覧

    201701291517gif43c.gif
    コマンド一覧を付けた。

    implementation 実装

    201701300148a29.png
    外部ファイルにして読込んでもいいような気がする。

    あとは 動作テストと、 バグ・フィックス を進めていきたい。

    (追記 2017-01-30 01:46)STATE INSERT、STATE DELETE

    201701291517gif44.gif
    ステートの生成と削除もできるようにした。

    implementation 実装

    201701300148a30.png
    SET 句で name0 "WhiteCat" name1 "WhiteDog" と並べて、プロパティ名は無視することで 複数件の名前データを見るようにしている。使いまわし。

    この記事は終わり。

    新しい記事

    「Unityのステートマシンを編集する自作スクリプト StellaQL 機能まとめ」 http://qiita.com/muzudho1/items/de34b29d3e46b69e31be