시야
Coddy Unity 여정의 물리와 게임플레이 섹션에 포함된 레슨. 63개 중 37번째.
경비원 가까이에 있다고 해서 그에게 보이는 것은 아닙니다. 중간에 벽이 있으면 시야가 가로막힙니다. 시야를 확인하려면 눈에서 타깃을 향해 광선을 쏘고, 광선이 처음으로 맞히는 것이 타깃 자체인지 확인합니다. 방향은 타깃의 위치에서 자신의 위치를 뺀 값이며, 그 길이만큼 뻗는 광선은 타깃에 도달합니다.
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)는 가로막는 벽이 없다는 뜻입니다.
챌린지
중급보초탑은 플레이어를 감시합니다. Sentry 스크립트는 탑에 붙어 있고, Inspector에서 player와 range를 8로 설정합니다. 탑의 색으로 무엇이 보이는지 확인할 수 있습니다.
- 플레이어가 보이는 동안 탑을 빨간색(
Color.red)으로, 그렇지 않으면 초록색(Color.green)으로 칠하세요. - 플레이어가
range단위보다 멀리 있지 않고 사이에 아무것도 없을 때만 플레이어가 보입니다.
Play를 누르고 화살표 키로 플레이어를 벽 주변으로 움직인 다음 Check를 누르세요.
직접 해보기
using UnityEngine;
public class Sentry : MonoBehaviour
{
public Transform player;
public float range = 8f;
void Update()
{
// 보초가 플레이어를 볼 수 있으면 빨간색, 그렇지 않으면 초록색.
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.