private void DoFinalization() { if ((physicsBuildTask != null) && (physicsBuildTask.isReady)) { if (physicsBuildTask.voxelContainerList != null) { for (int i = 0; i < physicsBuildTask.voxelContainerList.Count; i++) { physicsBuildTask.voxelContainerList[i].enabled = true; physicsBuildTask.voxelContainerList[i].gameObject.GetComponent <Rigidbody>().mass = physicsBuildTask.voxelContainerList[i].voxels.Count; physicsBuildTask.voxelContainerList[i].CreateBoxColliders(physicsBuildTask.colliders[i]); ///physicsBuildTask.voxelContainerList[i].gameObject.GetComponent<Rigidbody>().drag = physicsBuildTask.voxelContainerList[i].voxels.Count; MeshRenderer meshRenderer = physicsBuildTask.voxelContainerList[i].GetComponent <MeshRenderer>(); meshRenderer.enabled = true; physicsBuildTask.voxelContainerList[i].mustRebuildBeforeUpdate = true; } } this.container.CreateBoxColliders(physicsBuildTask.mainBodyCollider); physicsBuildTask = null; return; } if (physicsBuildTask == null) { if ((!this.container.mustRebuildBeforeUpdate) && (this.IsAllFragmentsRebuilded())) { if (showDebugMessages) { Debug.Log("VoxelMax Physics: Reenabling modules"); } this.container.mustRebuildBeforeUpdate = true; foreach (VoxelContainer voxContainer in this.fragmentContainers) { Rigidbody rigidBody = voxContainer.GetComponent <Rigidbody>(); MeshCollider meshCollider = voxContainer.GetComponent <MeshCollider>(); VoxelPhysics voxelPhysics = voxContainer.GetComponent <VoxelPhysics>(); rigidBody.useGravity = true; if (meshCollider != null) { meshCollider.enabled = true; } voxelPhysics.enabled = true; } // this.gameObject.GetComponent<MeshCollider>().enabled = true; if (this.gameObject.GetComponent <Rigidbody>() != null) { this.gameObject.GetComponent <Rigidbody>().useGravity = true; } this.currentState = PhysicsState.WaitingForTask; } } }
public void DoObjectCreation() { this.currentState = PhysicsState.ObjectCreation; if (showDebugMessages) { Debug.Log("VoxelMax Physics: Object creation update"); } if (this.physicsAggregatedList == null) { if (showDebugMessages) { Debug.Log("VoxelMax Physics: No fragmented object to create"); } this.currentState = PhysicsState.WaitingForTask; return; } if (this.physicsAggregatedList.Count > 1) { //Prepare GameObjectList because it can be only done in the main thread List <GameObject> newGameObjectList = new List <GameObject>(); List <VoxelContainer> newContainerList = new List <VoxelContainer>(); for (int i = 0; i < this.physicsAggregatedList.Count - 1; i++) { GameObject newGameObject = new GameObject(); newGameObject.transform.parent = this.transform; VoxelContainer newContainer = newGameObject.AddComponent <VoxelContainer>(); newContainer.enabled = false; newContainer.modelFilename = this.container.modelFilename; newContainer.modelName = this.container.modelName; newContainer.textureFilename = this.container.textureFilename; //newContainer.AssignUVDictionary(this.container); newContainerList.Add(newContainer); this.fragmentContainers.Add(newContainer); MeshRenderer meshRenderer = newGameObject.AddComponent <MeshRenderer>(); Rigidbody rigidBody = newGameObject.AddComponent <Rigidbody>(); newContainer.enabled = false; meshRenderer.enabled = false; rigidBody.useGravity = false; newGameObject.transform.localScale = new Vector3(1f, 1f, 1f); newGameObject.transform.rotation = this.gameObject.transform.rotation; newGameObject.transform.position = this.gameObject.transform.position; //Add physics to fragments VoxelPhysics newVoxelPhysics = newGameObject.AddComponent <VoxelPhysics>(); newVoxelPhysics.tensionCalculation = this.tensionCalculation; newVoxelPhysics.layerWidthBreakPoint = this.layerWidthBreakPoint; newVoxelPhysics.enabled = false; newGameObject.GetComponent <Renderer>().sharedMaterial = this.gameObject.GetComponent <MeshRenderer>().sharedMaterial; newGameObjectList.Add(newGameObject); } // this.gameObject.GetComponent<MeshCollider>().enabled = false; if (this.gameObject.GetComponent <Rigidbody>() != null) { this.gameObject.GetComponent <Rigidbody>().useGravity = false; } this.physicsBuildTask = new PhysicsBuildTask(newGameObjectList, this.physicsAggregatedList, newContainerList); this.DoMoveDataToObjects(); } else { if (this.physicsAggregatedList.Count == 1) { if (this.gameObject.GetComponent <Rigidbody>() == null) { // Rigidbody curRigidBody = this.gameObject.AddComponent<Rigidbody>(); // curRigidBody.mass = this.container.voxels.Count; } MeshCollider meshCollider = this.gameObject.GetComponent <MeshCollider>(); if (meshCollider != null) { Destroy(meshCollider); } this.physicsBuildTask = new PhysicsBuildTask(null, this.physicsAggregatedList, null); this.DoMoveDataToObjects(); } } }
// Update is called once per frame void Update() { if ((triggered) && (!this.exploded)) { this.exploded = true; //Get the root object rootObjectForParticles = GameObject.Find("VoxelMaxExplosionRoot"); if (rootObjectForParticles == null) { rootObjectForParticles = new GameObject(); rootObjectForParticles.name = "VoxelMaxExplosionRoot"; } Collider[] colliderList = Physics.OverlapSphere(this.gameObject.transform.position, this.explosionRadius); foreach (Collider curCollider in colliderList) { if (curCollider.gameObject.tag == "Indestructible") { continue; } VoxelContainer voxelContainer = curCollider.gameObject.GetComponent <VoxelContainer>(); if (voxelContainer != null) { Vector3 torqueVector = new Vector3(Random.Range(0f, 1f), Random.Range(0f, 1f), Random.Range(0f, 1f)) * this.explosionForce; Vector3 voxelPoint = voxelContainer.gameObject.transform.InverseTransformPoint(this.gameObject.transform.position); List <Voxel> voxelsToRemove = new List <Voxel>(); Vector3 transformedDistance = voxelContainer.gameObject.transform.InverseTransformVector(explosionRadius, 0f, 0f); List <Voxel> voxelList; lock (voxelContainer.voxels) { voxelList = new List <Voxel>(voxelContainer.voxels.Values); } foreach (Voxel curVoxel in voxelList) { float voxDistance = Vector3.Distance(curVoxel.position, voxelPoint); if (voxDistance <= transformedDistance.magnitude) { voxelsToRemove.Add(curVoxel); } } //Do not instantiate every voxel on large explosions to prevent frame drop int particleStepper = 0; if (maxParticleCount != 0) { particleStepper = Mathf.Max((int)(voxelsToRemove.Count / this.maxParticleCount), 1); } for (int i = 0; i < voxelsToRemove.Count; i++) { Voxel curVoxel = voxelsToRemove[i]; if ((particleStepper != 0) && ((i % particleStepper) == 0)) { if (this.explosionParticle != null) { GameObject newObject = Instantiate(this.explosionParticle); newObject.transform.parent = rootObjectForParticles.transform; newObject.transform.localScale = voxelContainer.gameObject.transform.localScale; newObject.transform.position = voxelContainer.gameObject.transform.TransformPoint(curVoxel.position); Renderer curRenderer = newObject.GetComponent <Renderer>(); if (curRenderer != null) { if (curRenderer.material != null) { curRenderer.material.color = curVoxel.color; } } Rigidbody curRigidBody = newObject.GetComponent <Rigidbody>(); if (curRigidBody != null) { curRigidBody.AddForce(voxelContainer.gameObject.transform.TransformDirection(curVoxel.position - voxelPoint).normalized *explosionForce); curRigidBody.AddRelativeTorque(torqueVector); } } } } voxelContainer.AddBuildTaskRemovedVoxels(voxelsToRemove); VoxelPhysics vPhysics = this.GetComponent <VoxelPhysics>(); if ((vPhysics != null) && (vPhysics.enabled)) { voxelContainer.rebuildCollider = false; } //Modification for Will if (objectToInstantiate != null) { GameObject newGameObject = Instantiate <GameObject>(this.objectToInstantiate); newGameObject.transform.position = this.gameObject.transform.position; newGameObject.transform.parent = rootObjectForParticles.transform; } } else { Rigidbody curRigidBody = curCollider.gameObject.GetComponent <Rigidbody>(); if (curRigidBody != null) { Vector3 torqueVector = new Vector3(Random.Range(0f, 1f), Random.Range(0f, 1f), Random.Range(0f, 1f)) * this.explosionForce; Vector3 voxelPoint = curCollider.gameObject.transform.InverseTransformPoint(this.gameObject.transform.position); curRigidBody.AddForce(curCollider.gameObject.transform.TransformDirection(voxelPoint - this.gameObject.transform.position).normalized *explosionForce); curRigidBody.AddRelativeTorque(torqueVector); } } } Destroy(this.gameObject); } }