首页 > 解决方案 > 从相机到播放器的 RayCastAll 不工作

问题描述

尝试从我的相机运行光线投射到 Z = 0,这将击中 TransparentFX 层上的对象并暂时使它们透明,因为它们可能会阻挡玩家的视野。但是光线投射永远不会击中任何东西。

相机 https://imgur.com/lyTo8OZ

https://imgur.com/bgNiMWR

ClearSight.cs

[RequireComponent(typeof(Camera))]
public class ClearSight : MonoBehaviour
{
    [SerializeField]
    private LayerMask raycastLayers;

    // Update is called once per frame
    void Update()
    {
        Vector3 forward = transform.TransformDirection(Vector3.forward) * 10;
        Debug.DrawRay(transform.position, forward, Color.green);
        RaycastHit2D[] hits = Physics2D.RaycastAll(transform.position, transform.TransformDirection(Vector3.forward), 10f, raycastLayers);
        if(hits != null && hits.Length > 0)
        {
            Debug.Log("Found objects blocking player!");
            foreach(RaycastHit2D hit in hits)
            {
                Debug.Log("Making " + hit.transform.gameObject.name + " transparent!");
                AutoTransparent at = hit.transform.GetComponent<AutoTransparent>();
                if(at == null)
                {
                    at = hit.transform.gameObject.AddComponent<AutoTransparent>();
                }

                at.MakeTransparent();
            }
        }
    }
}

自动透明.cs

[RequireComponent(typeof(SpriteRenderer))]
public class AutoTransparent : MonoBehaviour
{
    [SerializeField]
    private SpriteRenderer[] renderTargets;
    [SerializeField]
    private float transparentRecoveryTime = 0.1f;

    private bool isTransparent = false;
    private float transparencyTimer = 0;

    private void Update()
    {
        if (isTransparent)
        {
            UpdateTransparencyTimer();
        }
    }

    private void UpdateTransparencyTimer()
    {
        transparencyTimer += Time.deltaTime / transparentRecoveryTime;
        if(transparencyTimer >= 1)
        {
            MakeOpaque();
        }
    }

    public void MakeTransparent()
    {
        transparencyTimer = 0;
        if (!isTransparent)
        {
            isTransparent = true;
            foreach (SpriteRenderer renderer in renderTargets)
            {
                Color c = renderer.color;
                renderer.color = new Color(c.r, c.g, c.b, 0.3f);
            }
        }
    }

    public void MakeOpaque()
    {
        isTransparent = false;
        foreach(SpriteRenderer renderer in renderTargets)
        {
            Color c = renderer.color;
            renderer.color = new Color(c.r, c.g, c.b, 1);
        }
    }
}

标签: unity3d2dgame-physics

解决方案


弄清楚了。我使用的是 RaycastHit2D 和 Physics2D.RaycastAll,它们使用 Vector2 参数,因此 Z 前向变量被排除在方程之外。切换到 Box Collider 和 Physics.RaycastAll 效果很好。


推荐阅读