유니티:오브젝트 이동(오브젝트 조작)

학교의 모든 지식. SMwiki
둘러보기로 이동 검색으로 이동

틀:유니티

  1. 유니티:개요
  2. 유니티:기본 조작
    1. 유니티:에셋스토어
  3. 유니티:카메라
  4. 유니티:오브젝트
    1. 유니티:데이터 입력받기
    2. 유니티:오브젝트 이동(오브젝트 조작)
    3. 유니티:힘으로 오브젝트 이동
    4. 유니티:충돌 이벤트
    5. 유니티:오브젝트 작성 tip
    6. 유니티:프리팹
  5. 유니티:코딩기초
    1. 유니티:C sharp 코딩 편의기능
    2. 유니티:MonoBehaviour
    3. 유니티:이벤트 메서드
    4. 유니티:컴포넌트 조작하기
  6. 유니티:UI
  7. 유니티:게임 내 화면
  8. 유니티:플레이어
    1. 유니티:모델
    2. 유니티:캐릭터 이동
    3. 유니티:애니메이션
    4. 유니티:주인공 시점
  9. 유니티:맵
    1. 유니티:투명한 벽 만들기
    2. 유니티:내비게이션
  10. 유니티:씬
  11. 유니티:몬스터
  12. 유니티:아이템
  13. 유니티:음향
    1. 유니티:배경음
    2. 유니티:효과음
  14. 유니티:빌드
  15. 유니티:VR
    1. 유니티:VR:UI
    2. 유니티:VR:VR로 변환
  16. 유니티:팁

개요[편집 | 원본 편집]

키를 받거나 명령을 통해 오브젝트를 이동하게 한다.

순수학문에서 3차원을 다룰 땐 x축이 앞뒤, y축이 옆, z축이 높이가 되는 방식으로 다루는데, 공학이나 유니티에선 기본적으로 x축이 옆, y축이 위아래, z축이 앞뒤를 의미한다.


방법[편집 | 원본 편집]

이동에 대한 정보가 담긴 스크립트를 해당 오브젝트에 넣으면 해당 코드가 컴포넌트에 담긴다.


이건... 데이터 입력으로 옮겨야 될 것 같은데;[편집 | 원본 편집]

Input.GetAxis("Horizontal"); 수평, 수직 입력을 받으면 float 반환. -1~1 오래 누르면 반환값이 달라진다.(부드러운 움직임을 위한 것인듯)

Input.GetAxisRaw("Horizontal"); 가중치 반환 없이, 왼쪽-1, 우측1, 동시에 누르면 0을 반환한다.

종 이동으로 Input.GetAxis("Vertical"); 도 가능하다.

좌표계[편집 | 원본 편집]

유니티에선 절대좌표계, 상대좌표계를 지원한다. 유니티 우측 상단에 Pivot/Center과 Global/Local버튼이 있는데, 이 버튼을 통하여 원하는 좌표계를 사용할 수 있다.

인스펙터 창의 좌표계가 바뀌는 게 아니라, 기즈모의 위치, 방향이 달라질 뿐이다.

좌표계 설명
Pivot(기본상태, 권장) 오브젝트의 실제 기준점을 기준으로 한 좌표계.
Center 눈으로 보이는 오브젝트의 중심을 기준으로 한 좌표계.
Global 절대좌표계.(전역좌표계)
Local 해당 오브젝트 기준의 상대좌표계.(오브젝트좌표계)

오브젝트가 회전한 방향을 고려하여 이동시키고 싶을 때 사용한다.


이동[편집 | 원본 편집]

Transform : 오브젝트가 갖고 있는 기본 컴포넌트.

transform.Translate(벡터); #Translate는 벡터값을 현재 위치에 더하는 함수.

void Update() {

Vector3 vec = new Vector3(0, 0.1f, 0);

transform.Translate(vec); //Translate는 벡터값을 현재 위치에 더하는 함수.

}


Vector에 (Input.GetAxis("버튼"), Input.GetAxis("버튼2"), 0 ); 등 따위로 정의할 수 있다.

tip. 카메라의 이동[편집 | 원본 편집]

물체가 움직임에 따라서 카메라도 함께 움직이게 한다.

벡터[편집 | 원본 편집]

벡터는 유니티에서 구조체로 정의되어 있다. Vector2, Vector3 을 사용할 수 있다.

선언[편집 | 원본 편집]

Vector3 벡터명 = new Vector3(1,2,3);

값 접근[편집 | 원본 편집]

벡터명.x 는 x축 값을 의미한다.

연산[편집 | 원본 편집]

연산 설명 방법
덧셈, 뺄셈 두 벡터를 더하거나 뺀다. a + b

a - b

스칼라곱 a * 스칼라
내적 Vector3.Dot(a, b);
외적 Vector3.Cross(a, b);
정규화 방향은 그대로 두고, 크기를 1로 정규화한다. a.normalized;
크기구하기 벡터의 크기를 구한다. a.magnitude;
두 벡터 사이의 거리 구하기 Vector3.Distance(a, b);

벡터의 속기[편집 | 원본 편집]

코드에서 사용되는 벡터엔 다음과 같은 속기(shorthand)가 있다.

벡터속기 의미
Vector3.forward new Vector3(0,0,1)
Vector3.back new Vector3(0,0,-1)
Vector3.right new Vector3(1,0,0)
Vector3.left new Vector3(-1,0,0)
Vector3.up new Vector3(0,1,0)
Vector3.down new Vector3(0,-1,0)

쿼터니온[편집 | 원본 편집]

사원수이다. 회전을 지정할 때 사용한다. 인스펙터 창에선 3차원 벡터를 사용하지만, 코드상에서 다룰 땐 쿼터니온을 사용한다. 오일러 각을 사용할 때 발생하는 짐벌락 때문이다.

쿼터니온 속기[편집 | 원본 편집]

쿼터니온 속기 의미
Quaternion.identity 0,0,0 회전에 대응한다.

목표지점까지 이동[편집 | 원본 편집]

Vector3 클래스에서 제공하는 함수.

1방식[편집 | 원본 편집]

void Update()

transform.position=Vector3.MoveTowards() //등속이동. 매개변수는 (현재위치,목표위치,속도)

transform.position=Vector3.MoveTowards(transform.position, 목표위치, 속도값);

2방식[편집 | 원본 편집]

부드럽게 도착한다.

transform.position=Vector3.SmoothDamp() //매개변수는 (현재위치,목표위치,참조속도,속도)

transform.position=Vector3.SmoothDamp(transform.position,목표위치,ref vector ,속도) //마지막 매개변수에 반비례하여 속도가 증가한다.

보통 참조속도엔 Vector3 vector=Vector3.zero;를 넣는다.(zero가 아니면.. 목표위치가 바뀐다.)

3방식[편집 | 원본 편집]

선형 보간. 더 부드럽게 도착.

transform.position=Vector3.Lerp() //매개변수는 (현재위치, 목표위치, 매개변수) 마지막 매개변수에 비례하여 속도가 증가한다. 최대는 1f)

transform.position=Vector3.Lerp(transform.position, 목표위치, 매개변수);

4방식[편집 | 원본 편집]

구면 보간. 구면으로 호를 그리며 이동.

transform.position=Vector3.SLerp() //매개변수는 (현재위치, 목표위치, 매개변수)

transform.position=Vector3.SLerp(transform.position, 목표위치)

DeltaTime[편집 | 원본 편집]

이전 프레임의 완료까지 걸린 시간.

컴퓨터사양에 따라 프레임이 달라지는데, 성능에 따라 속도가 달라져버리는 경과가 생기기도 한다. 때문에 프레임이 적을수록 값을 크게 잡아 이동거리를 같게 보간해준다.

Time.deltaTime

사용[편집 | 원본 편집]

앞선 이동방식에 붙여주면 된다.

transform.Translate(vec*Time.deltaTime);

이나

transform.position=Vector3.Lerp(transform.position, 목표위치, 매개변수*Time.deltaTime);

형태로.