Physics2D.CircleCast в 3d-сцене, проходящей через спрайтовый объект, который должен попасть - PullRequest
0 голосов
/ 02 апреля 2020

Я не могу идентифицировать конкретный паттерн с поведением, которое я наблюдаю, но по сути моя CircleCast() будет чаще всего игнорировать объекты, которые, по моему мнению, должны обнаруживаться.

Макет сцены по сути: «курсор» (красный круг), который следует за мышью по оси x, y и препятствию (белый круг, копия красного круга, поэтому они должны вести себя идентично радиопередаче). Есть также ортографическая камера c, обращенная к двум объектам - луч должен быть направлен от точки z камеры вперед к курсору.

enter image description here

К курсору и препятствию прикреплены двухмерные компоненты Circle Collider, и оба находятся на слое «SealantGuideLayer».

Вот мой скрипт Raycaster, который направляет луч на мышь x, y pos, когда мышь находится нажата (и также устанавливает положение курсора при перемещении мыши):

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

public class Raycaster : MonoBehaviour
{
    public GameObject cursor;
    public Camera cam;

    void Update()
    {
        /// Cast ray
        if (Input.GetMouseButtonDown(0))
        {
            Vector3 cursorPos = cursor.transform.position;
            Vector3 rayOrigin = new Vector3(
                    cursorPos.x,
                    cursorPos.y,
                    cam.transform.position.z
                );
            float cursorRad = cursor.GetComponent<SpriteRenderer>().size.x / 2;

            int sealantGuideLayer = 1 << 9;

            Vector3 rayDirection = cursorPos - rayOrigin;

            RaycastHit2D hit_circle = Physics2D.CircleCast(rayOrigin, cursorRad, rayDirection, 10f, sealantGuideLayer);

            Debug.DrawRay(rayOrigin, rayDirection * 10, Color.yellow);

            if (hit_circle.collider != null)
            {
                Debug.Log("-----------------Hit: " + hit_circle.transform.name);
            }
            else
            {
                Debug.Log("No hit");
            }
        }   

        /// Set cursor pos
        Vector3 p = cam.ScreenToWorldPoint(Input.mousePosition);

        cursor.transform.position = new Vector3(p.x, p.y, 0f);
    }
}

Публичные c Переменные Raycaster назначаются в инспекторе следующим образом:

enter image description here

Вот видео, показывающее проблему в действии: https://youtu.be/Nl7iXlI-mW0 - обратите внимание в консоли, что попадание всегда "CursorRed", даже если объект "Препятствие" явно находится в спереди и находится на слое SealantGuideLayer.

Edit

Я получаю ту же проблему при использовании 3d BoxColliders и выполняю Physics.SphereCast.

проблемы нет при использовании рег lar Physics.Raycast ...

...