unity3d
레이 캐스팅
수색…
매개 변수
매개 변수 | 세부 |
---|---|
유래 | 세계 좌표에서의 광선의 시작점 |
방향 | 광선의 방향 |
최대 거리 | 광선이 충돌을 확인해야하는 최대 거리 |
레이어 마스크 | 레이를 캐스팅 할 때 Colliders를 선택적으로 무시하는 데 사용되는 레이어 마스크입니다. |
queryTriggerInteraction | 이 쿼리가 트리거를 치는 위치를 지정합니다. |
물리학 Raycast
이 함수는 장면의 모든 충돌 maxDistance
으로 길이가 maxDistance
방향 direction
점 origin
에서 광선을 캐스팅합니다.
이 함수는 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 자산 만 업데이트하면됩니다.