AddComponentをした時のColliderの初期の値が思ってもいないものになってバグったので挙動を調べた。
先にまとめを書くと、以下になる
1.オブジェクトにParticleSystemが存在してそいつが悪さをしていた
2.Rendererが切られていてParticleSystemがついているという発見が遅れた
3.コードからColliderをAddComponentするときは明示的に初期化しよう
BoxColliderをつけると次のようなCenter(0,0,0), Size(1,1,1)のColliderがつけられる。
次に、ParticleSystemにColliderをつける。
ColliderのSizeとCenterの位置がParticleの飛ぶ範囲に影響される。
これは、ParticleSystemのRendererを切っているものにColliderをつけても同じ結果になる。
Rendererを切ったParticleSystemを用意してColliderをつけてみる。
RendererがついていないParticleSystemにコード側からColliderをつけようとしてとあるバグを踏んだりもした。
次に、コード側からのColliderのAddComponentの挙動を見る。
public class StartAddComponent : MonoBehaviour {
void Start () {
gameObject.AddComponent<BoxCollider>();
}
}
Startは同じ挙動になるがAwakeは違う。
public class AwakeAddComponent : MonoBehaviour {
void Awake () {
gameObject.AddComponent<BoxCollider>();
}
}
CentreやSizeが初期値になる。
なので、PrefabをInstantiateしたタイミングでColliderをAddComponentした場合と、1frame挟んだあとにAddComponentしたのでつくColliderのサイズは変わるので注意。
なので、ここらの挙動に惑わされないように、CodeからAddComponentする場合は明示的にCenterとSizeに値は代入しておきたい。
var collider = gameObject.AddComponent<BoxCollider>();
// 期待する値を代入
collider.center = Vector3.zero;
collider.size = Vector3.one;