본문 바로가기

Unity

Reactive Extenstion(Rx) - 2 언제 Rx를 사용해야하는가 Rx의 장점 전통적인 방법으로 데스크탑 혹은 웹 기반 프로그램을 작성할 때, 가끔씩은 비동기 프로그래밍을 해야하는 경우가 있다. 데스크탑 어플리케이션은 입출력 또는 다른 활동적인 쓰레드를 블럭시킬 수 있는 UI 쓰레드를 가지고 있다. 실버라이트는 그 어떤 블럭도 허용하지 않으며 오직 비동기 프로그래밍만 가능하다. 그러나 요즘의 비동기 프로그래밍 모델의 사용자들은 수동으로 예외와 이벤트들의 취소를 관리해야만 한다. 이벤트를 더하고 빼기 위해, 사용자는 해독하기 어렵고 유지보수하기 힘든 코드를 작성해야만 한다. 게다가, 어플리케이션이 여러 곳의 데이터들과 상호작용한다면, 전통적인 방법으로는 각 데이터 스트림마다 이벤트 핸들러를 구현해야한다. 예를 들어, 사용자가 문자를 입력하자마자.. 더보기
uFrame, 프레임워크를 통한 유니티 게임개발 안녕하세요. 오랜만에 블로그에 글을 쓰는 것 같습니다. 현재 저희 회사에서 Unity를 이용한 새로운 형태의 스토리기반 2D 게임을 만들고 있습니다. 지금 80~90%정도 개발이 완료된 상황이고, 막바지 버그수정과 디테일작업에 신경을 쏟고 있습니다. 바쁘다는 핑계로 계속해서 블로그 포스팅을 미루고 있다가, 더이상은 안되겠다 싶어 시간을 내어 프로젝트에 대한 소개 및 정리하는 시간을 가져보았습니다. 현재 소속된 회사가 스타트업이고 개발인원(현재 2명)이 적다보니, 새로운 기술을 바로바로 사용해보고 적용할 수 있는 기회가 많았습니다. 그 중에서 이번 프로젝트에서는 유니티 에셋중 uFrame Game Framework(이하 uFrame)라는 프레임워크를 사용해서 개발을 하였습니다. 부수적인 기능을 담당하는 에.. 더보기
Canvas Group Canvas Group 캔버스 그룹(Canvas Group)은 UI요소들을 개별적으로 다루는 대신에, 한 곳에서 UI 그룹들의 특정 요소들을 컨트롤 할 수 있게 도와준다.캔버스 그룹의 요소들은 캔버스 그룹이 붙어있는 오브젝트뿐만 아니라 자식 모두에게도 영향을 미친다. 속성 속성 역할 Alpha 이 그룹에 포함된 UI 요소의 투명도를 나타낸다. 이 값은 0과 1사이에 있으며, 0은 완전한 투명, 1은 완전한 불투명을 나타낸다.UI요소들도 개별적으로 투명도값을 가지고 있기 때문에, 이 Alpha값과 Canvas Group의 Alpha값은 곱해져서 적용된다. Intractable 이 컴포넌트가 입력(예, 터치)을 받을 것인지를 나타낸다. 만약 false로 설정하면, 상호작용은 일어나지 않는다. Block Ra.. 더보기
Transform.TransformDirection Transform.TransformDirection public Vector3 TransformDirection(Vector3 direction); : direction을 로컬 공간에서 월드 공간으로 변형한다.이 명령은 transform의 스케일 혹은 위치에 영향을 받지 않는다. 리턴값인 vector는 direction과 동일한 길이를 가진다.만약 벡터의 방향 보다 위치를 표시해야한다면 Transform.TransformPoint를 사용하라. 유니티에서 3D로 작업을 한다면, 꼭 한번씩은 만나게되는 TransformDirection함수.이해했다가도 다시 보면 햇갈리기 딱 쉬운 함수이기에 이번 기회에 제대로 한번 파헤쳐 보자. 일단 2차원 좌표 공간에서 (1, 1)이 의미하는 것을 생각해보자. 좌표공간 (.. 더보기
Reactive Exntenstion(Rx) - 1 Reactive Extensions(Rx)란 무엇인가? Reactive Extensions (이하 Rx)는 observable sequence와 LINQ형식의 쿼리문, 비동기 이벤트-기반 프로그래밍으로 구성된 라이브러리다.Data sequences는 파일, 웹 서비스, 웹 서비스 요청, 시스템 알림 또는 유저 입력같은 일련의 이벤트들 처럼 많은 형식을 취할 수 있다. Rx는 위에서 언급된 모든 데이터들을 observable sequence로 나타낼 수 있다.새로운 데이터가 도착할 때 비동기적으로 알림을 받기 위해, 어플리케이션들은 observable sequence들을 구독한다. Pulling vs. Pushing Data 인터랙티브 프로그래밍에서, 어플리케이션은 순서대로 나열된 데이터에서, 활발히 데이.. 더보기
Lerp 유니티를 사용할 때 많이들 유니티 공식홈페이지에서 제공하는 API 문서를 참조할 것이다.하지만 모든 함수가 있을지 언정, 문서만 보고 이해가 쉽지 않은 API들이 몇개 있는데오늘은 그중에서 Lerp에 대해서 알아보도록 하자. Lerp는 선형보간(Linear Interpolation)을 나타낸다. 간단히 설명하면점 p1에서 점 p2사이에 있는 점들에 대해서 시간의 변화에 따라서 해당 점들을 예측하는 것을 말한다. 유니티에서 Lerp함수는 보통 3개의 매개변수를 가진다. 1 2 3 4 5 // Example valuesvalue1 = 10;value2 = 20;result = Mathf.Lerp(value1, value2, 0.5f);// result == 15cs 밑에 예제를 통해서, Lerp를 사용한 예.. 더보기
New Unity Messaging System 메시징 시스템 이번 유니티 4.6에서, 새로운 UI시스템은 기존의 SendMessage를 대체하기위해 메시징 시스템을 사용한다. 이 시스템은 순수하게 C#으로 만들어졌고, SendMessage를 사용하는데 있어 발생했던 문제들을 해결하는것을 목표로 하고 있다. 이 시스템은 메시징 시스템으로부터 콜백을 받을 수 있다는 것을 나타내기 위해, MonoBehaviour에 커스텀 인터페이스를 사용하여 작동한다. 명시된 타켓 오브젝트의 콜백함수가 호출될 때, 해당 호출에 대한 특정 인터페이스가 구현된 모든 컴포넌트에 호출된다. 메시징 시스템은 게임 오브젝트의 계층구조에서 얼마나 멀던간에 커스텀 유저 데이터를 전달한다.이는 반드시 특정 게임 오브젝트 또는 자식 그리고 부모에서 반드시 실행되어야 한다. 이뿐만 아니라,.. 더보기
Canvas Canvas Canvas는 UI요소들이 존재하는 공간이다. Canvas는 Canvas 컴포넌트를 가지는 게임 오브젝트인데, UI의 모든 요소는 반드시 Canvas의 자식으로 포함되어 있어야 한다. GameObject -> UI -> Image를 통해 Image를 만들 경우, Canvas가 존재하지 않는다면 Canvas는 자동으로 추가 된다.모든 UI요소는 Canvas의 자식으로 생성 된다. 요소가 그려지는 순서 Canvas에 있는 UI요소는 Hierarchy에 나타나는 순서대로 그려진다. 첫번째 자식이 먼저 그려지고, 두번째 자식이 그 다음, 그 다음 자식도 마찬가지 순서로 그려진다.두개의 UI요소가 겹쳐지면, Hierarchy에서 위에 있는 UI가 먼저 그려지고, 그 위에 그 다음 UI가 겹쳐져서 나타.. 더보기
체력바 HUD 만들기 원문보기 이번 포스트를 시작으로, Unity 4.6에서 새롭게 소개된 Unity UI를 이용해서, 특징들을 몇가지 예제를 통해 알아보고자 한다. 여기서는 간단한 체력바를 만들어 볾으로써, Slider UI를 스크립트로 제어하는 방법을 배울 수 있을 것이다. (유튜브 영상) 자, 이제 시작 해보자. 1. 'Play'라는 새로운 씬을 만들고 저장한다. 2. 해당 씬의 Main Camera를 (0, 1, -15)에 위치시킨다. 3. 씬에 Directional Light(GameObject -> Light -> Directional Light)를 추가하고, (0, 1, -15)에 위치 시킨다. 4. 씬에 Cube(Gameobject -> 3D Object -> Cube)를 추가하고, 이름을 Player라고 수정.. 더보기
ReorderableList으로 다양한 기능을 가진 List구현하기 원본보기 유니티 4.5버전에서, 유니티 인스펙터창에 비주얼한 리스트를 만들수 있는 내장 기능이 추가 되었다.이 기능을 가진 클래스의 이름은 ReorderableList이며, UnityEditorInternal 네임스페이스에 위치하고 있다.하지만 문서화가 되지 않아 아직까지 홈페이지에서 공식자료를 찾아볼 순 없다. ReorderableList가 어떤 기능을 가지는지는 다음의 그림을 보면 쉽게 알 수 있다. 그럼 이제 ReorderableList를 이용해서 어떻게 이런 아름다운 인터페이스를 구현할 수 있는지 알아보도록 하자. Note : UnityEditorInternal 네임스페이스가 Public이지만, 이것은 Unity Team에서의 내부적인 사용을 위한 목적으로 만들어 진 것 같다. 그래서 이와관련해 .. 더보기
유니티가 당신에게 알려주지 않는 진실 유니티가 당신에게 알려주지 않는 것들 from Lee Dustin 우연히 검색을 하던 중 좋은 자료를 발견하였습니다."유니티 개발의 정석"의 저자이신 이득우님께서 발표하신 자료인데, 유니티의 기능 소개 및 내부 작동원리에 대해서 정리하고, 이해가 안되는 부분은 검색을 통해서 공부할 수 있는 좋은 자료인것 같습니다. 여기서 놀랬던 건, Sendmessage에 대한 사실입니다. 얼마전에 리플렉션에 대해 번역을 하면서 리플렉션을 사용하는 Sendmessage의 성능에 대한 언급을 한 적이있는데, 위 발표 자료를 보면 모노 스크립트 캐시(Mono Scripts Cache)라는 것을 통해 함수를 호출한다고 나와있습니다. 리플렉션을 통해서 함수를 분석한 다음에, 그 다음은 캐시한 것을 가져다가 쓴다는 내용인데, 우.. 더보기
유니티에서 정적(static) 변수 사용하기 원문 보기 유니티에서 정적(static) 변수 사용하기이 글은 유니티3D 엔진에서 스크립트를 작성할 때, 정적 변수를 사용하는 방법에 대해서 설명하는 글이다. 이 글에 나와있는 예제 스크립트는 C#으로 작성되었지만, 똑같은 가이드라인을 자바스크립트에서도 적용할 수 있다.이 주제에 대해서 본격적으로 이야기하기 전에, 인터넷에서 손쉽게 찾을 수 있는 "정적 변수는 무슨 수를 써서라도 피해야 한다"는 여러 이유에 대한 부분은 말하지 않을 것이다. 대부분의 경우에 있어서, 싱글톤 패턴을 사용하는 것이 더 낫다. 이 점을 염두해 두고, 여기 정적 변수에 대한 간단한 정의를 소개하겠다. 이들은 클래스에 속해 있는 변수이며, 클래스가 생성하는 객체에는 존재하지 않는다. 이것은 정적 변수가 특정 클래스의 객체에 상관없.. 더보기
유니티에서 Static IEnumerator 호출하기 원문보기 유니티에서 Static IEnumerator 호출하기 모든 프로그래머들이 작업을 하다보면, 장소에 구애받지 않고 원하는 곳에 자신이 필요한 함수를 호출하고 싶은 순간이 반드시 올 것이다. 이를 해결하기 위한 멋진 방법은 static 함수를 사용하는 것이다. 우리가 매일 사용하는 MonoBehaviour에서 볼 수 있는, Input.GetButton 또는 이와 유사한 모든 변종은 손쉽게 어디서나 사용할 수 있는 static 함수의 좋은 예라고 볼 수 있다. 당신이 만들어야 하는 인스턴스들 있고, 이 인스턴스들 중에서 몇몇 인스턴스는 IEnumerator타입이 될 수도 있을 것이다. 예를 들어, 플래쉬 라이트를 만드는 스크립트를 만들었고, 여러 다른 스크립트에서 플래쉬 라이트를 호출해야할 필요가 있.. 더보기
유한 상태 기계(Finite State Machines, FSM) #2 (3/3) 원문보기 1편보기 2편보기(이어서 계속) 클로저 (역자 주 : 클로저에 대해서 처음들어보시는 분은 밑에 내용을 읽기 전에 링크를 통해서 클로저에 대한 대략적인 이해를 하시고 보시면 좀 더 쉽게 내용을 이해하실 수 있습니다.) 자, 우리는 위에서 클로저를 만들기 위해 델리게이트에 인스턴스의 참조를 어떻게 숨기는지를 봤다. 이런 이유로, 델리게이트를 사용할 때, Action이 인스턴스 맴버 혹은 static 맴버를 가리키는지, 이 메소드가 존재하는 클래스가 무엇인지 등을 알 필요가 없다. 단지 알아야 하는 것은 someAction()를 호출했을 때 그저 잘 작동할 것이라는 것이다. 여기 놀라운 소식이 하나있다 : 클로저 내부에서도 다른 변수를 숨길 수 있다! 방법은 익명 함수(anonymous functio.. 더보기
유한 상태 기계(Finite State Machines, FSM) #2 (2/3) 원문보기 1편보기 3편보기 (이어서 계속) * 전편에 약간 누락된 부분이 있어 전편 마지막부분에 추가하였습니다. (13. 12. 2)델리게이트 그럼 이제 델리게이트를 한번 써보자. .NET에는 2개의 일반적인 델리게이트 타입(Func, Action)이 내장되어 있고, 스스로도 정의할 수 있는데, 첫번째 함수를 예로 들어 보자.public delegate void UnityTriggerFunctionDelegate(Collider collider); 이제 트리거 함수를 가리키는 변수를 정의할 수 있다:UnityTriggerFunctionDelegate _triggerFunc;그리고 다음과 같이 델리게이트에 함수를 할당할 것이다. 123456789void Start(){ _triggerFunc = OnTri.. 더보기