목차
과제 제출 및 유니티 추가 개인 학습
오늘 과제 제출이 있었다
그리고 유니티 추가 학습을 진행했다.
예전에 Udemy에서 구매했던 강의인데, 매일 퇴실하고 한시간 정도 간단하게 들을 생각이다.
이유는 네이밍컨벤션이나 구조 같은 것을 어떻게 진행하는 지도 궁금하고,
너무 빠르게 지나간 강의 내용 중 복습하게 되는 내용은 그만큼 기본적이거나 중요한 것이니 다시 보게 되어서 좋고, 새롭게 알게 되는 것들은 새로 배워서 좋고, 하는 마음에서 진행하려고 한다.
과제 제출 및 트러블 슈팅
오늘 과제 제출이 있었다.
금요일에 끝낸 과제에서 큰 변화 없이 제출하게 되었다.
오늘은 ReadMe.md와 트러블 슈팅을 작성했다.
트러블 슈팅을 작성할 때 고민이 많을 줄 알았는데, 그간 TIL을 작성하면서 썼던 것들을 정리해서 작성하니 꽤 그럴듯해보인다.
스파르타 메타버스 만들기 과제 MetaBUS 트러블 슈팅
스파르타 메타버스 만들기 과제 MetaBUS 트러블 슈팅씬 전환과 상태 복원 문제 해결 (LoadScene, Additive, PlayerPrefs, sceneLoaded 콜백)배경유니티에서 메인 씬과 플래피 미니게임 씬을 전환하는 과정에서
j000.tistory.com
Vector2.normalized
벡터의 방향은 유지하고 크기를 1로 만든 단위 벡터이다.
키보드 입력을 기준으로 W를 누르면 (0, 1)로 이동하고 D를 누르면 (1, 0)으로 이동한다고 가정했을 때,
W + D와 같이 동시에 누르게 되면 (1, 1)로 대각선 이동하게 된다.
이 경우 벡터의 크기(magnitude)는 루트2, 대략 1.41이 되어서 대각선 이동 시 더 빨리 움직이게 되는 문제가 생긴다.
따라서 다음과 같이, normalized를 통해 방향만 구한 뒤, speed나 time을 곱해서 속도를 보정해주는 방법을 많이 사용한다.
rb2D.MovePosition(rb2D.position + moveDirection * (speed * Time.fixedDeltaTime));
Update() vs FixedUpdate(): 물리 이동 관련
Update()는 매 프레임마다 호출되므로 프레임 레이트에 따라 호출 빈도가 달라진다. (60FPS 초당 60회)
따라서 입력(Input) 처리에 적합하다.
FixedUpdate()는 고정된 시간 간격으로 호출된다. (예: 0.02초간 간격)
물리엔진(Box2D)는 이 타이밍에 동작한다.
따라서 Rigidbody2D.velocity, AddForce()등 물리 연산은 여기서 처리하는 것이 안정적이다.
void Update() {
// 입력은 여기서 받는다 (프레임 기반)
moveInput = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical")).normalized;
}
void FixedUpdate() {
// 물리 이동은 FixedUpdate에서 처리
rb.velocity = moveInput * moveSpeed;
}
위와 같이 코드를 짤 경우, 대각선 속도도 보정되고, 물리 엔진 타이밍과 동기화되어서 안정적으로 이동이 가능하다.
Enter Play Mode Setting
Edit -> Project Setting -> Editor -> Enter Play Mode Setting
Reload Domain: C# 스크립트를 새로 컴파일하고, 모든 정적 변수 및 싱글턴 등을 초기화한다.
Reload Scene: 현재 씬을 다시 로드한다. (씬의 초기 상태로 되돌림)
도메인을 리로드하지 않으면 훨씬 빠르지만 정적 상태가 유지되고,
씬 리로드를 해제하면 씬의 상태가 그대로 유지된다.
위 두 옵션을 모두 끄면 진입 속도는 매우 빨라지지만, 게임 초기화 로직이 제래도 작동하지 않을 수도 있다.
강사는 이걸 끄고 진행하고 싶어하지만 나는 껐다.
Awake()나 OnEnable()은 실행되지만, 정적 변수나 싱글턴 패턴 관련 초기화가 스킵될 수도 있기 때문이다.
상태 초기화 코드를 사용하면 된다고는 하지만, 아직까지는 초보자인 관계로 사용하지 않는 것이 나을 것 같다.
다만, UI 개발이나 반복적인 테스트를 해야할 경우에는 유용할 것 같다.
애니메이션 블렌드 트리 (Blend Tree)
여러 개의 애니메이션을 하나의 블렌드 트리에서 파라미터 기반으로 자연스럽게 섞어 재생하는 시스템이다.
대표적으로 이동 방향, 속도, 무기 상태 등에 따라 애니메이션을 자연스럽게 전환하는 데 사용된다고 한다.
Animation Controller에서 빈 공간 우클릭 -> Create State -> From New Blend Tree 하여 추가할 수 있다.
블렌드 트리 상태를 더블 클릭하면 아래의 좌측 이미지처럼 Blend Tree 내부로 이동한다.


상단의 우측 사진처럼 Inspector 창에서 모션을 추가 한 뒤에 Blend Type과 파라미터를 설정할 수 있다.
Blend Type 종류에는
- 1D: 하나의 float 파라미터를 기준으로 애니메이션을 블렌딩 (Speed로 걷기와 달리기 전환)
- 2D Simple Directional: x, y 두 파라미터로 방향 기반 블렌딩 (상하좌우 이동)
- 2D Freedom Directional / Cartesian: 더 복잡한 블렌딩 가능. 부드러운 대각선 처리 등
private void ReadMovement()
{
moveDirection = actions.Movement.Move.ReadValue<Vector2>().normalized;
if (moveDirection == Vector2.zero) return;
animator.SetFloat("MoveX", moveDirection.x);
animator.SetFloat("MoveY", moveDirection.y);
}
애니메이션 전환을 일일히 트리거할 필요가 없어서 코드를 굉장히 간단하게 유지할 수 있을 것 같다.
Animator.StringToHash()
animator.SetFloat("MoveX", moveDirection.x);
animator.SetFloat("MoveY", moveDirection.y);
처음에는 강사님이 위와 같이 애니메이션 파라미터를 "MoveX"와 같이 하드코딩을 했다가, 오타가 날 위험이 있으니 StringToHash를 쓰겠다고 아래와 같이 바꾸셨다.
private readonly int moveX = Animator.StringToHash("MoveX");
private readonly int moveY = Animator.StringToHash("MoveY");
//
animator.SetFloat(moveX, moveDirection.x);
animator.SetFloat(moveY, moveDirection.y);
Animator.StringToHash는 문자열을 해시값(int)로 변환해서 처리한다.
우리가 매번 입력하는 "MoveX"는 문자열이 이 변환은 런타임에서 매번 호출될 때마다 수행되므로 비용이 누적될 수 있다.
매번 string 값을 사용하는 것이 아니라 StringToHash를 이용해 int 값을 저장하여 재사용 하는 것이 성능 최적화에 유리하다는 것이다.
단점은 코드를 작성할 때 가독성이 약간 떨어질 수도 있다는 것.
하지만 해시 값을 저장하는 변수명을 잘 지으면 괜찮을 것 같다.
느낀점
과제를 제출하면서 퀄리티는 매우 아쉬웠지만 마음은 그렇게 속상하지 않았다.
구현하는 데만 몰입하여 쫓기듯이 도전 과제를 포함해 화려한 과제를 만들어서 성취하는 것과,
필수 과제를 끝내고 도전 과제를 일부 구현하는 대신, 모호한 개념과 헷갈리는 개념들을 짚고 넘어가는 것이 더 중요하다고 생각했기 때문이다.
지금 당장 구현을 할지는 모르더라도, 나중에 다시 공부해야하면 무슨 소용이냐 싶기도 하고...
물론 이렇게 짚고 넘어가도 나중에 다시 살펴보면서 하겠지만, 이해한 상태에서 살펴보는 것과 아닌 것이 다를 거라고 생각한다!
그리고 과제도 그렇게 나쁘진 않았다고 생각함!
밍글데이를 하면서 재밌었다!
OX 퀴즈에서 탑2, 탑3에 올랐는데 자꾸 떨어져서 너무 아쉬웠다.
포인트도, 커피도, 치킨도 받지 못했지만 즐거웠으니 되었다!
내일 학습 할 것은 무엇인지
내일 발제 있을 때까지 유니티 강의를 듣고, 발제 후에는 회의를 진행할 생각이다.
회의가 충분히 이루어져야 개발이 편하다는 것을 그간의 팀 프로젝트를 통해 배웠으니,
개발에 바로 착수하지 못하더라도 전전긍긍하지 말고 차근차근 진행하는 것이 좋을 것 같다.
'부트캠프 > 본캠프' 카테고리의 다른 글
| [내일배움캠프_2025JUL30] Input System 키 바인딩 변경 Setting (0) | 2025.07.30 |
|---|---|
| [내일배움캠프_2025JUL29] 유니티 2D 팀 프로젝트 시작! (0) | 2025.07.29 |
| [내일배움캠프_2025JUL27] 유니티 학습 (0) | 2025.07.27 |
| [내일배움캠프_2025JUL25] MetaBUS 개인 과제 (0) | 2025.07.25 |
| [내일배움캠프_2025JUL24] 유니티 학습, 분반 OT, 개인과제 (0) | 2025.07.24 |