Beispiel #1
0
    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>();
            rb.collisionDetectionMode = CollisionDetectionMode.Discrete;
            rb.isKinematic            = true;

            //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;

            //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_InheritedUniqueID(gameObject.GetComponent <SimObjPhysics>(), resultObject.GetComponent <SimObjPhysics>(), 0);

                    Rigidbody resultrb = resultObject.GetComponent <Rigidbody>();
                    resultrb.collisionDetectionMode = CollisionDetectionMode.ContinuousSpeculative;
                    resultrb.isKinematic            = 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;
        }

        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);
        }
    }
Beispiel #2
0
    //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_InheritedUniqueID(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;
                }
            }

            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_InheritedUniqueID(gameObject.GetComponent <SimObjPhysics>(), resultsop, 0);

                Rigidbody resultrb = resultsop.GetComponent <Rigidbody>();
                resultrb.collisionDetectionMode = CollisionDetectionMode.ContinuousSpeculative;
                resultrb.isKinematic            = false;
            }
        }

        else
        {
            Debug.LogError("Physics Scene Manager object is missing from scene!");
        }
    }