-
[TIL] 4주차 3일 유니티 입문 주차 ( 유니티 생명주기, 접근 제한자와 직렬화, 계층 구조, 로컬과 월드 좌표 )개발일지/스파르타 코딩클럽 부트캠프 2024. 5. 8. 20:47
오늘 배운 내용
- 유니티의 기초
- 유니티 생명주기
- Pixel Per Unit
- 계층 구조 (Transform 구조)
- 로컬 좌표계와 월드 좌표계
- Input.GetAxis
- Time.deltaTime
- 접근제한자와 직렬화 속성
배운 내용 정리
유니티 생명주기 ( 스크립트 라이프 사이클 )
유니티 생명주기는 뭐 생명을 불어넣어준다 그런건 아니고
간단하게 유니티에서 스크립트가 실행되는 순서, 주기라고 보면된다.
실제로 생명주기를 전체를 살펴보자면 엄청나게 양이 방대한데
아래 정도만 외워도 큰 문제는 없다고 한다.
Monobehavior를 상속받는 클래스들은 유니티 이벤트 함수를 사용할 수 있는데
그 함수들의 순서와 타이밍이라고 보면 된다.
Awake -> OnEnable -> Start는 게임의 1프레임이 시작되기 전에 실행된다.
생명주기 전체
>> https://docs.unity3d.com/kr/2021.3/Manual/ExecutionOrder.html
Pixel Per Unit
줄여서 PPU 인데 스프라이트의 픽셀 수와 해당 스프라이트가 게임 세계에서 차지하는
공간의 관계를 설명한다. PPU가 100이면 스프라이트의 100픽셀은
게임세계에서 1유니티 단위를 나타낸다. PPU가 높아질수록 스프라이트는 작아진다.
모든 스프라이트에 일관된 PPU값을 사용하는 것이 좋다.
계층 구조
모든 오브젝트는 Transform 컴포넌트를 가진다. 그리고 Transform 컴포넌트는
게임 오브젝트의 위치, 회전, 크기를 정의한다.
게임 오브젝트는 다른 오브젝트의 자식이 될 수 있다. ( 부모는 한개 뿐 )
부모 오브젝트의 Transform이 변경되면 자식들도 그를 따라간다.
로컬 좌표계와 월드 좌표계
이는 위의 Transform의 부모 자식 관계와도 관련된 이야기다.
월드 좌표계는 게임 세계의 전체적인 참조 프레임을 제공한다.
모든 게임 오브젝트가 공유하는 사실이며 월도 좌표계에서의 위치는
게임 환경 내에서 오브젝트의 절대적인 위치를 나타낸다.
그러므로 월드좌표계는 항상 일정하다.
스크립트에서는 position, rotation, lossyScale 를 통해 참조한다.
로컬 좌표계는 간단히 말해 부모에 대한 좌표를 말한다.
정말 쉽게 설명하면 부모 오브젝트와 자식 오브젝트가 있을 때
자식 오브젝트의 x,y,z 값이 0,0,0 이라면 부모와 완전히 같은 위치에 있는 것이다.
2,0,0 이라면 부모의 위치에서 x축으로 2만큼 떨어져있는 로컬 포지션이 되는것이다.
스크립트에서는 localPosition, localRotation, localScale 등이 있다.
Input.GetAxis
Input.GetAxis는 유니티의 입력 시스템에서 사용되는 메서드다.
이 메서드는 입력 축의 값을 반환하는데 입력 축은 주로 키보드나 조이스틱 같은 장치의 입력이다.
GetAxis 메서드는 -1부터 1사이의 값을 반환하는데, 입력 장치의 움직임에 따라서 해당 값이 변경된다.
값이 0에 가까울수록 입력이 없거나 중립이며, 양수 값은 양 방향 입력, 음수 값은 음 방향 입력이다.
위의 내용으로 봤을때 이 함수는 어디에 쓰는걸까?
당연히 GetAxis는 주로 플레이어의 움직임, 회전, 점프 등에 사용된다.
수평 이동을 처리하는 경우에는 Input.GetAxis("Horizontal")을 이용해서 좌우 방향 값을 얻는다.
Time.deltaTime
처음에 좀 어렵긴한데 이전 프레임 부터 현재 프레임까지의 경과 시간을 나타낸다.
deltaTime은 게임의 프레임 속도에 상관없이 일정한 시간 간격으로 동작하는 게임을 만들 때 유용하다.
주로 움직임과 애니메이션, 물리 시뮬레이션 등에서 시간에 따른 변화를 조정할 때 사용된다.
예를 들어서 transform.Translate(Vector3.forward * speed * Time.deltaTime)
앞으로 speed만큼 1초마다 가라
(1초에 1만큼 가라 * speed)
이런 식으로 사용 가능하다. delta의 뜻은 '차이'를 나타낸다.
Time.deltaTime은 초 단위의 값을 반환하며 1초에 1의 값을 나타낸다.
이 그림을 보자 30fps와 15fps로 두 배의 프레임 차이가 나지만 도착하는 시간은 같다.
1000fps과 5fps에 Time.deltaTime을 써도 똑같다.
1000fps * Time.deltaTime은 1000에 0.001을 곱하고
5 fps * Time.deltaTime은 5에 0.2를 곱한다.
접근 제한자와 직렬화 속성
public과 private의 경우에는
C# 문법에서부터 계속 다뤄왔다.
public은 변수나 메서드가 외부에서 접근 가능하도록 공개하는 접근제한자이다.
다른 클래스나 스크립트에서 해당 멤버에 접근이 가능하다.
private는 반대로 같은 클래스 내에서만 접근이 가능하다.
여기서 직렬화는 무엇이냐.
SerializeField는
private로 선언된 변수를 인스펙터에서 접근 가능하게 만들어준다.
코드를 한번 봐보자
public class ExampleClass : MonoBehaviour { public int publicVariable; private int privateVariable; [SerializeField] private int serializedFieldVariable; private void Start() { publicVariable = 10; // 외부에서 접근 가능 privateVariable = 20; // 클래스 내부에서만 접근 가능 serializedFieldVariable = 30; // 인스펙터에서 접근 가능 } }
private는 기본적으로 인스펙터에 나타나지않지만 앞에 [SerializeField]를 붙여주면
이렇게 인스펙터에서 접근이 가능하게 된다.
그 외
GetAxisRaw : 0에 가까워져서? 움직임을 좀더 깔끔하게 만들어준다.
normalized : 벡터값에 nirmalized를 하면 벡터의 길이를 1로 만든다.
예를 들어서 vertical과 horizontal이 모두 1이면 direction은 피타고라스 정리처럼 1이 넘는데
그걸 1로 만들어준다.
rigidbody.velocity : 물체가 1초당 움직이는 거리를 말한다.
.
.
.
'개발일지 > 스파르타 코딩클럽 부트캠프' 카테고리의 다른 글
[TIL] 4주차 5일 개인 프로젝트 진행중 ( 탑 다운 뷰 게임 ) (0) 2024.05.10 [TIL] 4주차 4일 Input System 그리고 게임수학 ( 오일러, 쿼터니언, 짐벌 락, 아크 탄젠트 ) (0) 2024.05.09 [TIL] 4주차 2일 두 번째 팀프로젝트 완 (0) 2024.05.07 [TIL] 3주차 5일 팀 프로젝트 진행중 , 열거형 (0) 2024.05.03 [TIL] 3주차 4일 배치고사, 인터페이스와 추상클래스 (0) 2024.05.02