Unity3d 从摄影机到播放机的RayCastAll不工作

Unity3d 从摄影机到播放机的RayCastAll不工作,unity3d,2d,game-physics,Unity3d,2d,Game Physics,尝试从我的相机运行光线投射到Z=0,这将击中TransparentFX层上的对象,并暂时使它们透明,因为它们可能会阻挡播放器的视图。但是光线投射从来没有击中任何东西 摄像机 树 ClearSight.cs [RequireComponent(typeof(Camera))] public class ClearSight : MonoBehaviour { [SerializeField] private LayerMask raycastLayers; // Up

尝试从我的相机运行光线投射到Z=0,这将击中TransparentFX层上的对象,并暂时使它们透明,因为它们可能会阻挡播放器的视图。但是光线投射从来没有击中任何东西

摄像机

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

我明白了。我使用的是RaycastHit2D和Physics2D.RaycastAll,它使用Vector2参数,所以Z向前变量被从方程中去掉。切换到Box Collider和Physics.RaycastAll,效果很好

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