// OnTriggerEnter is called when the Collider other enters the trigger public void OnTriggerEnter(Collider other) { int objLayer = 1 << other.gameObject.layer; if (other.isTrigger && ignoreTriggers || other.CompareTag(playerTag) || (layersToFade & objLayer) != objLayer) { return; } // Retrieve all the renderers Renderer[] rendererWeHit = other.gameObject.GetComponentsInChildren <Renderer>(); // Loop through the renderers for (int idx = 0; idx < rendererWeHit.Length; idx++) { if (rendererWeHit[idx] != null) // just to be on the safe side :) { // If we changed this already we skip it, otherwise we proceed with the change if (!modifiedShaders.ContainsKey(rendererWeHit[idx].GetInstanceID())) { ShaderData shaderData = new ShaderData(); FadingManager fade = rendererWeHit[idx].gameObject.GetComponent <FadingManager>(); if (fade != null) { fade.GoAway(); } shaderData.renderer = rendererWeHit[idx]; shaderData.materials = rendererWeHit[idx].materials; Material[] tmpMats = rendererWeHit[idx].materials; shaderData.color = new Color[rendererWeHit[idx].materials.Length]; for (int j = 0; j < tmpMats.Length; j++) { shaderData.color[j] = tmpMats[j].color; tmpMats[j] = new Material(transparentMaterial); tmpMats[j].color = fadingColorToUse; if (replicateTexture) { tmpMats[j].mainTexture = rendererWeHit[idx].materials[j].mainTexture; } else { tmpMats[j].mainTexture = null; } } rendererWeHit[idx].materials = tmpMats; // Add the shader to the list of those that have been changed modifiedShaders.Add(rendererWeHit[idx].GetInstanceID(), shaderData); fade = rendererWeHit[idx].gameObject.AddComponent <FadingManager>(); fade.fadingTime = fadingTime; fade.fadingAmount = transparenceValue; } } } }
// OnTriggerExit is called when the Collider other has stopped touching the trigger public void OnTriggerExit(Collider other) { // Retrieve all the renderers Renderer[] rendererWeHit = other.gameObject.GetComponentsInChildren <Renderer>(); List <int> renderersToRestore = new List <int>(); for (int idx = 0; idx < rendererWeHit.Length; idx++) { int key = rendererWeHit[idx].GetInstanceID(); if (modifiedShaders.ContainsKey(key)) { renderersToRestore.Add(key); } } for (int i = 0; i < renderersToRestore.Count; i++) { ShaderData sd = modifiedShaders[renderersToRestore[i]]; modifiedShaders.Remove(renderersToRestore[i]); for (int m = 0; m < sd.materials.Length; m++) { FadingManager fade = sd.renderer.gameObject.GetComponent <FadingManager>(); if (fade != null) { fade.GoAway(); } fade = sd.renderer.gameObject.AddComponent <FadingManager>(); fade.fadingTime = fadingTime; fade.fadingAmount = transparenceValue; fade.fadeOut = false; fade.matIdx = m; fade.oldMat = sd.materials[m]; fade.oldColor = sd.color[m]; } } Resources.UnloadUnusedAssets(); }
// This function is called every fixed framerate frame, if the MonoBehaviour is enabled private void FixedUpdate() { if (playerTransform == null) // Do nothing if we have no target { return; } // Let's retrieve all the objects in the way of the camera #if UNITY_5_0 || UNITY_5_1 if (!useSpherecast) { hit = Physics.RaycastAll(myTransform.position, myTransform.forward, (playerTransform.position - myTransform.position).magnitude + offset, layersToFade); } else { hit = Physics.SphereCastAll(myTransform.position, spherecastRadius, myTransform.forward, (playerTransform.position - myTransform.position).magnitude + offset, layersToFade); } #else if (!useSpherecast) { hit = Physics.RaycastAll(myTransform.position, myTransform.forward, (playerTransform.position - myTransform.position).magnitude + offset, layersToFade, ignoreTriggers ? QueryTriggerInteraction.Ignore : QueryTriggerInteraction.Collide); } else { hit = Physics.SphereCastAll(myTransform.position, spherecastRadius, myTransform.forward, (playerTransform.position - myTransform.position).magnitude + offset, layersToFade, ignoreTriggers ? QueryTriggerInteraction.Ignore : QueryTriggerInteraction.Collide); } #endif Debug.DrawLine(myTransform.position, playerTransform.position + (myTransform.forward * offset), fadingColorToUse, Time.fixedDeltaTime); List <int> renderersIdsHitInThisFrame = new List <int>(); if (hit != null) { // Parse all objects we hit for (int i = 0; i < hit.Length; i++) { if (hit[i].collider.isTrigger && ignoreTriggers) { continue; } // Ignore the player :) if (!(hit[i].collider.CompareTag(playerTag) || hit[i].collider.CompareTag("NoFade"))) { // Retrieve all the renderers Renderer[] rendererWeHit = hit[i].collider.gameObject.GetComponentsInChildren <Renderer>(); // Loop through the renderers for (int idx = 0; idx < rendererWeHit.Length; idx++) { if (rendererWeHit[idx] != null) // just to be on the safe side :) { // Store the render's unique Id among those hit during the current frame renderersIdsHitInThisFrame.Add(rendererWeHit[idx].GetInstanceID()); // If we changed this already we skip it, otherwise we proceed with // the change if (!modifiedShaders.ContainsKey(rendererWeHit[idx].GetInstanceID())) { ShaderData shaderData = new ShaderData(); FadingManager fade = rendererWeHit[idx].gameObject.GetComponent <FadingManager>(); if (fade != null) { fade.GoAway(); } shaderData.renderer = rendererWeHit[idx]; shaderData.materials = rendererWeHit[idx].materials; Material[] tmpMats = rendererWeHit[idx].materials; shaderData.color = new Color[rendererWeHit[idx].materials.Length]; for (int j = 0; j < tmpMats.Length; j++) { shaderData.color[j] = tmpMats[j].color; tmpMats[j] = transparentMaterial; tmpMats[j].color = fadingColorToUse; if (replicateTexture) { tmpMats[j].mainTexture = rendererWeHit[idx].materials[j].mainTexture; } else { tmpMats[j].mainTexture = null; } } rendererWeHit[idx].materials = tmpMats; // Add the shader to the list of those that have been changed modifiedShaders.Add(rendererWeHit[idx].GetInstanceID(), shaderData); fade = rendererWeHit[idx].gameObject.AddComponent <FadingManager>(); fade.fadingTime = fadingTime; fade.fadingAmount = transparenceValue; } } } } } } // Now let's restore those shaders that we changed but now they are no longer in the way List <int> renderersToRestore = new List <int>(); foreach (KeyValuePair <int, ShaderData> elemento in modifiedShaders) { if (!renderersIdsHitInThisFrame.Contains(elemento.Key)) { renderersToRestore.Add(elemento.Key); } } for (int i = 0; i < renderersToRestore.Count; i++) { ShaderData sd = modifiedShaders[renderersToRestore[i]]; modifiedShaders.Remove(renderersToRestore[i]); for (int m = 0; m < sd.materials.Length; m++) { FadingManager fade = sd.renderer.gameObject.GetComponent <FadingManager>(); if (fade != null) { fade.GoAway(); } fade = sd.renderer.gameObject.AddComponent <FadingManager>(); fade.fadingTime = fadingTime; fade.fadingAmount = transparenceValue; fade.fadeOut = false; fade.matIdx = m; fade.oldMat = sd.materials[m]; fade.oldColor = sd.color[m]; } } Resources.UnloadUnusedAssets(); }