unity
-
1. 루트 모션(Root Motion)이란? 루트 모션(Root Motion)은 오브젝트의 위치와 회전을 애니메이션이 제어할 수 있도록 허용하는 것을 말합니다. 루트 모션이 활성화된 애니메이션이라면, 해당 애니메이션이 적용된 오브젝트의 트랜스폼(Transform) 값은 영향을 받아 변하게 될 겁니다. 예를 들어, 루트 모션이 적용된 걷는 애니메이션(WALK)은 캐릭터가 걷는 것에 따라 위치 값도 변하게 됩니다. 루트 모션이 적용되지 않았다면 캐릭터는 제자리 걸음을 하겠지요. 2. 루트 모션이 일으킬 수 있는 문제점 물론 스크립트 코드를 작성하여 움직임을 구현하는 것보다 애니메이션을 통해 움직임을 구현하는 것이 훨씬 더 자연스럽습니다. 특히나 시네마틱 영상을 제작하는데엔, 루트 모션이 더욱 더 현실같은 자..
[Unity 3D] 애니메이션 Root Motion이 Transform값을 변경시키며 발생한 버그 해결하기1. 루트 모션(Root Motion)이란? 루트 모션(Root Motion)은 오브젝트의 위치와 회전을 애니메이션이 제어할 수 있도록 허용하는 것을 말합니다. 루트 모션이 활성화된 애니메이션이라면, 해당 애니메이션이 적용된 오브젝트의 트랜스폼(Transform) 값은 영향을 받아 변하게 될 겁니다. 예를 들어, 루트 모션이 적용된 걷는 애니메이션(WALK)은 캐릭터가 걷는 것에 따라 위치 값도 변하게 됩니다. 루트 모션이 적용되지 않았다면 캐릭터는 제자리 걸음을 하겠지요. 2. 루트 모션이 일으킬 수 있는 문제점 물론 스크립트 코드를 작성하여 움직임을 구현하는 것보다 애니메이션을 통해 움직임을 구현하는 것이 훨씬 더 자연스럽습니다. 특히나 시네마틱 영상을 제작하는데엔, 루트 모션이 더욱 더 현실같은 자..
2022.05.24 -
게임에는 수많은 이벤트들이 있다. 플레이어가 적 캐릭터의 시야에 언제 들어오고 나가는지, 체력이 언제 떨어지는지, 무기가 언제 바닥나는지, 적 캐릭터가 언제 위험한 바닥에 올라서는지 등, 우리가 게임할 때마다 자연스럽게 경험했던 것들이다. 키보드 입력이나 마우스 클릭, 오브젝트의 충돌체 영역 통과, 플레이어가 공격받는 것 등과 같은 순간처럼 이벤트는 수동적인 성격을 가지고 있으며, 스스로 능동적으로 발생하진 않는다. 이벤트는 응답을 만들고 발생시키며, 그 응답이 다시 그 이후의 응답을 일으키는 이벤트가 될 수 있다. 즉, 이벤트는 하나의 행동을 취함(이벤트)으로써 다른 행동을 수반(응답)하는 식으로, 서로의 행동들은 중요한 관계를 맺고 있다고 볼 수 있다. 프로퍼티(Property)를 통한 이벤트 구현의..
[Unity] 이벤트 주도적 프로그래밍 (Event Driven Programming)게임에는 수많은 이벤트들이 있다. 플레이어가 적 캐릭터의 시야에 언제 들어오고 나가는지, 체력이 언제 떨어지는지, 무기가 언제 바닥나는지, 적 캐릭터가 언제 위험한 바닥에 올라서는지 등, 우리가 게임할 때마다 자연스럽게 경험했던 것들이다. 키보드 입력이나 마우스 클릭, 오브젝트의 충돌체 영역 통과, 플레이어가 공격받는 것 등과 같은 순간처럼 이벤트는 수동적인 성격을 가지고 있으며, 스스로 능동적으로 발생하진 않는다. 이벤트는 응답을 만들고 발생시키며, 그 응답이 다시 그 이후의 응답을 일으키는 이벤트가 될 수 있다. 즉, 이벤트는 하나의 행동을 취함(이벤트)으로써 다른 행동을 수반(응답)하는 식으로, 서로의 행동들은 중요한 관계를 맺고 있다고 볼 수 있다. 프로퍼티(Property)를 통한 이벤트 구현의..
2022.04.03 -
유니티에서 디버깅을 하다 보면, 콘솔과 같은 데이터 문자열보다는 시각적인 선을 통해 확인하고 싶은 경우가 있다. 예를 들면, 적과 다른 캐릭터들에게 플레이어나 다른 오브젝트가 범위 내로 들어올 때 볼 수 있게 해주는 가시선 기능 같은 것이 대표적이다. 지구처럼 공전을 하는 오브젝트가 있을 때, 그 궤도를 볼 수 있는 선으로 표시를 해준다면 더욱 편리할 것이다. 이런 기능들이 지원된다면, 어떻게 게임이 작동하는지 눈으로 직접 확인을 할 수 있는 장점이 있다. (물론 이런 선들은 실제 인게임에서는 보이지 않는다.) 기즈모(Gizmos) 위에서 설명했던 기능들을 지원하기 위해, 유니티는 기즈모(Gizmos)라는 시각적 도구 장치를 제공한다. 충돌체의 와이어프레임 바운딩 박스(Wire Frame Bounding..
[Unity] 시각적 디버깅에 용이한 기즈모(Gizmos)유니티에서 디버깅을 하다 보면, 콘솔과 같은 데이터 문자열보다는 시각적인 선을 통해 확인하고 싶은 경우가 있다. 예를 들면, 적과 다른 캐릭터들에게 플레이어나 다른 오브젝트가 범위 내로 들어올 때 볼 수 있게 해주는 가시선 기능 같은 것이 대표적이다. 지구처럼 공전을 하는 오브젝트가 있을 때, 그 궤도를 볼 수 있는 선으로 표시를 해준다면 더욱 편리할 것이다. 이런 기능들이 지원된다면, 어떻게 게임이 작동하는지 눈으로 직접 확인을 할 수 있는 장점이 있다. (물론 이런 선들은 실제 인게임에서는 보이지 않는다.) 기즈모(Gizmos) 위에서 설명했던 기능들을 지원하기 위해, 유니티는 기즈모(Gizmos)라는 시각적 도구 장치를 제공한다. 충돌체의 와이어프레임 바운딩 박스(Wire Frame Bounding..
2022.03.11 -
필요한 이유 유니티에서 조건별 컴파일을 할 수 있도록 코드를 작성할 수 있다. 유용하게 사용하는 대표적인 예시 중 하나로, 디버깅을 끝낸 후에 디버그 코드를 지우고, 다시 개발하다가 또 똑같은 오류를 접하게 되면 지웠던 내용들을 다시 작성해야 하는 번거로움을 겪지 않아도 된다는 게 있다. 이것은 전역 선언(Global define)을 통해 해결할 수 있다. 전역 선언이란, 코드를 조건별로 컴파일하거나 특정 단락을 제외하는 것을 활성화 또는 비활성화할 수 있도록 해주는 특별한 전처리기 플래그(Preprocessor flag)를 말한다. 플래그를 true로 설정하면 유니티는 자동으로 한 버전의 코드를 컴파일, false로 설정하면 또 다른 버전을 컴파일한다. 이렇게 하나는 디버그용, 또 다른 하나는 배포용과..
[Unity] 전처리기 플래그 (Preprocessor Flag)를 이용한 조건 컴파일 코드 작성하기필요한 이유 유니티에서 조건별 컴파일을 할 수 있도록 코드를 작성할 수 있다. 유용하게 사용하는 대표적인 예시 중 하나로, 디버깅을 끝낸 후에 디버그 코드를 지우고, 다시 개발하다가 또 똑같은 오류를 접하게 되면 지웠던 내용들을 다시 작성해야 하는 번거로움을 겪지 않아도 된다는 게 있다. 이것은 전역 선언(Global define)을 통해 해결할 수 있다. 전역 선언이란, 코드를 조건별로 컴파일하거나 특정 단락을 제외하는 것을 활성화 또는 비활성화할 수 있도록 해주는 특별한 전처리기 플래그(Preprocessor flag)를 말한다. 플래그를 true로 설정하면 유니티는 자동으로 한 버전의 코드를 컴파일, false로 설정하면 또 다른 버전을 컴파일한다. 이렇게 하나는 디버그용, 또 다른 하나는 배포용과..
2022.03.08 -
분명 유니티 에디터 상에서 실행했을 때는 JSON 파일을 잘 읽어왔었습니다. 그런데, 빌드만 하면 읽어오지 못하는 문제가 발생했네요... 이것 때문에 2시간은 삽질한 것 같습니다. 1. 문제의 JSON 파일 읽어오기 코드 using System.IO; using LitJson; private const string jsonFilePath = "/Resources/Json/Narration.json"; private JsonData ReadJsonFile() { if(File.Exists(Application.dataPath + jsonFilePath)) { string jsonString = File.ReadAllText(Application.dataPath + jsonFilePath); JsonData..
[Unity] 빌드(Build)했을 때, JSON 파일을 읽지 못하는 현상분명 유니티 에디터 상에서 실행했을 때는 JSON 파일을 잘 읽어왔었습니다. 그런데, 빌드만 하면 읽어오지 못하는 문제가 발생했네요... 이것 때문에 2시간은 삽질한 것 같습니다. 1. 문제의 JSON 파일 읽어오기 코드 using System.IO; using LitJson; private const string jsonFilePath = "/Resources/Json/Narration.json"; private JsonData ReadJsonFile() { if(File.Exists(Application.dataPath + jsonFilePath)) { string jsonString = File.ReadAllText(Application.dataPath + jsonFilePath); JsonData..
2022.03.07 -
개발일지를 오랜만에 작성하러 왔다. 프로젝트를 개강 전까지 끝내고 싶어, 바쁘게 달린다고 글 작성할 시간이 없었다. 하지만, 결국 개강 전까지는 못 끝냈다....ㅎㅎㅎㅎ 오랜만에 글을 작성하려 하다보니, 어디서부터 적어야할 지 모르겠다. 그동안, 직면했던 고민들에 대해서 그냥 적어놔야겠다. 그러면, 나중에 볼 일이 있을지도? 1. 새로운 적, 무당(Shaman)과 집 길가에서 다음 집까지 가는 길목은 경관(Police)이 지키고 있었다. 이번엔 집 내부에서 플레이어를 괴롭힐 새로운 적이다. 사실 무당 로직을 구현하는데에 굉장히 많은 고민들이 있었고, 초반에 벌여놓은 실수때문에 타협을 할 수 밖에 없었다. 무당은 집에서 방들 사이를 랜덤으로 걸어다녀야 한다. 하지만, 집 구조가 다음과 같이 되어 있었다. ..
[압량(Amnyang)] #Final. 새로운 적, 무당(Shaman)과 게임 시작 씬, 로딩씬, 인트로씬 제작개발일지를 오랜만에 작성하러 왔다. 프로젝트를 개강 전까지 끝내고 싶어, 바쁘게 달린다고 글 작성할 시간이 없었다. 하지만, 결국 개강 전까지는 못 끝냈다....ㅎㅎㅎㅎ 오랜만에 글을 작성하려 하다보니, 어디서부터 적어야할 지 모르겠다. 그동안, 직면했던 고민들에 대해서 그냥 적어놔야겠다. 그러면, 나중에 볼 일이 있을지도? 1. 새로운 적, 무당(Shaman)과 집 길가에서 다음 집까지 가는 길목은 경관(Police)이 지키고 있었다. 이번엔 집 내부에서 플레이어를 괴롭힐 새로운 적이다. 사실 무당 로직을 구현하는데에 굉장히 많은 고민들이 있었고, 초반에 벌여놓은 실수때문에 타협을 할 수 밖에 없었다. 무당은 집에서 방들 사이를 랜덤으로 걸어다녀야 한다. 하지만, 집 구조가 다음과 같이 되어 있었다. ..
2022.03.05 -
Unity 공부를 하다가 MonoBehaviour 클래스에서 제공하는 "SendMessage()"와 "BroadcastMessage()" 기능을 봤다. 위 함수들을 이용하여, 게임 오브젝트에 붙은 모든 컴포넌트의 함수를 이름으로 실행할 수 있다고 한다. 일반적으로 클래스에 접근하기 위해선, 객체를 가리키는 참조 변수를 통해 해당 클래스의 멤버 변수와 함수에 접근하게 된다. 하지만, "SendMessage()"와 "BroadcastMessage()"는 실행할 함수의 이름만 알고 있다면 참조 과정을 거치지 않아도 된다. SendMessage() 다음은 Unity API Documentation에 적혀있는 함수의 원형이다. public void SendMessage(string methodName, objec..
[Unity] SendMessage와 BroadcastMessageUnity 공부를 하다가 MonoBehaviour 클래스에서 제공하는 "SendMessage()"와 "BroadcastMessage()" 기능을 봤다. 위 함수들을 이용하여, 게임 오브젝트에 붙은 모든 컴포넌트의 함수를 이름으로 실행할 수 있다고 한다. 일반적으로 클래스에 접근하기 위해선, 객체를 가리키는 참조 변수를 통해 해당 클래스의 멤버 변수와 함수에 접근하게 된다. 하지만, "SendMessage()"와 "BroadcastMessage()"는 실행할 함수의 이름만 알고 있다면 참조 과정을 거치지 않아도 된다. SendMessage() 다음은 Unity API Documentation에 적혀있는 함수의 원형이다. public void SendMessage(string methodName, objec..
2022.02.22 -
이 때까지 플레이어 캐릭터, 조명 처리, 배경 세팅 작업을 진행했었다. 오늘은 플레이어를 방해할 경관(Police) 패턴을 만들어볼 생각이다. 공포 게임 특성상, 좀 어두워 보여야 하기에 유니티 스프라이트 렌더러에서 색감을 어둡게 낮췄다. 이제 차례대로 한 번 만들어보자. 1. 경관 외관 세팅하기 평소 상태(Idle), 걷기(Walk), 인기척 감지(Feel) 애니메이션은 다른 팀원이 만들어준 상태다. 따라서, 이번에는 따로 애니메이션 작업을 안 해도 됐다. 다만, 원래 기획서 상에는 이런 내용이 없었지만 우리가 개발하는 게임이 공포게임인큼 좀 더 확실한 이펙트를 주고 싶었다. 경관이 들고 있는 손전등에 라이트(Light)를 달아줬다. 흰색이나 노란색 조명은 오히려 플레이어를 구하러 온 경관 느낌이 났기..
[압량(Amnyang)] #13. 2D 게임 적(Enemy) 패턴 구현하기이 때까지 플레이어 캐릭터, 조명 처리, 배경 세팅 작업을 진행했었다. 오늘은 플레이어를 방해할 경관(Police) 패턴을 만들어볼 생각이다. 공포 게임 특성상, 좀 어두워 보여야 하기에 유니티 스프라이트 렌더러에서 색감을 어둡게 낮췄다. 이제 차례대로 한 번 만들어보자. 1. 경관 외관 세팅하기 평소 상태(Idle), 걷기(Walk), 인기척 감지(Feel) 애니메이션은 다른 팀원이 만들어준 상태다. 따라서, 이번에는 따로 애니메이션 작업을 안 해도 됐다. 다만, 원래 기획서 상에는 이런 내용이 없었지만 우리가 개발하는 게임이 공포게임인큼 좀 더 확실한 이펙트를 주고 싶었다. 경관이 들고 있는 손전등에 라이트(Light)를 달아줬다. 흰색이나 노란색 조명은 오히려 플레이어를 구하러 온 경관 느낌이 났기..
2022.02.21