본문 바로가기

반응형

unity

(17)
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(Vecto..
[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..
[Unity] 헤드리스 모드(Headless mode) 헤드리스 모드? 간단히 말하면 유니티에서 그래픽적인 요소를 제외하고 실행 하겠다는 의미다. 아무것도 보이지 않는 유니티를 어디다 쓸까? 유니티로 서버를 만든다고 가정하자. 클라이언트가 사용자들에게 화려한 애니메이션과 이펙트들을 보여주는데 집중하는 대신 서버는 사용자의의 요청과 각종 로직들을 처리하는데 집중한다. 서버에겐 간단한 텍스트를 출력 할 수 있다면 이미 그래픽적인 요소는 다 갖추었다고 할 수 있다. 헤드리스 모드는 주로 클라이언트가 아닌 서버를 만드는데 많이 사용된다. 어떻게 만드나? 타겟 플랫폼을 스탠드 얼론으로 맞춰 놓고 'Server Build'에 체크한다. 'Build' 버튼을 클릭하여 빌드를 완료 한 후 커맨드 창에서 빌드 결과 파일을 실행 한다. 이때 실행 옵션에 '-batchMode'..
[Unity] Texture2D를 Sprite로 변경 스프라이트 객체를 AssetBundle로 만들고 난뒤 AssetBundle을 통해 스프라이트 객체로 로드를 했는데 로드를 하지 못하고 null을 리턴하는 현상이 발생했습니다. Unity 4.3 버젼에서는 스프라이트는 어셋번들로 빌드하게 되면 텍스쳐로 로드해서 스프라이트로 변환 해야 한다고하는 군요. 그래서 텍스쳐를 스프라이트로 변경하는 방법에 대해서 살짝 짚고 넘어가보도록 하겠습니다. Rect rect = new Rect(0, 0, texture.width, texture.height); sprite.GetComponent().sprite = Sprite.Create(texture, rect, new Vector2(0.5f, 0.5f)); 참 쉽죠?ㅋ 추가 : Sprite Packer를 이용해 패킹한 s..
[Unity] 콜스택 알아 오기 유니티를 사용하다 보면 디버깅을 위해 로그를 찍을때 리스트 뷰에서는 콜스택에 대한 정보를 볼수 없어 귀찮은 경우가 많다. 어셋 스토에서 판매하고 있는 'Console Pro'라는 어셋을 사용하면 편리하긴하지만.. using UnityEngine; // example : // Debug.Log(LogHeader.Function + "any log text will be here"); // result : // CallStackLogMain:func_2() (at Assets/CallStackLogMain.cs:17) // any log text will be here public static class LogHeader { public static string Path { get { #if UNITY_ED..

반응형