【Unity】プレイヤー設定①【CorgiEngine】
長く苦しい戦いだった
今回はプレイヤーの設定編。まだ完全には出来上がっていないがとりあえず辿り着いたところまでを整理。ここまでがあまりにも長かった・・・。

無料ながら可愛い見た目。基本的なアニメーションもあり私にうってつけの素材でプレイヤーの設定をお勉強。
絶望のエラー
NullReferenceException: Object reference not set to an instance of an object
MoreMountains.CorgiEngine.Weapon.UpdateAnimator () (at Assets/CorgiEngine/Common/Scripts/Agents/Weapons/Weapon.cs:1338)
これが私を数日間苦しめ続けてきたエラーの1つ。攻撃アニメーションを設定してたらずーっと出続けた。
解決方法についてAIに聞いては解決せずもう一度聞き、別の方法を試してもどうしても解決できず心が折れかけた。
どうにか気持ちを落ち着かせて1から作り直し(といっても元が既にSpriteパーツ毎に分けてはくれてる)、一晩ベッドで横になりながら漠然と考えた。
ふと、『MeleeWeaponコンポーネントの設置場所がそもそも合ってんのか』説が頭をよぎりAIにMeleeWeaponオブジェクトの設置場所について質問してみると、「Spriteと同じオブジェクトにいれるとエラーの原因になりかねないからこれがお勧めだよ。」と教えてくれた(下図)。

確かにMeleeWeaponコンポーネントを子オブジェクトに置いたこの状態ではエラーが出なくなった。ChatGPTありがとう。
親オブジェクト
PlayerオブジェクトにはとりあえずCharacterコンポーネントをいれる。
これでプレイヤーの操作や定義はほぼ出来上がる。
Corgi engine便利。高かっただけのことはあるな。
ただ英語が読めん。セクションがいっぱい並んでるけど全然わからん。
このSwordmanさん、デフォルトでは左を向いているが2Dアクションゲームって普通右に進むよね?
そのためTransformのScaleのX値を-1に、Initial Facing DirectionをRightにすると気持ちよく解決する。
そしてAutoBuild Player Characterをクリックすると下図のように一気にコンポーネントが追加される。

基本はいじるところないが、CharacterHandleWeaponだけは話が別。
ここが今回苦しんだ攻撃アニメーションに関係してくる。まあ結果的にこいつはそこまで曲者ではなかったけれど。

Weapon
Corgi engineの優しくないところが、基本的に銃器を使った2Dアクションをベースに考えているのかDemoに近接武器を持ったキャラクターがいない。いや謎のコーギーが実は剣を隠し持っているが素人には剣できちんとした設定にし直す方法など分からない。故に、近接武器の設定方法の見本がないのだ。

SwordmanさんはSimpleを売りにしているため武器は剣しかない。が、基本に則ってWeapon>Weapon-Swordと親オブジェクトをかまし、前述の通りさらにその子オブジェクトとしてHitBox>MeleeWeaponとした。

Weapon-SwordにはSprite、MeleeWeaponにはMeleeWeaponコンポーネントがある。
MeleeWeaponは触るところが多い。
まずTrigger ModeをSemi Autoにしたほうが良いらしい(ボタン入力の関係?よくわかってない)。
Delaysはまあ良い感じの数値にしておく。

問題がPosition、Animation、AnimationParametersNames、MeleeDamageArea、MeleeDamageAreaTimingのセクションだ。
まずPosition、MeleeDamageArea。後者を動かすとSceneの赤枠が動く。
これが罠だった。

素人は当然、これが当たり判定と思う。が、プレイモードにしてみると全く別のところにHitBoxが表示されるのだ。
訳が分からなかったが、どうやら実際のプレイモードの当たり判定の場所はPositionセクションの値で決まるようだ。よって、PositionのOffsetを良い感じに合わせることで理想の場所にHitBoxを設置できる。
これでHitBoxはいったんOK。
(※『いったん』なのは、当たり判定の持続時間がボタンの押す長さで変わるのを直したいが解決方法が現時点で不明のためである。)
次にアニメーション。
歩く、ジャンプするなどのアニメーションは比較的簡単だった。アニメーション自体は既にアセット内にありそれを適応するだけ。
だが、AnyStateから攻撃アニメーションを開始したいというところからが地獄の始まりだった。

まず、攻撃アニメーションはどこを参照して動作するの?
Modelオブジェクト内にAnimatorコンポーネントがある。これで基本動作は行えている。
しかしMeleeWeaponコンポーネント内にもAnimatorが存在するのだ。
素人は当然、Animatorsセクションがあるなら「ここにアニメーションを適応すると勝手に攻撃アニメーションが出来るのか。便利だな。」と思う。
だがここから様々なエラーが出るようになり絶望していくこととなる。上記のエラーもその最たるものの一つだ。
結局、試行錯誤して辿り着いた答えは、『MeleeWeaponコンポーネント内のAnimatorセクションには何も適応しない』だ。
あくまでアニメーションはModelオブジェクト内のAnimatorに任せる。これで良かったのだ。

あとは遷移を適当にぶち込めば攻撃アニメーションの追加完了だが一つだけ注意点がある。
Has Exit Timeは当然オフにするのだが、Idle>RunやRun>Jumpへ切り替える直後の一瞬だけAnyStateにしていてもAttackが開始されない。
これはTransition Durationをすべて0にすれば解決出来た。未来の自分、努々忘れることなかれ。
これにより晴れてSwordmanさんを自分の理想通りに動かしかつ攻撃が出来るようになった。
ここに辿り着くのに1週間くらい費やした・・・ド素人が独力でこなすのはやはり大変だ。家庭教師が欲しい。
HitBoxの持続時間の件は些細な問題のためとりあえず放置。有識者がいれば是非教えて下さい。
次の目標は体力と残機、ゲームオーバーの仮作成。Demoで触ったので多分そこまで苦労はしないと思う。
それをしながら、実際に作るゲームの構想を妄想していこう。
つづく
