Search code examples
unity-game-enginerendering

Make objects between camera and character transparent


I'm working on a script for my camera to make objects between itself and the character transparent.

I managed to make it work with RayCast however I don't know how to restablish objects alpha value after they escape the ray.

This is my current code:

private void XRay() {
    float characterDistance = Vector3.Distance(transform.position, GameObject.Find("Character").transform.position);
    Vector3 fwd = transform.TransformDirection(Vector3.forward);

    RaycastHit hit;
    if (Physics.Raycast(transform.position, fwd, out hit, characterDistance)) {

        // Add transparence
        Color color = hit.transform.gameObject.renderer.material.color;
        color.a = 0.5f;
        hit.transform.gameObject.renderer.material.SetColor("_Color", color);
    }
}

Solution

  • This is my final code. Note it only makes transparent one object at a time, but the same implementation can easily be done with RaycastAll and using an array for oldHits.

    public class Camara : MonoBehaviour {
        RaycastHit oldHit;
    
        // Use this for initialization
        void Start () {
    
        }
    
        // Update is called once per frame
        void Update () {
    
        }
    
        void FixedUpdate() {
            XRay ();
        }
    
        // Hacer a los objetos que interfieran con la vision transparentes
        private void XRay() {
    
            float characterDistance = Vector3.Distance(transform.position, GameObject.Find("Character").transform.position);
            Vector3 fwd = transform.TransformDirection(Vector3.forward);
    
            RaycastHit hit;
            if (Physics.Raycast(transform.position, fwd, out hit, characterDistance)) {
                if(oldHit.transform) {
    
                    // Add transparence
                    Color colorA = oldHit.transform.gameObject.renderer.material.color;
                    colorA.a = 1f;
                    oldHit.transform.gameObject.renderer.material.SetColor("_Color", colorA);
                }
    
                // Add transparence
                Color colorB = hit.transform.gameObject.renderer.material.color;
                colorB.a = 0.5f;
                hit.transform.gameObject.renderer.material.SetColor("_Color", colorB);
    
                // Save hit
                oldHit = hit;
            }
        }
    }