전체 코드

1. Vector3란?

Vector3의 개념

  • Vector3는 Unity에서 3차원 벡터를 표현하는 구조체(struct)이다.
  • Vector3(x, y, z) 세 개의 float 값을 가지며, 위치, 방향, 크기 등을 표현하는 데 사용된다.
  • Transform 컴포넌트의 position, rotation, scale 속성에서 주로 사용된다.

2. Vector3의 주요 용도

1. 위치 벡터 (Position Vector)

  • 특정 좌표를 나타내는 벡터.
  • 예: (10, 5, 0) → x축 10, y축 5, z축 0의 위치를 의미.
  • 활용 예시: Transform.position, Transform.localPosition 등.

2. 방향 벡터 (Direction Vector)

  • 두 점 사이의 방향을 나타내는 벡터.
  • 방향 벡터는 출발지에서 목적지로 향하는 벡터이며, 아래와 같이 계산된다:
    방향 벡터 = 목적지 위치 - 출발지 위치
  • 활용 예시:
    • 캐릭터 이동 방향 설정.
    • 타겟(적)과 플레이어 간의 방향 계산.

3. 방향 벡터를 활용하여 구할 수 있는 값

1. 거리 (Magnitude)

  • 벡터의 크기를 의미하며, 두 점 사이의 거리 계산에 사용된다.
  • 수학적으로 피타고라스 정리를 기반으로 계산된다:
    magnitude = sqrt(x^2 + y^2 + z^2)
  • 활용 예시:
    • 두 오브젝트 간 거리 계산.
    • 캐릭터의 이동 속도 조절.

2. 정규화된 벡터 (Normalized Vector)

  • 벡터의 크기를 1로 조정하여 방향만 남긴 값.
  • 계산식:
    normalized = (x / magnitude, y / magnitude, z / magnitude)
  • 활용 예시:
    • 방향만 필요할 때(예: 이동 방향 설정).

4. Vector3 예제 코드 분석

사용자 정의 Vector3 구조체 (MyVector)

struct MyVector
{
    public float x;
    public float y;
    public float z;
  • Unity의 Vector3와 비슷하게 동작하는 사용자 정의 벡터 구조체이다.

벡터 크기 (magnitude) 계산

public float magnitude { get { return Mathf.Sqrt(x*x + y*y + z*z); } }
  • Mathf.Sqrt(x*x + y*y + z*z)을 사용하여 벡터의 크기(거리)를 계산한다.

정규화된 벡터 (normalized) 계산

public MyVector normalized { get { return new MyVector(x / magnitude, y / magnitude, z / magnitude); } }
  • 크기를 1로 조정하여 방향만 남김.
  • magnitude로 각 요소를 나누어 단위 벡터를 생성한다.

생성자 (Constructor)

public MyVector(float x, float y, float z) 
{ 
    this.x = x; 
    this.y = y; 
    this.z = z; 
}
  • MyVector 객체를 생성할 때 x, y, z 값을 초기화하는 역할.

연산자 오버로딩

1. 벡터 덧셈 (+ 연산자)

public static MyVector operator +(MyVector a, MyVector b)
{
    return new MyVector(a.x + b.x, a.y + b.y, a.z + b.z);
}
  • 두 벡터를 더함.
  • 예: (1, 2, 3) + (4, 5, 6) = (5, 7, 9)

2. 벡터 뺄셈 (- 연산자)

public static MyVector operator -(MyVector a, MyVector b)
{
    return new MyVector(a.x - b.x, a.y - b.y, a.z - b.z);
}
  • 두 벡터의 차이를 계산.
  • 예: 목적지 위치 - 출발지 위치 = 방향 벡터.

3. 벡터와 스칼라 곱 (* 연산자)

public static MyVector operator *(MyVector a, float d)
{
    return new MyVector(a.x * d, a.y * d, a.z * d);
}
  • 벡터 크기 조절.
  • 예: (1, 2, 3) * 2 = (2, 4, 6)

Vector3 방향 벡터 활용 예제

void Start()
{
    MyVector to = new MyVector(10.0f, 0.0f, 0.0f);  // 목적지 위치
    MyVector from = new MyVector(5.0f, 0.0f, 0.0f);  // 출발지 위치
    MyVector dir = to - from;  // 방향 벡터 (목적지 - 출발지)
    
    dir = dir.normalized;  // 방향 벡터를 단위 벡터로 변환
    MyVector newPos = from + dir * _speed;  // 속도를 반영하여 새로운 위치 계산
}
  • 방향 벡터를 이용하여 캐릭터 이동 방향을 설정하는 코드.

5. Unity에서 Vector3 활용

목적지로 향하는 방향 벡터 구하기

void Start()
{
    Vector3 to = new Vector3(10.0f, 0.0f, 0.0f);
    Vector3 from = new Vector3(5.0f, 0.0f, 0.0f);
    Vector3 dir = to - from; // 방향 벡터
}
  • 방향 벡터를 구하는 기본적인 방법.

Vector3의 magnitudenormalized 활용

void Start()
{
    Vector3 dir = new Vector3(3, 4, 0);
    float distance = dir.magnitude;  // 방향 벡터의 크기(거리)
    Vector3 unitDir = dir.normalized;  // 크기가 1인 단위 벡터
}
  • magnitude: 벡터 크기(거리) 반환.
  • normalized: 크기 1로 조정된 벡터 반환.

캐릭터 이동 구현

void Update()
{
    if (Input.GetKey(KeyCode.W))
        transform.position += Vector3.forward * Time.deltaTime * _speed;
    if (Input.GetKey(KeyCode.S))
        transform.position += Vector3.back * Time.deltaTime * _speed;
    if (Input.GetKey(KeyCode.A))
        transform.position += Vector3.left * Time.deltaTime * _speed;
    if (Input.GetKey(KeyCode.D))
        transform.position += Vector3.right * Time.deltaTime * _speed;
}
  • position을 변경하여 캐릭터를 이동하는 코드.

회전한 오브젝트의 이동 문제 해결

void Update()
{
    if (Input.GetKey(KeyCode.W))
        transform.Translate(Vector3.forward * Time.deltaTime * _speed);
}
  • Translate()로컬 좌표 기준 이동을 수행하므로, 오브젝트가 회전해도 올바르게 이동할 수 있다.

profile
李家네_공부방

0개의 댓글