오늘은 유니티를 다루면서 안 쓸 수가 없는 요소인 SceneManager에 대해서 정리해 보겠다.사실 SceneManager를 많이 쓴다고 해도 SceneManager.LoadScene() 정도 밖에 안 쓸 것이다.다만, SceneManager는 이 보다 더 많은 정보를 가지고 있다.그 중에서도 자주 쓰일만 한 요소를 정리해 보자.SceneManager란?SceneManager라는 요소를 SceneManager.LoadScene()으로 사용하기는 하지만, 구체적으로 SceneManager가 무엇을 담당하는 지는 모르는 경우가 많을 것이다.의외로 이에 대해서 깊게 들어갈 일이 잘 없기 때문인데, 그렇다 보니 SceneManager가 가지는 난점이나 불편함이 무엇 때문인지도 모르는 경우도 많을 것이다. S..
객체지향에는 싱글톤이라는 디자인 패턴이 존재한다.전체 프로젝트를 통틀어서 하나만 존재하는 클래스라는 의미로, 전체적인 구성의 중계점 역할을 하는 클래스를 말하는 디자인 패턴으로, 씬 전환을 구현해야 하는 유니티에서는 안쓰고 싶어도 안 쓸 수가 없는 기능이다.다만, 이러한 싱글톤도 난점은 존재한다. 바로 '씬이 넘어가는 경우의 행동'을 정의하기가 힘들다는 것이다.특히 배경음악이나 스테이지 상황 같은 것을 싱글톤으로 자주 작성한다는 점을 고려하면 상당히 골때리는 점.그럼 이제, 이러한 '씬 전환'을 더 용이하게 구성할 수 있는 방법에 대해서 정리해 보도록 하자.매니저 클래스에 초기화 함수를 넣지 않기매니저 클래스에서 초기화를 수행하는 것이 아니라, 구성 요소들의 초기화의 결과로 매니저 클래스가 초기화가 되도..

보통 화면 상에 '클릭'으로 작동하는 UI를 작성할 때에는 Button 컴포넌트를 자주 이용한다.그도 그럴게, Unity 상에서 기본으로 제공하는 기능인 덕분에 따로 구현하지 않고도 충분히 실행이 가능하기 때문.실제로 버그 예방이나 편의성 측면에서 이렇게 Button 컴포넌트로 구성하는 것이 유용한 것도 사실이다. 그렇다면, 이 Button은 완벽한 기능인 것일까.그랬다면, 본인은 이 글을 작성하지 않았을 터다.그럼 이제, Button 컴포넌트의 단점에 대해서 알아보자.Button 컴포넌트유니티 초심자가 가장 많이 사용하는 컴포넌트가 무엇인가 하면, 그것은 어쩔 수 없이 이 버튼 컴포넌트가 될 것이다.어지간하면 게임 시작이나 게임 종료 등을 버튼으로 구성할 것이니 말이다. 하지만, 이 Button 컴포넌..

TIL 초창기에 Animator Override Controller를 다룬 적이 있다.https://lsu0503.tistory.com/72 Today I Learned - Day 19 [Animator Override Controller]유니티에서 애니메이션 작업은 기본적으로 일단 적용한 뒤, 자신이 원하는 대로 깎는 작업이다.다르게 말하면 품이 많이 드는 작업으로, 애니메이션 작업의 거의 대부분은 구상이나 개발 보다lsu0503.tistory.com다만, 여기서는 Animator Override Controller만 다뤘지, Animation에 대해서는 그다지 다루지 않았었다.그러니 한번 다뤄볼까 한다.애니메이션은 '언제 어떤 수치가 얼마만큼의 시간에 걸쳐서 얼만큼 변화하였는가' 즉, '변화점의 기록..

분명히 코드를 신나게 써 내려갔는데, 실 동작이 안된다.분명히 알고리즘은 완벽한데 상공으로 솟구친다.분명히 검토를 골백번(아님)은 했는데 밑으로 떨어진다. 모두 코딩을 하다 보면 자주 발생하는 현상이다.아무리 구성을 잘 했다고 해도, 아무리 검토를 해봤다고 해도 버그가 없는 코드란 무안단물과도 같은 허상일 뿐이다.그래도 이를 줄일 수 있는 수단은 있다. 무안단물은 신화 상의 존재지만, 버그 없는 코드는 이론 상 가능 한 것이다.그렇다. 바로 디버그다.디버그를 알아보자.유니티에는 디버그를 할 수 있는 몇 가지 기능이 존재한다.Debug.Log를 비롯한 Debug 코드IDE 연동 중단점 기능양쪽 모두 유용한 기능으로, 디버그를 할 때 매우 유용한 기능들이다.그러나, 엄밀히 따지면 양쪽이 목표가 다르다.각각 ..

Unity를 사용하다 보면 상당히 자주 사용하게 되는 것이 Awake(), Start(), Update(), FixedUpdate(), LateUpdate()이다.전부 '특정 타이밍'에 적용되다 보니 타이밍을 맞춰서 사용하는 경우에 상당히 자주 사용하게 된다.다만, 이러한 함수들에도 난점은 분명하게 존재한다. 바로 '같은 타이밍이라면 순서를 알 수 있는 수단이 전무하다'는 것.이러한 점 때문에 클래스 간의 선후관계는 Awake() → Start()나 Update() → LateUpdate() 정도 말고는 불가능하다.즉, 어떤 경우라고 해도 2단계의 선후관계만 만들 수 있다는 이야기. Update() → LateUpdate()는 쓸 일이 딱히 없기 때문에 상관이 없지만, Awake() → Start()에서..
오늘은 개인 제작 보다는 협업에 유용한, 디자인 패턴 중 하나를 정리해 볼까 한다.다만, 개인 제작에도 도움이 되는 게, 디자인 패턴은 기본적으로 코드의 정리 및 분화에 특화되어 있다 보니 가독성이나 기능 제한 등, 개인적인 작업에 유용한 점도 확실하게 있는 편이다.특히, 이번에 정리할 유한 상태 머신은 '다른 클래스에서 확실하게 '이거다'하는 방식으로 행동 제어가 가능하다'라는 점에서 익숙해진다면 상당히 유용한 내용이다. 그렇다면, 한번 정리 해 보자.'상태 머신(State Machine)'이란?유한 상태 머신에 대해서 정리하기 전에, '상태 머신'이라는 용어 부터 정리해 보자.프로그래밍을 배우면서 가장 먼저, 그리고 가장 확실하게 자리잡는 개념은 '모든 프로그램은 입력과 출력이 존재하며, 입력과 출력..
이번에는 다소 간단한 주제로 작성해 볼까 한다. 최근 들어서 픽셀-메쉬 혼합형 그래픽 형식이 크게 유행하고 있다.[HD-2D라는 명칭이 있기는 하나, 이는 스퀘어 에닉스의 상표 명이라서 그래픽 형식을 지칭하진 못한다.]2.5D라는 표현도 있긴 하나, 이쪽은 3D 환경의 사이드뷰 내지는 탑뷰에서도 쓰이는 용어이기 때문에 정확하게 이러한 형식의 그래픽 스타일을 말한다고 하기는 힘들다.[심지어 서브컬쳐에서는 '실사화 컨텐츠'를 의미하기도 한다고 한다.]그러니, 본문에서는 임시로 픽셀-메쉬 혼합형 그래픽이라고 서술하겠다. 픽셀-메쉬 혼합형 그래픽은 픽셀 그래픽에서 항상 난점이었던 배경과 지형 등의 스케일이 큰 요소들은 3D 오브젝트로 구현하면서 캐릭터나 아이템 같은 스케일이 작고 플레이어가 직접적으로 상호작용..

URP는 Universal Rendering Pipeline의 약자로, 기존 Built-in 방식의 난점을 해소하고 전체적인 퍼포먼스를 향상시키기 위해서 개발된 Rendering Pipeline이다.이러면 Rendering Pipeline이 뭔가 싶을 텐데, 간단하게 말하자면 3D로 구성된 오브젝트를 화면에 띄우기 까지의 과정이라고 생각하면 된다.그래도 이해하기 힘들 수 있으니까, 오늘은 Rendering Pipeline과 URP에 대해서 조금 더 알아보자.Rendering Pipeline렌더링 파이프라인은 상술했듯이, 게임 오브젝트를 화면에 어떻게 그려지는 가에 대한 개념이다.실질적인 처리 과정은1. 게임 공간 상의 좌표를 카메라 상의 좌표로 치환2. 카메라 절두체에 속하지 않은 오브젝트를 제외3. 절..
어제 말했듯이, 오늘은 Particle System의 코드 상에서의 처리 방법에 대해서 정리해 보겠다.다만, 어제 내용에서 크게 바뀌는 점이 없는 게, 접근법이 꽤나 직관적이다.정확히는 변수 접근 만으로 수정이 가능하고, 함수로 쓸 만 한 것은 Play()와 Stop() 뿐이기 때문에 굳이 정리할 것이 없다.그렇다면, 그 방법을 정리해 보자.오늘은 다소 짧을 것이다.우선, ParticleSystem을 관리하려면 ParticleSystem을 받아올 변수를 생성해야 한다.ParticleSystem particleSystem = targetObject.GetComponent();ParticleSystem이 컴포넌트라는 점을 보면 알겠지만, 상기 방식으로 ParticleSystem을 받아오는 변수를 만들자.당연..