OSX용 유니티3D의 빌트인 IDE인 모노디벨럽을 쓰다가 너무 화딱지가 나서 도저히 이걸로 개발 못하겠다는 생각이 듬. 다른 거 뭐가 있나 찾아보던 중 Visual Studio Code를 발견. 예전부터 평이 좋기는 한데 연동을 수동으로 해야 함. 전에 한 번 시도하다가 잘 안되서 포기 했었는데 간단히 설정해 주는 플러그인을 발견.
대략적인 방법은 아래 링크를 참조
https://code.visualstudio.com/Docs/runtimes/unity
허나, 이대로 하면 안되는 부분이 있기 때문에 추가 설명하겠음.
필요한 환경
1. Visual Studio Code를 다운로드하여 설치
2. http://www.mono-project.com/download/ 에서 universal installer를 다운로드하여 설치
( 유니티가 있음에도 굳이 모노SDK를 또 다운받아야 하는 이유를 잘 모르겠으나, 여튼 이걸 다운 받아서 설치해야 함 )
이제부터 유니티 플러그인 설치 순서 설명
참고로 플러그인은 유니티 프로젝트마다 설정해 주어야 할 필요가 있음.
1. https://github.com/dotBunny/VSCode/ 에서 플러긴 소스를 다운로드
2. cs소스가 유니티 프로젝트의 Assets/Plugins/Editor에 위치하도록 복사
FFani는 Fire and Forget animation의 약자로 iTween같이 onUpdate가 필요하지 않고 start명령으로 애니메이션이 실행되는 구조를 fire and forget이라고 많이 부르는 모양인데, 이러한 기능을 보다 깜끔하게 지원하기 위한 툴킷을 직접 개발하였다. API사양과 설계는 QML이라는 언어의 애니메이션 프레임워크를 많이 참조하였다.
상세 설명
1. 사용가능한 컴포넌트
안타깝게도 iTween은 애니메이션 타겟 종류가 제한되어 있다. Transform, Renderer같은 대표적인 컴포넌트만 지원하며 4.6부터 등장한 New UI의 컴포넌트들을 애니메이션 시킬 수 없다는 것은 너무나 치명적인 문제점이었다.
단 이를 해결하기 위해 몇 가지 범용 기능을 제공하기는 한다. 예를 들어, Fade-in 애니메이션을 위해서는 UI 오브젝트의 Image컴포넌트의 color.a값을 매 프레임마다 바꾸어주어야 하며 이를 위해 iTween.ValueTo를 사용하였다.
fadeScreen의 Image.color.a에 접근 가능하기 때문에 OnOpacityUpdated 메서드는 이제 필요가 없어졌다. UI를 애니메이션 시킬때마다 콜백을 하나씩 만들어야 했던 고통에서 벗어나게 되었다.
2. 콜백
애니메이션이 종료한 후에 바로 다른 코드를 실행시키기 위해서는 콜백을 설정해 주어야 한다. 예를 들어 현재 개발중인 SRPG의 경우 시작시 Fade-in과 함께 카메라 애니메이션이 시작되며 이것이 종료되면 엔트리 픽 모드로 들어간다. 엔트리 픽 모드로 들어 갈 때 약간의 카메라 줌인이 필요하며 이를 위해 아래와 같이 구현했었다.
publicvoidonEntryPickMode() { // 초기 실행 부분 생략
HashtabletweenParams = newHashtable();
tweenParams.Add ("time", 3.0f); tweenParams.Add ("p-osition", originPosition); // 애니메이션 종료시 실행할 콜백을 여기서 설정한다. tweenParams.Add ("oncomplete", "onActivateEntryPick"); tweenParams.Add ("oncompletetarget", gameObject); iTween.MoveFrom(GameObject.Find ("CamPivot"), tweenParams); } publicvoidonActivateEntryPick() { // 실제 중요한 코드는 여기 다 있다. }
단지 3초간의 카메라 애니메이션을 위해서 코드가 두 개로 분리되어있다. onActivateEntryPick은 다른 곳에서는 호출되지 않으므로 굳이 나눠줄 필요가 없지만 iTween에서 반드시 콜백 함수의 이름을 넘겨 주어야 콜백이 되기 때문에 애니메이션 종료 후 실행할 코드를 별도의 메서드로 만들어야 했다.
대상 컴퍼넌트와 프로퍼티 이름을 맨 위에서 명확히 하였고 그 후에 from, to, duration 정보가 온다. 파라미터의 순서 자체는 코드의 동작에 전혀 문제가 없지만, 위와 같은 순서로 할 경우 가독성이 확실히 좋아진다. 또한 Hashtable API를 귀찮게 이용하지 않아도 되기 때문에 작성하기에도 훨씬 편하다.
4. 순서대로 애니메이션 플레이
iTween에서는 두 개의 애니메이션을 순서대로 플레이 시키기 위해서 delay를 이용해 애니메이션을 시간차를 두고 플레이시키는 편법을 사용하였다.
아래 코드는 장면전환시 사용하도록 fade-out -> fade-in을 순차적으로 실행하는 애니메이션이다. 이경우 fade-in은 fade-out의 플레이시간에 맞춰 delay를 주어서 애니메이션의 순서를 맞추었다.
두 개의 FFani.Tween을 FFani.Serial로 묶어줌으로써 순서대로 애니메이션을 실행 시킬 수 있다. 뒤의 애니메이션은 앞의 애니메이션이 끝나면 자동으로 실행된다. 앞의 애니메이션의 플레이시간 (duration)이 바껴도 뒤의 애니메이션이 이를 의식할 필요가 없다.
현재 내가 직접 작성한 코드는 iTween을 없애고 FFani.Tween으로 대체할 계획이다. 아직은 지원되지 않는 기능도 있고 테스트도 충분히 하지 못했기 때문에 당분간은 FFani.Tween의 완성도를 높이는 데에 주력해야 될 듯 싶다.
정확히는 카메라에 피사계심도(DOF) 를 적용해서 배경 블러처리로 분위기를 내는것을 했었는데
그렇게 하니까 3D텍스쳐가 아닌 스프라이트 이미지 들이 블러가 안먹는 상황이었습니다.
다행이 유니티 엔지니어 분이 답변해주셨었는데
-------------------------------------------------
3D공간에 그리고 있는 UI들은 DOF의 블러 영역에서 흐려지는 거는 어쩔 수 없어요. DOF는 뎁스덱스쳐(버퍼)에 있는 정보를 가지고 원경 블러 처리를 하는데, 보통 UI는 뎁스버퍼에 그리지를 않으니 제대로 처리가 안되요. 3D공간의 위치를 2D로 투영해서 2D 처리해서 그리는게 현실적으로 가장 좋은 대안일거예요
-------------------------------------------------
하고 하네요
FFT를 플레이하면서 가장 맘에 안들었던 것이, 전투 맵 상에 적이 누가 어디에 있는지 모른 채 별도의 엔트리 화면에서 아군의 엔트리를 설정해야 한다는 것이었음. 그래서 언제나 플레이할 때 1. 일단 아무렇게나 엔트리를 설정 2. 플레이 시작후 적들의 상태와 위치를 확인 3. 리셋후 다시 엔트리 설정 이라는 번거로운 과정을 거쳐야 했음. 그래서 이번 리메이크때는 이러한 불편을 없애고 새로운 방법으로 씬을 구성하였음.
오리지널 FFT의 경우
엔트리 구성 화면과 전투 화면이 분리
엔트리 픽 화면 -> 전투 화면
My FFT Remake의 경우
전투 맵상에서 엔트리 구성이 가능. 이 때 화면을 움직여서 적들의 위치와 상태를 파악 가능(아직 미구현).
엔트리 구성 모드 -> 전투 모드
2. 전투맵 설정 모드를 구현
맵 상에서 적 유닛을 설정하고 아군의 엔트리 포인트를 설정할 수 있는 모드를 구현
적 유닛 설정
아군의 엔트리 포인트 설정
3. 모든 UI는 터치/마우스에 최적화될 수 있도록 변경하였음.
엔트리 픽, 설정 모드 전부 파레트 창에서 선택 가능한 아이템을 표시하여 파레트 창에서 아이템 선택 -> 맵에서 타일을 선택 하는 방식으로 바꿨음.