Vector3와 Vector2와 친해져보자.

김시온·2023년 10월 16일

C# 게임공부

목록 보기
2/3

유니티 공부를 하다보면 Vector3와 Vector2가 굉장히 많이 보인다.
변수를 지정하기도 하고, position으로 위치도 변경하기도 하고, new로 뭔가 새로운 인스턴스를 생성하기도하고. 이번에 미니 프로젝트를 하면서, 정확히 뭔지 모르겠지만 쓰라니 써왔던 Vector3와 Vector2에 대해 본격적으로 공부를 해봐야겠다는 생각이 들어 글을 정리하기 시작했다.


Vector3와 Vector2의 모양과 기능

C# 스크립트에서 Vector3, Vector2는 구조체타입이다.(선언된 자료형!)
구조체 타입은 기본 타입인 int, float, char, enum등과 같이 value type이라서 스택에 저장되며 new를 한다고 힙에 메모리할당이 일어나지 않는다. (!= 참조변수)
* (참고로 Quaternion도 구조체타입이다.)
구조체 타입안에는 미리 선언된 구조체 변수가 있다.
구조체 타입을 활용해 변수를 새로 선언하면 그 변수는 구조체변수에 접근가능하다.

Vector3에서는 float형의 x, y, z (3d공간)에 접근이 가능하고
Vector2에서는 float형의 x, y (2d공간)에 접근이 가능하다.

아래는 Vector3의 예제. Vector2는 x, y만 사용하면 된다.

void Start()
{
	Vector3 pos;
    //구조체 타입인 Vector3의 pos라는 인스턴스 변수 생성.
    
    pos = this.GameObject.transform.position;	//this는 생략가능.
    //스크립트가 존재하는 게임오브젝트의 transform 컴포넌트 position값을 저장.
    
    Debug.Log(pos);
    Debug.Log(pos.y);	//Vector3의 특정 구조체변수에만 접근하고 싶다면 .을 통해 접근가능.
}

>>> (0.0, 0.0, 0.0)과 같은 x, y, z 값이 차례로 출력되고 y값이 출력된다.
** Vector3 변수에서 가져오는건 복사된 값이지만, 새로운 벡터를 할당하는건 가능하다 **

Vector3 활용하기

  • Vector3.Traslate() : 지정된 위치로 바로 이동.
public class Translate : MonoBehaviour 
{
    void Update () 
    {
        // 게임 오브젝트 기준 오른쪽으로 이동
        transform.Translate(Vector3.right * Time.deltaTime);

        // 절대 좌표 기준 앞으로 이동
        transform.Translate(Vector3.forward * Time.deltaTime, Space.World);
    }    
}
  • Vector3.MoveTowards(출발p, 목적p, 속도) : 일정속도로 이동하는 예제
    //Vector3 구조체 안에 선언되어있는 메소드.
//Vector3를 이용해 타겟을 향해 이동하는 스크립트
public class MoveTowardsTarget : MonoBehaviour
{
    public Transform Target;	//타겟의 Transform값들.
    public float Speed = 1f;	//이동하는 스피드

    void Update()
    {
        transform.position = Vector3.MoveTowards(transform.position, Target.position, Speed * Time.deltaTime);
        //(스크립트를 적용중인 게임오브젝트의 위치, 타겟의 위치_목표 방향, 이동정도_스피드)
    }
}

>>> 게임을 실행시키면 Target의 위치로 이동하는 오브젝트.


Vector3를 사용할 때 왜 new를 사용하는 지 이해가 안됐는데 드디어 그 이유를 알게 되니 마음이 편하다. 유니티 사용을 하고 스크립트를 작성하면서 거의매일 보던 친구인데 이제서야 공부한 게 늦은 감은 있지만 이제라도 알았으니 다행이네. ㅋㅋㅋ
다음에는 class와 함께 빼놓을 수 없는 instance에 대해 공부해봐야겠다.


참고
Vector3 new는 스택에 저장된다.
혼란스러운 Vector3의 사용에 대한 이해
트랜스폼 이동

profile
샌애기 개발자

0개의 댓글