【Unity】敵キャラを作っている時に座標系で躓いた話

日々鍛錬!!ゲーム開発ライフ

【Unity】敵キャラを作っている時に座標系で躓いた話

今回は前回の更新である「ワールド座標とローカル座標について」の続きです。

それでは短めですが行ってみましょう!!

どうも、UnityとUnrealEngineでゲーム開発中の「Exceliaゲーム開発部」部員Eです。

本日はUnityの座標関連で少し躓いた情報の公開です。

敵キャラを作っていたら、プレイヤーキャラで敵キャラを押した後に、敵キャラがあちこちにワープする現象に見舞われました。

下記動画が問題のバグです。

*キャラがNavimeshAgentの原点から離れてぐるぐるしています

(ワープの再現はできませんでしたが、原点からずれていきバグになりました。)

このバグを回避するにはどうしたらいいのか少し悩んだので、記事にしておきます。

結論


結論から言うと、このバグは親にしているゲームオブジェクトと、子にしているゲームオブジェクトの座標がずれることで発生しておりました。

今回のゲームオブジェクトの階層はこんな感じです。

親ゲームオブジェクト【1】(ワールド座標を持つ親オブジェクト)

  L子ゲームオブジェクト【2】

   (移動処理のスクリプトやNavimeshAgentを適用:押しても動かないオブジェクト)

   L子ゲームオブジェクト【3】

    (CapsuleColliderやRigidbodyを適用していた:押すと動く状態)

    Lキャラのメッシュ等

実際の構成も画像で載せておきます。

移動処理のC#スクリプトを【2】につけ、

【3】にColliderやRigidbodyを入れていましたが、この作り方がだめでした。

何が起きたかというと、

【3】のCapsuleColiiderの物理判定をプレイヤーキャラで押すことにより、

【3】の敵キャラの座標がズレていきました。

そして、敵が基準点である【2】のローカル座標を中心に、

ワープするような移動を始めました。

最初このバグが発生した際には、何が起きているか分からず、すごく混乱しました。

考えてみれば簡単で、

【3】のローカル座標のズレに対して、

【2】のローカル座標は固定なので、その2つのローカル座標がズレた分だけ、

敵キャラの移動する座標がおかしくなり、変なバグになっていたというわけです。

解決方法は、【3】にあるColliderやRigidBodyを、

【2】の移動スクリプトと同じオブジェクトにつけることでした。

追記:Colliderをこのオブジェクトに付ける必要は無いかもしれません。

部員Eの組み方では、ワールドの座標を持つ親ゲームオブジェクトと、

スクリプト等を持つ子ゲームオブジェクトを分けたかった(フォルダに見やすくまとめたかった)ので、

管理の仕方でバグが発生したと言えるでしょう。

初心者の方で、敵キャラがワープしてあちこちに移動するバグが発生した場合、

移動のスクリプトとコライダーや物理接触を見直してみてください。

同じようなバグで困っている方の一助になれればと思います。

ワールド座標とローカル座標の扱いは複雑になるほど難しくなり頭を抱えますね・・・。

今回は、ここまで。

それでは皆さん、良きゲーム開発ライフを!!

部員Eでした!!

Tags:

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です