(1) ProjectOnPlane
함수 | 설명 | 예시 |
ProjectOnPlane(Vector3 vector, Vector3 planeNormal) | vector를 planeNormal에 평면에 투영한 벡터를 반환합니다. 결과 벡터는 plane에 평행합니다. | 경사면을 따라 이동하는 캐릭터의 움직임을 슬로프의 평면에 투영하여 올바른 이동 방향을 얻습니다. |
'ProjectOnPlane(Vector3 Player의 이동방향, PlaneNormal)'은 Plane의 Normal에 수직인 방향의 투영된 벡터를 Return해줍니다.
즉, MoveVector는 Plane에 Normal에 수직인 방향(ProjectOnPlane Vector)에 투영된 벡터로 반영됩니다. 즉 '무지(Icon)'가 있는 곳까지가 MoveVector가 됩니다.
(2) Dot
함수 | 설명 | 예시 |
Dot(Vector3 lhs, Vector3 rhs) | 두 벡터의 내적을 반환합니다. 내적은 한 벡터가 다른 벡터의 방향으로 얼마나 이동하는지 측정한 것입니다. | 플레이어가 앞에 있을 때만 반응해야 하는 적 캐릭터를 파악할 때 사용합니다. |
Vector3 playerToEnemy = enemy.position - player.position;
float dotProduct = Vector3.Dot(player.forward, playerToEnemy.normalized);
if(dotProduct > 0)
{
Debug.Log("Enemy is in front of player");
}
else if(dotProduct < 0)
{
Debug.Log("Enemy is behind the player");
}
else
{
Debug.Log("Enemy is right beside the player");
}
두 벡터의 내적을 구한 다음 양수면 플레이어의 앞에 있는 것이며 음수면 플레이어 뒤에 있는 것입니다.
이 코드를 응용해서 플레이어의 시야각 기능을 구현할 수 있습니다.
public class Player : MonoBehaviour
{
public float fieldOfView = 90.0f; // 시야각 설정
public GameObject enemy;
void Update()
{
Vector3 playerToEnemy = enemy.transform.position - transform.position;
playerToEnemy.Normalize();
// player의 전방 벡터와 player에서 enemy로 가는 벡터 사이의 각도를 계산
float angle = Vector3.Angle(transform.forward, playerToEnemy);
// 계산된 각도가 시야각 범위 내에 있는지 확인
if (angle < fieldOfView * 0.5f)
{
Debug.Log("Enemy is in the field of view");
}
else
{
Debug.Log("Enemy is out of the field of view");
}
}
}
플레이어의 시야각 범위 내에 들어와 있는지 파악할 수 있습니다.
이때, '0.5f'를 곱하는 이유는 지정하는 시야 각도가 일반적으로 플레이어 시야의 가장 왼쪽에서 가장 오른쪽 가장자리까지(아래 영상을 참고하시면 초록색 레이저가 되겠습니다) 확장되는 전체 각도로 간주되기 때문입니다.
Vector3.Angle 함수는 두 벡터 사이의 가장 작은 각도를 반환합니다. 이 각도는 항상 0도에서 180도 사이의 양수 값입니다. 각도가 플레이어의 전진 방향의 왼쪽인지 오른쪽인지 알려주지 않습니다. 따라서 계산된 각도와 시야각을 비교할 때 플레이어의 전방 방향 양쪽에서 시야각의 절반 이내인지 확인해야 합니다.
그렇기 때문에 'fieldOfView'에 '0.5f'를 곱하여 반각 또는 플레이어의 전방 방향에서 시야의 한 측면까지의 각도를 구합니다. 이렇게 하면 angle이 fieldOfView * 0.5f보다 작은지 확인할 때 적군이 전방 양쪽에서 플레이어의 시야 내에 있는지 효과적으로 확인합니다.
(3) Cross
함수 | 설명 | 예시 |
Cross(Vector3 lhs, Vector3 rhs) | 두 벡터의 외적을 반환합니다. 외적은 두 벡터가 놓여 있는 평면에 수직인 벡터입니다. | 항상 지면을 따라 이동해야 하는 캐릭터의 전방 방향과 그라운드 노멀에 수직인 벡터를 계산합니다. |
왼 손을 준비해주세요.
왼손의 엄지손가락이 Lhs가 되는 것이며, 검지손가락이 Rhs가 되는겁니다.
그 상태로 중지손가락을 펼치면 그게 Cross Vector가 되는 것입니다.