수색…


매개 변수

매개 변수 세부
유래 세계 좌표에서의 광선의 시작점
방향 광선의 방향
최대 거리 광선이 충돌을 확인해야하는 최대 거리
레이어 마스크 레이를 캐스팅 할 때 Colliders를 선택적으로 무시하는 데 사용되는 레이어 마스크입니다.
queryTriggerInteraction 이 쿼리가 트리거를 치는 위치를 지정합니다.

물리학 Raycast

이 함수는 장면의 모든 충돌 maxDistance 으로 길이가 maxDistance 방향 directionorigin 에서 광선을 캐스팅합니다.

이 함수는 origin direction maxDistance 취하여 GameObject 앞에 충돌자가 있는지 계산합니다.

Physics.Raycast(origin, direction, maxDistance);

예를 들어,이 함수는 연결된 GameObject 의 10 단위 내에 무언가가 있다면 Hello World 를 콘솔에 출력합니다 :

using UnityEngine;

public class TestPhysicsRaycast: MonoBehaviour 
{
    void FixedUpdate() 
    {
        Vector3 fwd = transform.TransformDirection(Vector3.forward);
        
        if (Physics.Raycast(transform.position, fwd, 10)) 
            print("Hello World");
    }
}

Physics2D Raycast2D

레이 캐스트를 사용하면 AI가 레벨의 가장자리에서 떨어지지 않고 걸을 수 있는지 확인할 수 있습니다.

using UnityEngine;
    
public class Physics2dRaycast: MonoBehaviour 
    {
        public LayerMask LineOfSightMask;
        void FixedUpdate() 
        {
            RaycastHit2D hit = Physics2D.Raycast(raycastRightPart, Vector2.down, 0.6f * heightCharacter, LineOfSightMask);
            if(hit.collider != null)
            {
                //code when the ai can walk
            }
            else
            {
                //code when the ai cannot walk
            }
    }
}

이 예에서는 방향이 올바르다. 변수 raycastRightPart는 문자의 오른쪽 부분이므로 레이 캐스팅은 문자의 오른쪽 부분에서 발생합니다. 거리는 캐릭터의 높이의 0.6 배가되기 때문에 레이캐스팅은 그가 현재 서있는지면보다 낮은 곳에있는지면에 명중하지 않습니다. Layermask가지면으로 만 설정되어 있는지 확인하십시오. 그렇지 않으면 다른 종류의 객체도 감지합니다.

RaycastHit2D 자체는 클래스가 아니므로 구조체이므로 히트는 null이 될 수 없습니다. 즉, RaycastHit2D 변수의 충돌자를 확인해야합니다.

캡슐 레이크 콜 호출

스크립트가 Raycast 직접 호출하게되면 변경 사항을 수용하기 위해 모든 LayerMask 필드를 추적해야하므로 충돌 매트릭스를 나중에 변경해야하는 경우 문제가 발생할 수 있습니다. 프로젝트의 크기에 따라 이것은 큰 사업이 될 수 있습니다.

Raycast 통화를 캡슐화 Raycast 삶이 더 쉬워 질 수 있습니다.

SoC 원리에서 보면, 게임 객체는 실제로 레이어 마스크에 대해 알거나 신경 쓰지 않아야합니다. 주변을 스캔하는 방법 만 있으면됩니다. 레이 캐스트 결과가이를 반환하는지 또는 게임 개체가 중요하지 않아야하는지 여부. 그것은 오직 그것이받는 정보에만 작용해야하며 존재하는 환경에 대해 어떤 가정도하지 말아야한다.

이 문제에 접근하는 한 가지 방법은 LayerMask 값을 ScriptableObject 인스턴스로 이동하여 스크립트에 삽입하는 레이 캐스트 서비스 형태로 사용하는 것입니다.

// RaycastService.cs
using UnityEngine;

[CreateAssetMenu(menuName = "StackOverflow")]
public class RaycastService : ScriptableObject
{
    [SerializeField]
    LayerMask layerMask;

    public RaycastHit2D Raycast2D(Vector2 origin, Vector2 direction, float distance)
    {
        return Physics2D.Raycast(origin, direction, distance, layerMask.value);
    }

    // Add more methods as needed

}
// MyScript.cs
using UnityEngine;

public class MyScript : MonoBehaviour
{
    [SerializeField]
    RaycastService raycastService;

    void FixedUpdate()
    {
        RaycastHit2D hit = raycastService.Raycast2D(Vector2.zero, Vector2.down, 1f);
    }
}

이를 통해 다양한 상황에 따라 다양한 LayerMask 조합으로 다양한 레이 캐스트 서비스를 만들 수 있습니다. 당신은 지상 충돌 자만 공격 할 수 있고 다른 하나는 지상 충돌 자와 일방 플랫폼을 공격 할 수 있습니다.

LayerMask 설정을 크게 변경해야하는 경우 이러한 RaycastService 자산 만 업데이트하면됩니다.

추가 읽기



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow