삽질하는플머

Unity 3D 설치. MonoDevelop 와의 첫 만남.

여가생활/Unity,Mono&.Net
Unity 3D 는 알게 모르게 어느새 대세가 되어있는 무시하기 힘든 멋진 물건. 
4월 8일까지 iOS, 안드로이드 빌드가 가능한 Basic 버전을 무료로 배포하는 통 큰 행사덕에 일단 다운받아 깔아보았다.
말로만 듣던 MonoDevelop 도 한번쯤 써보고 싶었고...

유니티와 함께 설치된 MonoDevelop 는 유니티용으로 필요한 것만 추린 물건이라 많은 부분이 비어있다.
윈도나 하나 띄워볼까 싶어 GTK 프로젝트를 생성하니 에러만 빠바방~  심지어는 디버거도 없다.  

일단 GTK# 부터 설치해보자. 
http://monodevelop.com/Download 

여기서 윈도 아이콘을 눌러주면  "GTK# for .NET 2.12.10" 을 내려받을 수 있는 링크가 나타난다. 




설치한 후 생성된 .NET 바이너리를 실행시키려면 GTK# 이 설치된 디렉토리에 PATH가 걸려있어야 한다. 
바로 적용되지 않으니 시스템->등록정보에서 환경변수를 한 번 확인해주거나 귀찮으면 그냥 재부팅 하자.

이제 MonoDevelop 에서 GTK# 프로젝트를 생성하고 GUI Designer 를 사용할 수 있다. 








유니티용 MonoDevelop는 유니티용으로 이런저런 설정이 추가된 물건이라 그런지 디버거도 빠져있다. 
어차피 유니티용이고 스크립트 작업시 디버거로 유니티 자체를 실행시키도록 되어있으니 빼버린 듯 하다. 
뭐 정 필요하면 독립적인 MonoDevelop을 내려받아 쓰면 될 일이고... 어차피 C#을 다른 곳에 쓸 일은 없으니 일단 패스. 
다만 일반적인 어플을 만들때와 달리 유니티에서 띄우면 Run 메뉴가 비활성화되고 Debug 메뉴만 살아있는 게 신기하군. 
유니티 프로젝트를 불러왔을 때 Reference 에 UnityEngine.dll 이 포함되어있는 것과 관련이 있는 듯. 



실제로 그런지 파보자. Hello World를 출력해주는 빈 콘솔 프로젝트를 시작하고 컴파일. 이 시점에서 Run 메뉴는 아직 살아있다. 




솔루션 브라우저에서 "References" 를 우클릭하고 "Edit Preferences" 메뉴를 선택한 뒤 ".Net Assemply" 탭에서 유니티가 설치된 디렉토리 아래 .../Editor/Data/Managed/ 폴더로 이동, UnityEngine.dll 을 선택한 뒤 Add버튼을 눌러준다. 



이 DLL을 포함시키는 순간, MonoDevelop의 Run 메뉴는 비활성화되고 Debug 메뉴가 활성화된다. 
UnityEngine 네임스페이스에 접근할 수 있으므로 UnityEngine의 자료형을 테스트 해볼 수도 있다. 

.....

UnityEngine.Vector3 vt = UnityEngine.Vector3.left;
Console.WriteLine ("{0}, {1}, {2}", vt.x, vt.y, vt.z);

...... 


실행버튼이 비활성화되어있으니 Ctrl+F8로 빌드하고 생성된 실행파일을 탐색기에서 직접 돌려보자. 



오호~~ 뭔가 감이 잡히는 듯 해~~

당연한 얘기겠지만, 이렇게 만들어진 실행파일은 유니티 프로젝트가 아니므로 실제 뭔가를 하는 것은 불가능하다.
틱을 얻기 위해 여기저기 찔러서 알아낸 다음과 같은 코드도 빌드는 되지만 실행시키면 에러가 난다. 

......
float f = UnityEngine.Time.realtimeSinceStartup;
Console.WriteLine(f);



그래도 유니티와 모노가 이렇게 연결되어 동작하는구나~~ 짐작하게 되었으니 이것만으로도 큰 수확!

 



실제로 간단한 코드를 만들어 디버깅을 걸어보자. 
델파이를 오래 쓰다보니 뭔가 하려면 무조건 GUI가 있어줘야 하는 부작용이 있네. 
기왕 이렇게 된 거, 유니티의 GUI 요소들을 직접 가지고 놀아보자. 

GUI 스크립팅에 대한 레퍼런스 메뉴얼은 여기 .
http://unity3d.com/support/documentation/Components/GUI%20Scripting%20Guide.html 

유니티 강좌는 여기저기 많이 있으니 자세한 설명은 패스. 
유니티를 실행하고 빈 프로젝트를 생성하고 프로젝트 창에서 우클릭, GuiTest 라는 C#스크립트를 생성하자.
이 스크립트를 더블클릭하면 MonoDevelop가 실행된다. 여기에 다음과 같이 코딩해준다. 

using UnityEngine;
using System.Collections;

public class GuiTest : MonoBehaviour {

void OnGUI () {
if (GUI.Button (new Rect (10,10,150,100), "I am a button")) {
float f = Time.realtimeSinceStartup;
print ("Time from Start: " + f);
}
}
}





이 녀석을 끌어다 Hierachy 에 외롭게 혼자 있는 MainCamera 에 던져넣자. 



 
"Main Camera" 를 선택하고 Inspector 를 살펴보면 방금 추가한 GuiTest가 아래쪽에 보인다. 

 

Ctrl+Shift+C 를 눌러 콘솔을 띄운 뒤 유니티 상단의 실행 아이콘을 눌러주자. 
Game창에 버튼이 하나 생겨나고 이 버튼을 누를 때 마다 콘솔창에 이 게임이 실행된 후 경과된 시간값이 초단위로 출력된다. 


 
이제 실제로 디버깅을 걸어보자. 유니티를 닫고 모노만 남겨둔다.

모노에서 Run->Debug 메뉴를 선택하면 유니티가 다시 실행되면서 디버깅이 연결된다. 
아까 스크립트의 실행을 연결해두었던 MainCamera 가 어찌된 일인지 사라져버렸다. 
뭐 GameObject->CreateOther->Camera를 선택해 다시 만들자. 
새로 추가한 Camera에 아까와 같은 요령으로 GuiTest 스크립트를 연결해주고 실행아이콘을 누른다. 
모노에서 Print (...) 부분에 F9키로 브레이크 포인트를 걸고 유니티의 게임창에서 Gui버튼을 눌러보자. 

 

 

게임 실행이 브레이크 포인트에서 멈춘다. GUI버튼도 눌린 상태로 멈춰있다. 
당연히 Watch도 잘 동작한다. Step Over 로 한줄씩 지나가며 상태가 궁금한 변수는 들여다 볼 수 있다.
함수가 있다면 Step Into, Step Out 으로 들락날락 할 수도 있다. 이정도면 뭐~~ 쓸만하다. 

하지만... 디버깅이 길어질 수록 유니티가 더럽게 느려진다는 게 문제. 그리고 디버깅을 하려면 유니티를 다시 띄워야 하는 것도 불만.
기존 작업중인 상태에서 직접 디버거를 연결할 수 있다면 자주 쓰겠는데... 이 부분은 좀 더 뒤져봐야겠다. 


덤.
느려지는 문제가 집에 컴터가 꾸져서 그런가 싶었는데... 회사에서 재연해보니 마찬가지임. 

 
 덤 2. 
아직 유니티 문서 보는데 익숙치 않아서 해메게 되네. 암튼 찾아보니 디버깅에 대해 잘 정리된 문서가 있다. 
http://unity3d.com/support/documentation/Manual/Debugger.html 

Assets -> "Sync ModeDevelop Project" 메뉴를 한 번 실행시킨다. 
모노에서 Run -> Attack to Process... 메뉴를 선택한 뒤 실행중인 유니티 프로세스를 골라주면 끝!!
이 방법은 개발버전으로 빌드된 결과물들을 디버깅 할 때도 동일하다.