RayCastВсе с камеры на плеер не работает - PullRequest
0 голосов
/ 16 февраля 2020

Попытка запустить лучевую трансляцию с моей камеры до Z = 0, которая ударит объекты в слое TransparentFX и временно сделает их прозрачными, так как они, вероятно, блокируют вид игрока. Но raycast никогда ничего не попадает.

Камера 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();
            }
        }
    }
}

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

1 Ответ

0 голосов
/ 16 февраля 2020

Разобрался. Я использовал RaycastHit2D и Physics2D.RaycastAll, которые используют параметры Vector2, так что переменная Z forward была исключена из уравнения. Переключился на Box Collider и Physics.RaycastAll и все отлично работает.

...