はじめに
非プログラマーの初級者がUnity(2D)をいじっていてちょっとつまずいたところや小さい事項のメモです。
ちょくちょく更新する予定です。
基本出先にてスマホから投稿しています。
ほかにもこんなやり方があるよ!という場合は教えていただけるとうれしいです。
RaycastHit2Dがnull
やりたかったこと
プレイヤーが敵の索敵範囲内に入り、目視できるとプレイヤーを追いかける。
実装方法
Phyics2D.Raycast(Vector2D 敵の位置, Vector2D プレイヤーの相対的な方向, float 検出距離)にてRaycastする。
プレイヤーのGameObjectが返されたら追尾モードに、壁などそれ以外なら現在の移動を続けるようにする。
何でつまずいたか
RaycastHit2Dがnullを返す。
ときどきそれ以外が返ってくるが、プレイヤーのGameObjectではない。
原因
プレイヤーのGameObjectのLayerがDefaultではなかった。
Raycast(2Dも3Dも?)がデフォルトで判定するのはDefaultという名前のLayer0のみである。
解決方法
Raycastの引数にLayermaskを与えることで解決。
Layermaskはint型のため、
int Layermask = 1 << プレイヤーのレイヤー番号 | 1 << 壁のレイヤー番号を作成し、Raycastの第4引数で渡した。
Interfaceを定義する場所
やりたかったこと
敵の移動処理(歩く、飛ぶなど)で共通するランダムウォークの方向転換をInterfaceにて定義する。
敵の管理をするclassのUpdateにて一括で呼び出すため。
何でつまずいたか
どこで定義すればいいのかわからなかった。
解決方法
class内でないならどこでもいいみたい。
複数のInterfaceをまとめるため、Interfaces.csを作成してそこに記載した。
このスクリプトはGameObjectにアタッチするはない。