public void BreakObject(Collision collision) { // prefab swap will switch the entire object out with a new prefab object entirely if (breakType == BreakType.PrefabSwap) { // Disable this game object and spawn in the broken pieces Rigidbody rb = gameObject.GetComponent <Rigidbody>(); // turn off everything except the top object foreach (Transform t in gameObject.transform) { t.gameObject.SetActive(false); } // spawn in correct prefab to swap to at object's last location and rotation // make sure to change to the correct variant of Prefab if the object isDirty // if gameObject.GetComponent<Dirty>() - first check to make sure if this object can become dirty // if object is dirty - probably get this from the "Dirty" component to keep everything nice and self contained // PrefabToSwapTo = DirtyPrefabToSwapTo if (gameObject.GetComponent <Dirty>()) { // if the object is not clean, swap to the dirty prefab if (gameObject.GetComponent <Dirty>().IsDirty()) { PrefabToSwapTo = DirtyPrefabToSwapTo; } } GameObject resultObject = Instantiate(PrefabToSwapTo, transform.position, transform.rotation); broken = true; // ContactPoint cp = collision.GetContact(0); foreach (Rigidbody subRb in resultObject.GetComponentsInChildren <Rigidbody>()) { subRb.velocity = rb.velocity * 0.4f; subRb.angularVelocity = rb.angularVelocity * 0.4f; } rb.collisionDetectionMode = CollisionDetectionMode.Discrete; rb.isKinematic = true; // if this object breaking is an egg, set rotation for the EggCracked object // quick if the result object is an egg hard set it's rotation because EGGS ARE WEIRD and are not the same form as their shelled version if (resultObject.GetComponent <SimObjPhysics>()) { if (resultObject.GetComponent <SimObjPhysics>().Type == SimObjType.EggCracked) { resultObject.transform.rotation = Quaternion.Euler(Vector3.zero); PhysicsSceneManager psm = GameObject.Find("PhysicsSceneManager").GetComponent <PhysicsSceneManager>(); psm.Generate_InheritedObjectID(gameObject.GetComponent <SimObjPhysics>(), resultObject.GetComponent <SimObjPhysics>(), 0); Rigidbody resultrb = resultObject.GetComponent <Rigidbody>(); resultrb.collisionDetectionMode = CollisionDetectionMode.ContinuousSpeculative; resultrb.isKinematic = false; } } // it's broken, make sure that it cant trigger this call again readytobreak = false; } // if decal type, do not switch out the object but instead swap materials to show cracked/broken parts if (breakType == BreakType.MaterialSwap) { // decal logic here if (MaterialSwapObjects.Length > 0) { for (int i = 0; i < MaterialSwapObjects.Length; i++) { MaterialSwapObjects[i].MyObject.GetComponent <MeshRenderer>().materials = MaterialSwapObjects[i].OnMaterials; } } // if the object can be toggled on/off, if it is on, turn it off since it is now broken if (gameObject.GetComponent <CanToggleOnOff>()) { gameObject.GetComponent <CanToggleOnOff>().isOn = false; } broken = true; // it's broken, make sure that it cant trigger this call again readytobreak = false; } if (breakType == BreakType.Decal) { // move shattered decal to location of the collision, or if there was no collision and this is being called // directly from the Break() action, create a default decal i guess? BreakForDecalType(collision); } BaseFPSAgentController primaryAgent = GameObject.Find("PhysicsSceneManager").GetComponent <AgentManager>().ReturnPrimaryAgent(); if (primaryAgent.imageSynthesis) { if (primaryAgent.imageSynthesis.enabled) { primaryAgent.imageSynthesis.OnSceneChange(); } } }
// action to be called from PhysicsRemoteFPSAgentController public void Slice() { // if this is already sliced, we can't slice again so yeah stop that if (isSliced == true) { return; } // Disable this game object and spawn in the broken pieces Rigidbody rb = gameObject.GetComponent <Rigidbody>(); rb.collisionDetectionMode = CollisionDetectionMode.Discrete; rb.isKinematic = true; // turn off everything except the top object, so we can continue to report back isSliced meta info without the object being "active" foreach (Transform t in gameObject.transform) { t.gameObject.SetActive(false); } GameObject resultObject; if (!gameObject.GetComponent <SimObjPhysics>().DoesThisObjectHaveThisSecondaryProperty(SimObjSecondaryProperty.CanBeCooked)) { // instantiate the normal object if this object is not cooked, otherwise.... resultObject = Instantiate(ObjectToChangeTo, transform.position, transform.rotation); isSliced = true; } // if the object can be cooked, check if it is cooked and then spawn the cooked object to change to, otherwise spawn the normal object else { // instantiate the normal object if this object is not cooked, otherwise.... resultObject = Instantiate(ObjectToChangeTo, transform.position, transform.rotation); isSliced = true; if (gameObject.GetComponent <CookObject>().IsCooked()) { // cook all objects under the resultObject foreach (Transform t in resultObject.transform) { t.GetComponent <CookObject>().Cook(); } } } PhysicsSceneManager psm = GameObject.Find("PhysicsSceneManager").GetComponent <PhysicsSceneManager>(); if (psm != null) { // if the spawned object is not a sim object itself, but if it's holding a ton of sim objects let's go if (!resultObject.transform.GetComponent <SimObjPhysics>()) { // each instantiated sliced version of the object is a bunch of sim objects held by a master parent transform, so go into each one and assign the id to each based on the parent's id so // there is an association with the original source object int count = 0; foreach (Transform t in resultObject.transform) { SimObjPhysics tsop = t.GetComponent <SimObjPhysics>(); psm.Generate_InheritedObjectID(gameObject.GetComponent <SimObjPhysics>(), tsop, count); count++; // also turn on the kinematics of this object Rigidbody trb = t.GetComponent <Rigidbody>(); trb.collisionDetectionMode = CollisionDetectionMode.ContinuousSpeculative; trb.isKinematic = false; // also add each child object's rb to the cache of all rigidbodies in scene psm.AddToRBSInScene(trb); } } // the spawned object is a sim object itself, so make an ID for it else { // quick if the result object is an egg hard set it's rotation because EGGS ARE WEIRD and are not the same form as their shelled version if (resultObject.GetComponent <SimObjPhysics>().Type == SimObjType.EggCracked) { resultObject.transform.rotation = Quaternion.Euler(Vector3.zero); } SimObjPhysics resultsop = resultObject.GetComponent <SimObjPhysics>(); psm.Generate_InheritedObjectID(gameObject.GetComponent <SimObjPhysics>(), resultsop, 0); Rigidbody resultrb = resultsop.GetComponent <Rigidbody>(); resultrb.collisionDetectionMode = CollisionDetectionMode.ContinuousSpeculative; resultrb.isKinematic = false; // also add the spawned object's RB to the cache of all rigidbodies in scene psm.AddToRBSInScene(resultrb); } } else { Debug.LogError("Physics Scene Manager object is missing from scene!"); } // if image synthesis is active, make sure to update the renderers for image synthesis since now there are new objects with renderes in the scene BaseFPSAgentController primaryAgent = GameObject.Find("PhysicsSceneManager").GetComponent <AgentManager>().ReturnPrimaryAgent(); if (primaryAgent.imageSynthesis) { if (primaryAgent.imageSynthesis.enabled) { primaryAgent.imageSynthesis.OnSceneChange(); } } }