Unity3d 使摄影机和角色之间的对象透明

Unity3d 使摄影机和角色之间的对象透明,unity3d,rendering,Unity3d,Rendering,我正在为我的相机制作一个脚本,使相机本身和角色之间的对象透明 我设法使它与光线投射一起工作,但我不知道如何在对象逃逸光线后重新设置alpha值 这是我当前的代码: private void XRay() { float characterDistance = Vector3.Distance(transform.position, GameObject.Find("Character").transform.position); Vector3 fwd = transform.T

我正在为我的相机制作一个脚本,使相机本身和角色之间的对象透明

我设法使它与光线投射一起工作,但我不知道如何在对象逃逸光线后重新设置alpha值

这是我当前的代码:

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);
    }
}

这是我的最终代码。请注意,它一次只能使一个对象透明,但同样的实现可以很容易地使用和使用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;
        }
    }
}

我确实在我的简单相机上附加了这个脚本。这可能对你有帮助。 实际上,它可以管理多个阻碍视图的障碍物,而且您可以看到我向它传递了一个带有其名称的遮罩,而不是检查碰撞器名称标记。玩得开心

using UnityEngine;

public class followPlayer : MonoBehaviour
{
    public Transform player;
    public Vector3 offset;
    public Transform[] obstructions;

    private int oldHitsNumber;

    void Start()
    {
        oldHitsNumber = 0;
    }

    private void LateUpdate()
    {
        viewObstructed();
    }

    void Update()
    {
        transform.position = player.TransformPoint(offset);
        transform.LookAt(player);
    }

    void viewObstructed()
    {
        float characterDistance = Vector3.Distance(transform.position, player.transform.position);
        int layerNumber = LayerMask.NameToLayer("Walls");
        int layerMask = 1 << layerNumber;
        RaycastHit[] hits = Physics.RaycastAll(transform.position, player.position - transform.position, characterDistance, layerMask);
        if (hits.Length > 0)
        {   // Means that some stuff is blocking the view
            int newHits = hits.Length - oldHitsNumber;

            if (obstructions != null && obstructions.Length > 0 && newHits < 0)
            {
                // Repaint all the previous obstructions. Because some of the stuff might be not blocking anymore
                for (int i = 0; i < obstructions.Length; i++)
                {
                    obstructions[i].gameObject.GetComponent<MeshRenderer>().shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.On;
                }
            }
            obstructions = new Transform[hits.Length];
            // Hide the current obstructions 
            for (int i = 0; i < hits.Length; i++)
            {
                Transform obstruction = hits[i].transform;
                obstruction.gameObject.GetComponent<MeshRenderer>().shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.ShadowsOnly;
                obstructions[i] = obstruction;
            }
            oldHitsNumber = hits.Length;
        }
        else
        {   // Mean that no more stuff is blocking the view and sometimes all the stuff is not blocking as the same time
            if (obstructions != null && obstructions.Length > 0)
            {
                for (int i = 0; i < obstructions.Length; i++)
                {
                    obstructions[i].gameObject.GetComponent<MeshRenderer>().shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.On;
                }
                oldHitsNumber = 0;
                obstructions = null;
            }
        }
    }
}