using UnityEngine; using System.Collections; using System.Collections.Generic; public class dissolveObject : MonoBehaviour { [Header ("Main Settings")] [Space] public bool dissolveObjectEnabled = true; public float timeToDestroyObject = 0.9f; public float dissolveDelay; public float dissolveSpeed = 0.2f; public float currentFadeValue = 0; [Space] [Header ("Shader Settings")] [Space] public Shader shaderToApply; public Texture dissolveTexture; public Color dissolveColor; public float dissolveColorAlpha; public string dissolveShaderFieldName = "_Amount"; public string dissolveShaderTextureFieldName = "_DissolveTexture"; public string dissolveShaderColorFieldName = "_DissolveColor"; public string dissolveShaderAlphaColorFieldName = "_DissolveColorAlpha"; [Space] [Header ("Object To Dissolve Settings")] [Space] public GameObject objectToDissolve; public bool useGameObjectList; public List gameObjectList = new List (); [Space] [Header ("Debug")] [Space] public bool objectToDissolveFound; public bool ignoreDissolveObjectEnabled; public typeObjectFound currentTypeObjectFound; public List rendererParts = new List (); public List originalShader = new List (); public List materialList = new List (); public enum typeObjectFound { vehicle, regularObject, npc } float lastTimeDissolveActivated; Renderer currentRenderer; Coroutine dissolveCoroutine; public void stopDissolveCoroutine () { if (dissolveCoroutine != null) { StopCoroutine (dissolveCoroutine); } } IEnumerator activateDissolveCoroutine () { var waitTime = new WaitForFixedUpdate (); while (true) { yield return waitTime; if (objectToDissolveFound) { if (Time.time > dissolveDelay + lastTimeDissolveActivated) { currentFadeValue += Time.deltaTime * dissolveSpeed; if (currentFadeValue <= 1) { int rendererPartsCount = rendererParts.Count; for (int i = 0; i < rendererPartsCount; i++) { currentRenderer = rendererParts [i]; if (currentRenderer != null) { int materialsLength = currentRenderer.materials.Length; for (int j = 0; j < materialsLength; j++) { currentRenderer.materials [j].SetFloat (dissolveShaderFieldName, currentFadeValue); } } } } if (Time.time > lastTimeDissolveActivated + timeToDestroyObject) { destroyObject (); stopDissolveCoroutine (); } } } } } public void activateDissolve (GameObject newOjectToDissolve) { if (!dissolveObjectEnabled) { return; } if (ignoreDissolveObjectEnabled) { return; } objectToDissolve = newOjectToDissolve; if (objectToDissolve.GetComponent ()) { objectToDissolveFound = true; currentTypeObjectFound = typeObjectFound.regularObject; } bool isCharacter = applyDamage.isCharacter (objectToDissolve); if (isCharacter) { objectToDissolve = applyDamage.getCharacter (objectToDissolve); objectToDissolveFound = true; currentTypeObjectFound = typeObjectFound.npc; } else { bool isVehicle = applyDamage.isVehicle (objectToDissolve); if (isVehicle) { objectToDissolve = applyDamage.getVehicle (objectToDissolve); objectToDissolveFound = true; currentTypeObjectFound = typeObjectFound.vehicle; } } if (objectToDissolveFound && objectToDissolve != null) { outlineObjectSystem currentOutlineObjectSystem = objectToDissolve.GetComponent (); if (currentOutlineObjectSystem != null) { currentOutlineObjectSystem.disableOutlineAndRemoveUsers (); } storeRenderElements (); } lastTimeDissolveActivated = Time.time; stopDissolveCoroutine (); dissolveCoroutine = StartCoroutine (activateDissolveCoroutine ()); } public void destroyObject () { if (objectToDissolve == null) { return; } if (useGameObjectList) { for (int i = 0; i < gameObjectList.Count; i++) { if (gameObjectList [i] != null) { Destroy (gameObjectList [i]); } } } if (currentTypeObjectFound == typeObjectFound.vehicle) { vehicleHUDManager currenVehicleHUDManager = objectToDissolve.GetComponent (); if (currenVehicleHUDManager != null) { currenVehicleHUDManager.destroyVehicleAtOnce (); } } if (currentTypeObjectFound == typeObjectFound.npc) { playerController currentPlayerController = objectToDissolve.GetComponent (); if (currentPlayerController != null) { currentPlayerController.destroyCharacterAtOnce (); } else { Destroy (objectToDissolve); } } if (currentTypeObjectFound == typeObjectFound.regularObject) { Destroy (objectToDissolve); } } public void storeRenderElements () { rendererParts.Clear (); originalShader.Clear (); materialList.Clear (); if (useGameObjectList) { for (int i = 0; i < gameObjectList.Count; i++) { if (gameObjectList [i] != null) { Component [] components = gameObjectList [i].GetComponentsInChildren (typeof (Renderer)); int componentsLength = components.Length; for (int j = 0; j < componentsLength; j++) { Renderer child = components [j] as Renderer; if (child.material.shader != null && !child.GetComponent ()) { rendererParts.Add (child); } } } } } else { Component [] components = objectToDissolve.GetComponentsInChildren (typeof (Renderer)); int componentsLength = components.Length; for (int j = 0; j < componentsLength; j++) { Renderer child = components [j] as Renderer; if (child.material.shader != null && !child.GetComponent ()) { rendererParts.Add (child); } } } int rendererPartsCount = rendererParts.Count; for (int i = 0; i < rendererPartsCount; i++) { currentRenderer = rendererParts [i]; if (currentRenderer != null) { int materialsLength = currentRenderer.materials.Length; for (int j = 0; j < materialsLength; j++) { Material currentMaterial = currentRenderer.materials [j]; originalShader.Add (currentMaterial.shader); materialList.Add (currentMaterial); currentMaterial.shader = shaderToApply; currentMaterial.SetTexture (dissolveShaderTextureFieldName, dissolveTexture); currentMaterial.SetColor (dissolveShaderColorFieldName, dissolveColor); currentMaterial.SetFloat (dissolveShaderAlphaColorFieldName, dissolveColorAlpha); } } } } public void setDissolveObjectEnabledState (bool state) { dissolveObjectEnabled = state; } public void setIgnoreDissolveObjectEnabledState (bool state) { ignoreDissolveObjectEnabled = state; } public void cancelDissolve () { objectToDissolveFound = false; if (Time.time > dissolveDelay + lastTimeDissolveActivated) { for (int j = 0; j < materialList.Count; j++) { materialList [j].shader = originalShader [j]; } } stopDissolveCoroutine (); } public void setDissolveObjectEnabledStateFromEditor (bool state) { setDissolveObjectEnabledState (state); updateComponent (); } void updateComponent () { GKC_Utils.updateComponent (this); GKC_Utils.updateDirtyScene ("Update Dissolve GameObject", gameObject); } }