public void BuildCollision() { if (this == null) { path.OnPathChanged -= Path_OnPathChanged; } if (path != null) { Transform capsuleRoot = transform.Find("CapsuleRoot"); if (capsuleRoot != null) { if (Application.IsPlaying(this)) { Destroy(capsuleRoot.gameObject); } else { DestroyImmediate(capsuleRoot.gameObject); } } if (useCapsules) { MeshCollider mc = GetComponent <MeshCollider>(); if (mc != null) { if (Application.IsPlaying(this)) { Destroy(mc); } else { DestroyImmediate(mc); } } capsuleRoot = new GameObject("CapsuleRoot").transform; capsuleRoot.SetParent(transform); capsuleRoot.ResetLocals(); colliders.Clear(); int numCapsules = Mathf.CeilToInt(path.GetLength() * capsulesPerUnit); for (int i = 1; i <= numCapsules; i++) { float prevAlpha = (i - 1) / (float)numCapsules; float alpha = i / (float)numCapsules; Vector3 prevPos = path.GetPoint(prevAlpha); Vector3 pos = path.GetPoint(alpha); GameObject capsuleGo = new GameObject("CapsuleCollider", typeof(CapsuleCollider)); CapsuleCollider capsule = capsuleGo.GetComponent <CapsuleCollider>(); capsule.transform.SetParent(capsuleRoot); capsule.transform.position = (prevPos + pos) / 2f; Vector3 lookDir = pos - prevPos; if (lookDir != Vector3.zero) { capsule.transform.forward = lookDir.normalized; } capsule.direction = 2; // Z float prevThickness = thicknessCurve.Evaluate(prevAlpha); float thickness = thicknessCurve.Evaluate(alpha); capsule.radius = path.Radius * (prevThickness + thickness) / 2f; capsule.height = (pos - prevPos).magnitude + capsule.radius; capsule.isTrigger = false; capsule.gameObject.layer = colliderLayer.layer; colliders.Add(capsule); } RefreshActiveColliders(); } else { MeshFilter mf = GetComponent <MeshFilter>(); if (mf == null) { mf = path.GetComponent <MeshFilter>(); } if (mf != null) { MeshCollider mc = mf.gameObject.GetComponent <MeshCollider>(); if (mc == null) { mc = mf.gameObject.AddComponent <MeshCollider>(); } mc.sharedMesh = mf.sharedMesh; } } #if UNITY_EDITOR EditorUtility.SetDirty(this); #endif OnCollisionChanged(this); } }