유니티 Vector3

(1) ProjectOnPlane

함수 설명 예시
ProjectOnPlane(Vector3 vector, Vector3 planeNormal) vector를 planeNormal에 평면에 투영한 벡터를 반환합니다. 결과 벡터는 plane에 평행합니다. 경사면을 따라 이동하는 캐릭터의 움직임을 슬로프의 평면에 투영하여 올바른 이동 방향을 얻습니다. 

ProjectOnPlane

 

'ProjectOnPlane(Vector3 Player의 이동방향, PlaneNormal)'은 Plane의 Normal에 수직인 방향의 투영된 벡터를 Return해줍니다.

즉, MoveVector는 Plane에 Normal에 수직인 방향(ProjectOnPlane Vector)에 투영된 벡터로 반영됩니다. 즉 '무지(Icon)'가 있는 곳까지가 MoveVector가 됩니다.

 

forward


(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보다 작은지 확인할 때 적군이 전방 양쪽에서 플레이어의 시야 내에 있는지 효과적으로 확인합니다.

 

fieldOfView

 


(3) Cross

함수 설명 예시
Cross(Vector3 lhs, Vector3 rhs) 두 벡터의 외적을 반환합니다. 외적은 두 벡터가 놓여 있는 평면에 수직인 벡터입니다.  항상 지면을 따라 이동해야 하는 캐릭터의 전방 방향과 그라운드 노멀에 수직인 벡터를 계산합니다. 

 

왼 손을 준비해주세요.

왼손의 엄지손가락이 Lhs가 되는 것이며, 검지손가락이 Rhs가 되는겁니다.

그 상태로 중지손가락을 펼치면 그게 Cross Vector가 되는 것입니다.