private void BuildColliders(ColliderBuffer buffer) { switch (_colliderType) { case ColliderType.BOX: BuildBoxColliders(buffer); break; case ColliderType.MESH: BuildMeshCollider(buffer); break; } }
private void BuildMeshCollider(ColliderBuffer buffer) { Mesh mesh = _meshCollider.sharedMesh; if (mesh == null) mesh = new Mesh(); else mesh.Clear(); //get the arrays we have just created and assign them to the new mesh mesh.vertices = buffer.GetVertices(); mesh.triangles = buffer.GetTriangles(); mesh.RecalculateBounds(); //clear our mesh buffer buffer.Clear(); _meshCollider.sharedMesh = null; _meshCollider.sharedMesh = mesh; }
private void BuildBoxColliders(ColliderBuffer buffer) { //fetch a list of colliders we already own BlockCollider[] colliders = GetComponentsInChildren<BlockCollider>(); int colliderCount = colliders.Length; int currentCollider = 0; List<ColliderData> colliderData = buffer.GetColliderData(); foreach (ColliderData data in colliderData) { BlockCollider collider = null; if (currentCollider < colliderCount) { collider = colliders[currentCollider]; } else { //we don;t have enough children, get some from the pool, //if the pool is empty; new colliders will be created for us GameObject obj = ObjectPool.instance.GetObjectForType("BlockCollider", false); if (obj) { obj.hideFlags = 0; obj.transform.parent = transform; collider = obj.GetComponent<BlockCollider>(); collider.Init (this); colliderCount++; } } if (collider) { collider.transform.localRotation = Quaternion.identity; collider.SetPosition(data.position); collider.SetSize(data.size); collider.enabled = true; currentCollider++; } } //release any excess children back into the pool for (int i=currentCollider; i<colliderCount; i++) { ObjectPool.instance.PoolObject(colliders[i].gameObject); } //clear our collider buffer buffer.Clear(); }