유니티:오브젝트 이동(오브젝트 조작): 두 판 사이의 차이
(→연산) |
(→벡터의 속기) |
||
104번째 줄: | 104번째 줄: | ||
|} | |} | ||
==== 벡터의 속기 ==== | ====벡터의 속기==== | ||
코드에서 사용되는 벡터엔 다음과 같은 속기(shorthand)가 있다. | 코드에서 사용되는 벡터엔 다음과 같은 속기(shorthand)가 있다. | ||
{| class="wikitable" | {| class="wikitable" | ||
131번째 줄: | 131번째 줄: | ||
===쿼터니온=== | ===쿼터니온=== | ||
사원수이다. 회전을 지정할 때 사용한다. 인스펙터 창에선 3차원 벡터를 사용하지만, 코드상에서 다룰 땐 쿼터니온을 사용한다. 오일러 각을 사용할 때 발생하는 짐벌락 때문이다. | 사원수이다. 회전을 지정할 때 사용한다. 인스펙터 창에선 3차원 벡터를 사용하지만, 코드상에서 다룰 땐 쿼터니온을 사용한다. 오일러 각을 사용할 때 발생하는 짐벌락 때문이다. | ||
==== 쿼터니온 속기 ==== | |||
{| class="wikitable" | |||
!쿼터니온 속기 | |||
!의미 | |||
|- | |||
|Quaternion.identity | |||
|0,0,0 회전에 대응한다. | |||
|} | |||
==목표지점까지 이동== | ==목표지점까지 이동== |
2021년 8월 14일 (토) 13:57 기준 최신판
- 유니티:개요
- 유니티:기본 조작
- 유니티:카메라
- 유니티:오브젝트
- 유니티:코딩기초
- 유니티:UI
- 유니티:게임 내 화면
- 유니티:플레이어
- 유니티:맵
- 유니티:씬
- 유니티:몬스터
- 유니티:아이템
- 유니티:음향
- 유니티:빌드
- 유니티:VR
- 유니티:팁
개요[편집 | 원본 편집]
키를 받거나 명령을 통해 오브젝트를 이동하게 한다.
순수학문에서 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);
형태로.