2015年4月3日金曜日

unity Gameobjectのlayerがスクリプトから変更できないとき

コリダーとの衝突時に条件に応じて、
レイヤーを変更する処理を行ったところ、エラーが出て成功しない。


ここから前置きのエラー説明。


gameObject.layer = LayerMask.NameToLayer("Enemy");
だとか
gameObject.layer = 15;
といったコードでは
layer numbers must be between 0 and 31
とエラーメッセージが出る。エラー発生元を明かさず凄い勢いで。
LayerMask.NameToLayer("Enemy")を
ウォッチ式で見ても値は15で、本来はこれで動くはず。

試しに15ビット目に1を立ててみる。
gameObject.layer = 1 << 15;
では
A game object can only be in one layer.
The layer needs to be in the range [0...31]
とエラーメッセージが出る。
2^15=32768なのでこれはエラーの通り。


ここまで前置き。


で、エラーを吐き出しているところを調べるために
各コンポーネントのON/OFFを切り替えていたところ、
対称にアタッチしてあるCharacterControllerが吐き出していたことがわかった。
そして、OFF/ONを行うことでエラーが起きなくなることもわかった。

CharacterController hoge = GetComponent<CharacterController>();
gameObject.layer = LayerMask.NameToLayer("Enemy");
hoge.enabled = false;
hoge.enabled = true;

以上のようにすることで、エラーは無くなった。

また、細かい検証はしていないが、
Rigidbody + BoxColliderでは同様のエラーは出なかった。

他にも細かい原因が絡んでいるかもしれないが、
レイヤー変更後のキャラクターコントローラーは一度再起動させる
のが良い、かもしれないとあやふやに終わる


2015/04/29 追記---------------------------------------------------
改めてやるとダメっぽいので確認
そんなことなかった
enabledが抜けてるところがあっただけだった

0 件のコメント:

コメントを投稿