キャラクターが宙に浮いてしまった。

この記事は、自作ゲーム開発中に起こった内容です。バグって誰でもやるんですが、面白かったので紹介していこうと思います。

ゲーム内でPrefabのTrasformの整合性がとれていなかった。

細かく言うと、Prefab自体はオブジェクトの位置を設定したい。今まではPrefab自体で高さを調節していたが、PrefabのTrasformはリセットし、その子オブジェクトで地面に埋まっているのを少し上にあげる位置の微調整を行いました。

そうすることでPrefab自体のpositionをresetしても子オブジェクトが地面にめり込むようなことにはならないようにしたかった。

と思いやっていったら、なんか浮いとる

そして、攻撃して敵をやっつけるゲームなのに、一度も攻撃していない敵がなんかいきなり死んでる・・・。

prefab内のキャラクターのオブジェクトのpositionを変えただけなのに・・・・。なんか面白かったので動画も取りました。

最初から死んでいるわけではなさそう・・・。Playerいないのになんか一人で殴って勝手に死んでるw

いざ調査!

まずは、浮いているのを直す

キャラクターが浮いている。こんなときに疑うのはCollider関連かな

なにかのColliderが下に突き抜けていました。調べたら、これはNavMeshAgentでした。BaseOffsetの値を変更して高さを調整して合わせます。

BaseOffsetをいじるとキャラの位置がおかしなことになってしまうので変えてはダメでした。
Prefab側の設定は、(0, 0, 0)その子供のオブジェクトも(0, 0, 0)にしないとTrasform.positionで取得できる値が欲しい値になりません。

試しに実行しました。

よさげですね。しかし、この勝手に死んでしまう人は・・・。どうしようか・・・。

勝手に死んでる人をなんとかする。

とりあえずGizmoをオンにしてみてみた。

なんかCapsuleColliderの位置がおかしい。これは直しました直しました。

そして勝手に殴っているのは、自分自身がPlayerのタグが付いていたため、自分で自分を殴りに行っていました。敵はPlayerをターゲットに向かってくるのでそれで自分をターゲットにしちゃったんですね。

しかし、なんかいろいろおかしくなってました。

さらに調査

敵近づいたら攻撃してくるようにしてあるんですが、変な方向に傾いて行って地面殴りにいってました。自分も攻撃すると地面の中へ・・・。

物理演算の影響を受けているせいかと思いました。Rigidbodyの 「Is Kinematic」をチェックが外れていたので入れました。これで物理演算の影響は受けなくなります。

でも直らない・・・。というか敵もクリックした箇所へプレイヤーと一緒に並走してる。
なんかちょっと「こっちこいや!」「わかったわ!そっちでやってやるわ」って2人で移動してるみたい。

PlayerとEnemyはCharacterのPrefabを継承したPrefab Variantで利用しています。そのCharacterにPlayerControllerのスクリプトが設定されていました。これを外す。

これにより敵もクリックしたところへ一緒に並走するバグが治りました

Characterのprefabの中心点を(0, 0, 0)にしたことにより、攻撃先がそこに変わったのではないかと推測しました。

でスクリプトを探すと見つけました。これですね。

target.transformが前は(0, 1, 0)だったものが(0, 0, 0)になったのでLookAtでしたを向いてしまっているということでした。

これは、スクリプトが悪いのではなくてEnemyの中心点が(0, 1, 0)でPlayerだけ直して(0, 0, 0)になったためにズレが生じているのでEnemyも(0, 0, 0)にしてやる。

高さを揃えてやることでちゃんと地面の上で殴り合ってくれました。

とりあえずこれでなんとか直りました。

なぜこんなことになったのか

ゲームをしていく上でキャラクターの中心点がキャラクターの真ん中に設定していました。

ですが、すべてのオブジェクトの中心点をオブジェクトの真ん中に設定すると、小さいものをLookAtするときにおかしくなると思いました。

たとえば、スライムや壺とかですね。

なのでオブジェクトのtransformは、基本的にresetした状態でprefabを作ろう。変更するのはその配下にあるオブジェクトを微調整するとしました。

プレイヤーでその修正をおこなったあと、間違えてPrefabにoverrideしてしまいました。

playerとenemyは、characterプレハブを継承したprefab variantです。Playerorverrideした影響でcharacterが更新されてしまったのです。

そのため、playerの情報がenemyにも反映されてしまい。めちゃくちゃになっていました。
enemyのタグがplayerになっていましたしね・・・。

コメント

タイトルとURLをコピーしました