Как определить, перекрывает ли спрайт какой-либо фоновый спрайт? - PullRequest
0 голосов
/ 29 октября 2019

When the horse object goes over the edge of the rectangle I want to rotate the horse and carriage. Я хочу определить, находится ли пустой игровой объект между спрайтом, который я нарисовал, и камерой.

Объекты фона помечены как «Фон» и находятся в слое «фон».

В настоящее время оператор Debug.log всегда говорит «Не обнаруживает фон». Я несколько раз пытался переключить направление радиопередачи с заднего на прямое, но это не помогло. Игровой объект, стреляющий в луч, имеет позицию z, равную -1, а спрайт - позицию z, равную 0. На спрайте имеется двумерный коробчатый коллайдер.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RoomMaker : MonoBehaviour
{
    public float speed = 5;
    public float distance = 5;

    public Transform horse;
    public Transform carriage;


    void Update()
    {
        transform.Translate(Vector2.right * speed * Time.deltaTime);

        RaycastHit2D backgroundInfo = Physics2D.Raycast(horse.position, Vector3.forward, distance);
        if (backgroundInfo)
        {
            Debug.Log("DETECTSBACKGROUND");

        }
        else
        {
            Debug.Log("Does not detect Background"); 
            //it always displays this one, it never displays the other debug.log

        }

    }
}

1 Ответ

0 голосов
/ 29 октября 2019

Рассмотрите возможность использования Physics2D.OverlapPointAll вместо raycast.

Для этого потребуется, чтобы фоновые спрайты имели Collider2D компонентов на своих игровых объектах, а их игровые объекты были помечены Background и включеныслой background.

Я советую, чтобы слой background игнорировал столкновения со всем. См. документацию по физике 2d для получения дополнительной информации о том, как это сделать.

Вот как может выглядеть код:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RoomMaker : MonoBehaviour
{
    public float speed = 5;
    public float distance = 5;

    public Transform horse;
    public Transform carriage;


    void FixedUpdate() // otherwise, visual lag can make for inconsistent collision checking.
    {
        transform.Translate(Vector2.right * speed * Time.deltaTime);

        Collider2D[] cols = Physics2D.OverlapPointAll(
                Vector3.Scale(new Vector3(1,1,0), horse.position), // background at z=0 
                LayerMask.GetMask("background")); // ignore non background layer objects


        Collider2D backgroundCol = null;
        for (int i = 0 ; i < cols.Length ; i++) // order of increasing z value
        {
            if (cols[i].tag == "Background") // may be redundant with layer mask
            {
                backgroundCol = cols[i];
                break;
            }
        }


        if (backgroundCol != null)
        {
            Debug.Log("DETECTSBACKGROUND: " + backgroundCol.name);

        }
        else
        {
            Debug.Log("Does not detect Background");     
        }

    }
}

Я тестировал с этой настройкой:

Test setup

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...