【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でした!!