본문 바로가기

unity

(20)
[Unity] 3D 캐릭터 애니메이션 완벽 가이드 들어가며본 포스트는 유니티 3D 캐릭터 애니메이션을 다루기 위한 기본 지식과 구현을 다룬다. 우리는 먼저 3D 캐릭터 모델과 애니메이션 어셋들을 유니티에 임포트하고 셋팅하는 방법들에 대해 살펴 본 후, 예제를 통해 애니메이션들 간의 전환과 플레이 방식을 살펴 보도며 이번 포스트를 마무리 하도록 하겠다.3D 캐릭터 리소스 구하기3D 캐릭터 애니메이션을 위해 가장 먼저 필요한 것은 휴머노이드, 즉 인간형 형태로 제작된 캐릭터 모델과 그 모델을 움직이는 애니메이션이다. 여러분이 이미 적당한 모델을 가지고 있다면 그것을 사용하면 되겠지만, 만일 그렇지 않다면 https://www.mixamo.com/ 에서 적당한 캐릭터 모델과 애니메이션을 다운 받을 수 있다.여러분이 mixamo를 사용하기로 결정했다면, 간단히..
보이어 왓슨(Bowyer-Watson) 알고리즘 들어가며보이어 왓슨(Bowyer-Watson) 알고리즘은 델로네 삼각분할(Delaunay Triangulation)이라는 공간 분할법을 구현하는 여러가지 방법 중에 하나다.보이어 왓슨 알고리즘에 앞서 델로네 삼각분할을 간략하게 살펴 보도록 하자.델로네 삼각분할은 공간을 분할하는 방법 중에 하나로써 평면 위의 임의의 점들을 삼각형 형태로 연결하는 방법이다. 다만 단순 삼각형을 만드는 것이 아니라, "삼각형의 내각의 최소값이 최대가 되도록 한다"라는 규칙을 가진다. 간단히 말하면 최대한 정삼각형에 가까운 삼각형들을 만드는 것이다.다음 그림을 살펴 보자 :위 그림의 A의 네 점들을 연결하여 삼각형을 만든다고 생각해 보자. 두 가지 선택이 가능한데, B의 경우 처럼 세로로 분할 해 긴 삼각형 형태를 만들거나, ..
A*(Astar) 길찾기 알고리즘 들어가며로그라이크의 근본은 누가 뭐래도 작은 타일들로 이루어진 복잡한 미로 속에서 몬스터와 싸워나가며 결국엔 던전을 클리어하고 보물을 얻는것이라 생각한다. 그런데 던전에서 캐릭터와 몬스터들이 이동하는 것을 보니 한 가지 궁금한것이 생긴다. 복잡한 미로 속에서 캐릭터는 어떻게 유저가 이동하라는 곳으로 자연스럽게 이동하는 것일까? 몬스터는 어떻게 장애물들을 피해 플레이어를 공격해 올 수 있는 것일까? 이번 포스트 이런 물음에 답을 주기 위해 게임을 만드는데 필수 요소 중의 하나인 길 찾기(path finding) 알고리즘에 대해 살펴 보도록 하겠다.다익스트라 vs A*알고리즘을 조금이라도 공부해본 사람이라면 길 찾기 알고리즘이라고 하면 가장 먼저 다익스트라 알고리즘을 떠올릴 것이다. 다익스트라 알고리즘은 '..
FoV - 쉐도우 캐스팅(Shadow Casting) 들어가며 로그라이크 게임의 핵심 요소 중에는 FoV라는 것이 있다. FoV란, 'Field of View' 또는 'Field of Vision'의 약자로써, 아래 이미지 처럼 플레이가 던전과 같은 필드의 특정 위치에서 볼 수 있는 오브젝트와 가려지는 오브젝트를 구분하여 디스플레이하는 기능을 말한다. FoV를 구현하기 위해 간단하게 사용되는 방법으로는 '라이트 트레이싱(Light tracing)'이 있다. 라이트 트레이싱이란 시작점 - 일반적으로 플레이어 캐릭터 - 에서 바깥 쪽으로 가상의 빛을 쏘아 장애물에 의해 막히는 맵 셀을 탐지하는 방법이다. 라이트 트레이싱은 간단히 구현할 수 있다는 장점이 있는 반면, 아래 이미지 처럼 같은 셀에 대해 여러번 같은 연산을 수행하게 되어 CPU의 낭비가 발생한다는 ..
[Unity] Start 와 Awake의 차이 들어가며 이 글을 읽는 여러분이 유니티를 막 시작한 비기너 유저라고 하더라도 MonoBehaviour 클래스 안에 자동으로 생성되는 Start와 Update는 많이 보았을 것이다. 이는 미리 정의된 특수 이벤트 함수로써, 이 특수 함수들 - C#에서는 함수를 메소드라고도 한다 - 은 특정 이벤트, 즉 특정 조건 또는 시점에 유니티 엔진에 의해 자동으로 호출 된다. 유니티에는 위 Start와 Update 외에도 많은 이벤트 함수(메소드)가 있긴 하지만 오늘 포스트에서는 여러 특수 함수 중 초기화와 관련된 (아마도 이미 익숙한) Start와 (덜 익숙한) Awake에 대해서 살펴 보도록 하겠다. 이 포스트에서 여러분은 : Unity 이벤트 함수 호출 순서 시각화 Awake 사용하는 법 Start 사용하는 법..
[Unity] 쉐이더(Shader) 기초 들어가며 스프라이트를 클릭하면 외곽선을 하이라이트 시켜 선택되었다고 인지할 수 있는 기능을 만들고 싶었는데, 유니티에서 이런 기능을 만들려면 쉐이더를 써야 한다고 한다. 필자는 프로그래머로 오래 일을 해오긴 했지만 쉐이더 사용에는 전혀 문외한인지라 쉐이더를 공부하면서..아니다 공부라는 단어를 사용하기에는 너무 깊게 들어가지는 않을거라 '공부'라는 단어 보다는 기존 쉐이더를 분석하고 사용하는 방법을 알아간 과정을 기록하도록 하겠다. 쉐이더란? 화면에 출력할 픽셀의 위치와 색상을 계산하는 함수 쉐이더란 "화면에 출력할 픽셀의 위치와 색상을 계산하는 함수"라고 [여기]에서 쉽게 정의를 내리고 있다. 쉐이더는 크게 버텍스 쉐이더(vertex shader)와 픽셀 쉐이더(pixel shader)로 나뉘어진다. 버..
[Unity] Physics.Raycast 완벽 가이드 들어가며Unity의 Physics.Raycast는 직선을 씬에 투영하여 대상에 적중되면 true를 리턴하는 물리 함수다. Raycast 함수는 캐스팅 성공 실패에 따른 결과만 리턴하는 간단한 형태에서 부터 대상과 Ray의 충돌에 관련된 자세한 정보를(직선과 객체의 교차 정보. 거리, 위치, 캐스팅에 검출 된 객체의 Transform에 대한 참조 등) 리턴하는 다양한 버전이 제공 되고 있다.이번 포스트에서는 Raycast 함수를 사용하기 위해 알아야할 필수적인 요소들을 살펴 보는 시간을 갖도록 하겠다.Unity에서 Raycast를 사용하는 법Unity 2020.3 버전 기준으로 Physics.Raycast는 아래와 같이 다양한 버전으로 오버로드 되어 제공되고 있다. bool Raycast(Vector3 o..
[Unity] Physics.Simulate를 이용한 네트워크 동기화 들어가며 네트워크 게임에서 서버와 클라이언트간의 네트워크 전송 지연(transmission delay)은 이 세상에 물리 법칙이 적용되는한 피할 수 없는 사실이다. 플레이어가 액션을 취한 뒤 서버의 시뮬레이션을 거쳐 다른 플레이어들에게 전파되기 까지는 항상 지연이 수반 된다. 위 그림에서 클라이언트 A에서 전송한 패킷이 서버에서 처리를 거쳐 클라이언트 B에게 전달 되기 까지 100ms가 필요했다. 따라서 클라이언트 B에서 볼 수 있는 클라이언트 A의 최근 모습은 아무리 빨라도 100ms 이전의 모습 밖에는 볼 수 없다. 다시 한번 말하지만 네트워크 지연은 절대 피할 수 없는 물리적 한계이고, 길다면 길고 짧다면 짦은 온라인 게임의 역사속에 이 문제를 해결하기 위한 많은 방법들이 제시되었다. 이번 포스트에..
[Unity] 지금 동작하는 스레드가 메인 스레드인지 확인하는 방법 유니티로 싱글 스레드 기반 서버를 만들고 있는 중이다. 싱글 스레드 기반이라고 하더라도 성능을 위해서는 멀티 스레드를 완전히 배제하고 만들 수는 없다. 네트워크 IO라던지, 비동기 작업을 할 때는 멀티 스레드에서 작업을 하다가 완료가 되면 다시 메인 스레드에서 재개하는 방식으로 만들어야 한다. 하지만 어떨 때는 현재 구동되고 있는 코드가 메인 스레드에서 돌아가고 있는 것인지 다른 백그라운드 스레드에서 돌아가고 있는 것인지 확인해야 할 필요가 있다. 여기서 현재 실행 중인 스레드를 나타내는 Thread.CurrentThread 속성을 이용하여 현재 코드가 구동되고 있는 스레드가 메인 스레드인지 체크하는 예제 코드를 소개 하도록하겠다. 방식은 간단하다. Start 메소드와 같이 메인 스레드에서 구동되는 곳에..
[Unity] Convert Texture2D to Sprite After making the sprite object into an AssetBundle, I loaded it as a sprite object through AssetBundle, but it failed to load and returned null. In Unity 4.3 version, it is said that when a sprite is built with an AssetBundle, it must be loaded as a texture and converted into a sprite. So, let's talk a little about how to change a texture to a sprite. Rect rect = new Rect(0, 0, texture.width, te..

반응형