시야
Coddy Unity 여정의 물리와 게임플레이 섹션에 포함된 레슨. 71개 중 39번째.
경비원 가까이에 있다고 해서 경비원에게 보이는 것은 아닙니다. 그 사이에 벽이 있으면 시야가 차단됩니다. 시야가 확보되는지 확인하려면 눈에서 표적을 향해 레이를 쏘고, 레이가 처음 맞힌 것이 표적 자체인지 확인하세요. 방향은 표적의 위치에서 자신의 위치를 뺀 값이며, 그만큼 길게 쏜 레이는 표적에 닿습니다.
public Transform target;
bool CanSee()
{
Vector3 toTarget = target.position - transform.position;
if (Physics.Raycast(transform.position, toTarget, out RaycastHit hit, toTarget.magnitude))
{
return hit.transform == target;
}
return false;
}CanSee()가 true인 동안 I see you를 기록합니다. 표적이 탁 트인 곳에 있으면 레이가 처음 맞히는 대상은 표적입니다. 표적이 상자 뒤에 있으면 레이는 먼저 상자를 맞히고, hit.transform은 상자의 것이므로 결과는 false입니다. Physics.Raycast만으로도 상자에 맞으면 true를 반환하기 때문에, 맞힌 대상과 표적을 비교합니다.
레이가 표적을 찾으려면 표적에 콜라이더가 있어야 합니다. maxDistance에서 레이의 길이가 정해지므로 방향을 정규화할 필요는 없습니다. Physics.Linecast(from, to)는 두 점 사이에 콜라이더가 있는지 반대로 확인합니다. !Physics.Linecast(eye, target.position, wallMask)는 가로막는 벽이 없다는 뜻입니다.
챌린지
중급플레이어가 보일 때는 보초를 빨간색으로, 그렇지 않으면 초록색으로 칠하세요.
bool CanSee()를 작성하세요.Vector3 toPlayer = player.position - transform.position;를 사용하고,toPlayer.magnitude > range일 때false를 반환하세요.- 그런 다음
Physics.Raycast(transform.position, toPlayer, out RaycastHit hit, range)를 호출하고hit.transform == player를 반환하세요. 빗나가면false를 반환합니다. Update()에서CanSee()의 결과에 따라 탑의 색을Color.red또는Color.green으로 설정하세요.
‘플레이’를 누르고 벽 뒤로 걸어가세요. 그런 다음 ‘확인’을 누르세요.
직접 해보기
using UnityEngine;
public class Sentry : MonoBehaviour
{
public Transform player;
public float range = 8f;
void Update()
{
// 감시자가 플레이어를 볼 수 있으면 빨간색, 그렇지 않으면 초록색.
}
}
물리와 게임플레이의 모든 레슨
직접 연습해 보세요: Unity 플레이그라운드