잔잔이네
article thumbnail

Unity에서 게임 오브젝트의 이동, 회전, 점프, AddForce와  Velocity(오브젝트 자체 속도 부여),  LookAt(오브젝트 바라보기), RotateAround에 대해 정리하였습니다.

 

1. 알아두어야할 것

2. 이동 (Move)

3. 회전 (Rotate)

4.  AddForce와 Velocity - 오브젝트 날려보기

5. 점프와 점프 프로그래밍 (Jump)

6. 카메라 회전, LookAt (바라보기), RotateAround

 


1. 알아두어야할 것

 

정규화벡터 / 단위 벡터 (Normalized Vector / Unit Vector)

벡터는 크기와 방향을 나타낼 수 있는 데이터타입이며 각 축의 크기가 1인 벡터를 정규화 벡터 or 단위 벡터 라고한다.

방향만 표시하는 벡터라고 생각하면 된다.

 

Vector3 구조체에서 제공하는 방향을 가리키는 정규화 벡터

Z축(+) Vector3.forward = Vector3(0, 0, 1)
Z축(+) Vector3.back = Vector3(0, 0, -1)
X축(-) Vector3.left = Vector3(-1, 0, 0)
X축(+) Vector3.right = Vector3(1, 0, 0)
Y축(+) Vecotr3.up = Vector3(0, 1, 0)
Y축(-) Vector3.down = Vector3(0, -1, 0)
  Vector3.one = Vector3(1, 1, 1)
  Vector3.zero = Vector3(0, 0, 0)

 

Vector3.forward *1는 전진 방향 * 속력과 같은 의미이다.

 

컴포넌트의 캐시처리는 스크립트에서 접근해야 할 컴포넌트를 Awake 함수나 Start 함수에서 미리 변수에 할당한 후에 그변수를 통해 접근하는 것이다. 계속 찾아줘야하기때문에 성능면에서 변수에 저장해두는 것이 더 낫다

Translate 함수

게임오브젝트의 이동 로직을 Transform 컴포넌트의 position 속성값을 계산해 이동하는 방식으로 코딩한다면

번거롭고 코드의 가독성이 떨어지는데, 유니티에서 쉽게 사용할 수 있는 Translate 함수가 있다.

 

void Update()

{

     tr.Translate(Vector3.forward * 1.0f);

}

 

이런식으로 표현할 수도 있다.

Translate 함수의 두 번째 인자는 이동하는 게임오브젝트가 월드 좌표(Space.World)를 기준으로 이동할 지

로컬 좌표(Space.Self)를 기준으로 이동할 지 결정한다. 기준 좌표계 인자를 생략하면 로컬 좌표를 기준으로 이동한다.

 

Time.deltaTime에 대해..

Time.deltaTime을 곱해주면 PC나 Mobile같은 사양이달라서 프레임이 차이가나도 시간을 이용하여 같은 거리를 이동할 수 있다.

 

public으로 선언되어 인스펙터 뷰에 노출된 변수의 우선순위

스크립트에서는 moveSpeed의 속성값이 10.0f이다 하지만 인스펙터 뷰에서 Move Speed를 변경하면 스크립트와 상관없이 인스펙터 뷰에서 설정한 값이 적용된다.

접근 제한자가 public이면 스크립트에서 지정한 값을 무시하고 인스펙터 뷰에서 설정한 값이 적용된다.


2. 이동 (Move)

오브젝트 이동 - 1 (절대 좌표 이동)

Move1 - Script

스크립트를 넣으면 (0, 1, 0) 으로 이동한다.

 

오브젝트 이동 - 2 ( Translate 함수)

Move2

스크립트를 넣으면 2초가 지나면 현재위치에서 Y축으로 2만큼 이동되는 것을 볼 수 있다.

 

캐릭터 움직여보기 - 예제

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Move3 : MonoBehaviour
{
    float speed = 100f;
        
    void Update()
    {
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");

        // 콘솔창 로그
        Debug.Log("h : " + h + ", " + "v :" + v);

        h = h * speed * Time.deltaTime;
        v = v * speed * Time.deltaTime;

        this.transform.Translate(Vector3.right * h);
        this.transform.Translate(Vector3.forward * v);
    }
}

스크립트를 작성하여 오브젝트를 움직여 볼 수 있다.

 


3. 회전 (Rotate)

오브젝트 회전 - 1 ( 절대 각도 회전)

스크립트를 실행하면 오브젝트가 2초후 Y축(0f, 45f, 0f)을 기준으로 45도를 바라보고 4초가 지나면 90도의 방향을 바라본다 절대각도로 이동하기때문에 45도를 바라본후 45도 + 90도가아닌 90도가 되는 것이다.

 

오브젝트 회전 -2  ( 현재 각도를 기준으로 회전)

시간이 지날때 마다 Vector3.up (0, 1, 0)을 기준으로 계속 회전한다.

 

 

오브젝트 회전 - 3 ( 키 입력 받기)

오브젝트를 이동하는 것 처럼 벡터에 속도를주어 회전시키는 것도 가능하다.


4.  AddForce와 Velocity (오브젝트 날려보기)

 

AddForce와 Velocity의 특징 

1. AddForce

질량에 따라 속도가 달라진다.

 

2. Velocity (물체 자체에 속도주기)

자체에 속도를 주기 때문에 질량과 상관없이 속도가 같다.

 

Rigidbody

물리적 동작 기능을 하는 컴포넌트이며 Add Component에서 추가할 수 있다.

AddForce와 Velocity의 차이를 보기위해서는 비교할 오브젝트의 Mass(질량) 값을 변경하면 된다.

 

AddForce 사용 - 오브젝트 날려보기 

AddForce

큐브 오브젝트를 왼클릭하면  AddForce함수를 통해 velocity 벡터로 power만큼 힘을 가한다.

우클릭을 하면 rb.velocity = new Vector3(0f, 0f, 0f);를 통해 속도를 0으로 초기화하고

큐브 오브젝트의 위치와 회전값(날아가면서 회전될수 있기 때문에) 처음 값으로 초기화 시켜줄 수 있다.
Rigidbody의 Mass 값을 변경해보면 속도가 다를 것이다.

 

Velocity 사용 - 오브젝트 날려보기

velocity

왼클릭을 하면 똑같이 오브젝트가 날아간다. 하지만 질량이 변해도 속도에 변화가 없이 일정한 것을 볼 수 있다.

 

 


4. 점프와 점프 프로그래밍 (Jump)

AddForce - 점프

Y축방향으로 AddForce를하여 점프를하면 질량에 따라 이동거리가 다른 것을 볼 수 있다.

 

Velocity - 점프

Y축방향으로 Velocity를하여 점프를하면 질량이 달라도 이동 거리가 같다.

 

점프 프로그래밍 (Jump Programming)

gravity 변수에 속도를 지정하고 오브젝트의 좌표인 velocity와 

firstPos = velocity = transform.position;로 firstPos 변수에 처음 위치를 저장한다.

스페이스를 누르면 값이 더해지며 velocity.y가 상승하고 0.5f씩 감소하다 음수가 되면 떨어진다.

이때  if (velocity.y < firstPos.y)로 조건을 쓰지 않으면 바닥 밑으로 사라지게된다.
처음위치보다 작아지면 처음 y위치로 위치를 잡아주고 bool타입 isJump를 false로 바꿔주며 점프를 종료한다.

 

점프 프로그래밍을 하는 이유는 Rigidbody을 통해서 AddForce 또는 Velocity로 점프를 하는 것보다 가벼운 성능으로 구현할 수 있기때문이다.


5. 카메라 회전 ,  LookAt (바라보기) , Rotate Around (주위 회전)


카메라 각도 회전 (마우스 이동) - Mouse Look

Mouse의 움직임에 따라  X, Y 좌표를 읽어 카메라를 회전시킨다. 너무 돌리면 회전이 뒤집어지기 때문에 if문으로 제한을 둘 수 있다.

 

 

LookAt (바라보기)

 

BlueCube라는 게임오브젝트를 찾아 대상의 Transform 컴포넌트 객체를 얻어와서 blueTr에 저장한다

Update()에서 LookAt 함수를 사용하여 BlueCube가 이동을하면 바라보게 된다.

 

RotateAround - 주위회전

 

NewCube라는 게임오브젝트(위 사진 중앙 큐브오브젝트)를 찾아서 newTr에 저장한다.

RotateAround 함수에서
newTr.position의 위치를 중심으로

Vector3.up Y축을 기준으로하여

speed * Time.deltaTime의 속도로 주위를 돌며

newTr변수에 저장된 "NewCube" 오브젝트를 바라보게된다.

profile

잔잔이네

@잔잔잔잔

🌈

검색 태그