Мой Raycast, кажется, не имеет никакого диапазона - только обнаруживает объекты, помещенные рядом с испускающим gameobject - PullRequest
0 голосов
/ 03 марта 2019

Я использую следующий код (от: https://gist.github.com/valryon/566c02f3c5808dcd9968) для генерации 2D-лазера в моей игре. У лазера есть начальная, средняя и конечная части. Они составляют лазер и прикреплены к родителю.gameobject.

public class LaserScript : MonoBehaviour
{
    [Header("Laser pieces")]
    public GameObject laserStart;
    public GameObject laserMiddle;
    public GameObject laserEnd;

    private GameObject start;
    private GameObject middle;
    private GameObject end;

    void Update()
    {
        // Create the laser start from the prefab
        if (start == null)
        {
            start = Instantiate(laserStart) as GameObject;
            start.transform.parent = this.transform;
            start.transform.localPosition = Vector2.zero;
        }

        // Laser middle
        if (middle == null)
        {
            middle = Instantiate(laserMiddle) as GameObject;
            middle.transform.parent = this.transform;
            middle.transform.localPosition = Vector2.zero;
        }

        // Define an "infinite" size, not too big but enough to go off screen
        float maxLaserSize = 200f;
        float currentLaserSize = maxLaserSize;

        // Raycast at the right as our sprite has been design for that
        Vector2 laserDirection = this.transform.right;
        RaycastHit2D hit = Physics2D.Raycast(this.transform.position, laserDirection, maxLaserSize);
        Debug.Log(hit.collider.tag);
        if (hit.collider.tag == "Enemy")
        {
            // We touched something!

            // -- Get the laser length
            currentLaserSize = Vector2.Distance(hit.point, this.transform.position);

            // -- Create the end sprite
            if (end == null)
            {
                end = Instantiate(laserEnd) as GameObject;
                end.transform.parent = this.transform;
                end.transform.localPosition = Vector2.zero;
            }
        }
        else
        {
            // Nothing hit
            // -- No more end
            if (end != null) Destroy(end);
        }

        // Place things
        // -- Gather some data
        float startSpriteWidth = start.GetComponent<Renderer>().bounds.size.x;
        float endSpriteWidth = 0f;
        if (end != null) endSpriteWidth = end.GetComponent<Renderer>().bounds.size.x;

        // -- the middle is after start and, as it has a center pivot, have a size of half the laser (minus start and end)
        middle.transform.localScale = new Vector3(currentLaserSize - startSpriteWidth, middle.transform.localScale.y, middle.transform.localScale.z);
        middle.transform.localPosition = new Vector2((currentLaserSize / 2f), 0f);

        // End?
        if (end != null)
        {
            end.transform.localPosition = new Vector2(currentLaserSize, 0f);
        }

    }
}

Сценарий должен иметь эффект, показанный на рисунке ниже:

enter image description here

Но мой лазер обнаруживает толькообъект, когда он находится прямо перед ним, когда стартовая часть лазера действительно касается только врага, тогда Debug.Log сообщает Enemy в противном случае его неизвестно.

Я получаю желаемый эффект, как показано наgif, но мой raycast не обнаруживает врагов, пока игрок, стреляющий лазером, не встанет рядом с врагом.

В чем может быть причина этого?

Спасибо

1 Ответ

0 голосов
/ 03 марта 2019

Physics.Raycast() возвращает boolean, а не RaycastHit.

Используйте следующий синтаксис для получения информации о коллайдере:

public static bool Raycast(Vector3 origin, Vector3 direction, out RaycastHit hitInfo, float maxDistance);

Этокод проверяет, попал ли Raycast в что-то и сохраняет информацию коллайдера в ударе:

RaycastHit hit;

if(Physics.Raycast(transform.position, laserDirection, out hit, maxLaserSize))
{
    Debug.Log(hit.collider.tag);
}
...