일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- c++
- 백준 c++ 2468번
- Unity
- C#
- 2468 c++
- 코테
- dfs
- Lv.3
- 백준
- 백준 2870번
- 수학숙제
- 오브젝트 풀링
- 프로그래머스
- 2870번 수학숙제 c++
- 2870번 수학숙제
- 유니티
- Beakjoon
- 백준 1103번 c++
- 백준 17070번 c++
- 2870번
- 백준 c++ 2870번
- Algorithm
- 백준 1103번
- 백준 1103번 게임
- 코딩테스트
- 백준 17070번
- Lv2
- 2870번 c++
- 17070번
- 플레이어 이동
- Today
- Total
주녘공부일지
[Unity3D] Rotation (회전) 본문
Rotation (회전)
월드 공간상에서의 트랜스폼의 회전을 나타냄 ( Quaternion으로 저장 )
Quaternion은 복잡한 수를 기반으로 하기에 직관적으로 이해하기 쉽지 않으므로, 회전에 사용한다고만 알아둠
1) transfrom.Rotate
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
float _yAngle = 0f;
void Update()
{
transform.Rotate(new Vector3(0f, Time.deltaTime * 100f, 0));
// y축 방향으로 회전
_yAngle += Time.deltaTime * 100f;
transform.rotation = Quaternion.Euler(new Vector3(0f, _yAngle, 0f));
// y축 방향으로 회전 : 오일러각을 쿼터니언으로 변경시켜 사용 (위와 같은 로직)
}
}
+ Rotate 함수 대신 eulerAngles을 활용하여 회전을 줄 수도 있지만, 360도를 넘어가면 오작동할 수 있으므로 추가 연산을 해주기엔 적합하지 않아 Rotate()를 사용하는 것이 편리함
2) Quaternion Slerp , Quaternion LookRotation
3D 플레이어 이동 구현 예제 ( 이동하는 방향으로 플레이어를 회전시키며 이동 )
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
[SerializeField] float _speed = 10.0f;
void Update()
{
if (Input.GetKey(KeyCode.W))
{
transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(Vector3.forward), 0.2f);
transform.position += Vector3.forward * Time.deltaTime * _speed;
}
if (Input.GetKey(KeyCode.S))
{
transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(Vector3.back), 0.2f);
transform.position += Vector3.back * Time.deltaTime * _speed;
}
if (Input.GetKey(KeyCode.A))
{
transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(Vector3.left), 0.2f);
transform.position += Vector3.left * Time.deltaTime * _speed;
}
if (Input.GetKey(KeyCode.D))
{
transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(Vector3.right), 0.2f);
transform.position += Vector3.right * Time.deltaTime * _speed;
}
}
}
public static Quaternion Slerp ( Quaternion a, Quaternion b, float t )
- 두 개의 회전 값을 정하면 float 비율만큼의 적당한 회전값을 쿼터니언으로 리턴시킴
- 구면 선형 보간법 ( 곡선으로 보간 ) // Lerp : 선형 보간법 ( 직선으로 보간 )
ex) Slerp ( Quaternion a, Quaternion b, float t )
t = 0.0f -> a
t = 0.5f -> a와 b의 딱 중간
t = 1.0f -> b
public static Quaternion LookRotation ( Vector3 forward, Vector3 upwards = Vector3.up );
- 첫번째 인자에 방향 벡터를 입력하면 자기 위치 기준에서의 해당 방향 벡터쪽으로 회전
- 두번째 인자인 upwards은 Vector3.up이 디폴트 값으로 세팅되어 있음
+ Quaternion.identity ( 회전 값 0 )
'GameDevelopment > [Unity] Class, Pattern' 카테고리의 다른 글
[Unity3D] Physics.Raycast (+LayerMask) (0) | 2022.02.24 |
---|---|
[Unity3D] Collision (충돌) (0) | 2022.02.23 |
[Unity3D] Vector3 (0) | 2022.02.21 |
[Unity3D] position (위치) // 플레이어 이동 예제 (0) | 2022.02.21 |
[Unity] 모바일 터치 감지 방법 (0) | 2022.02.16 |