본문 바로가기

프로그래밍/Unity

[Unity] 유니티용 DLL

유니티 DLL 만들기



VS

File > New > Project

Visual C# > Class Library




참조추가

솔루션 익스플로러 Add Reference


Program Files\Unity\Editor\Data\Managed

UnityEngine.dll

UnityEditor.dll





코드작성

using System;

using UnityEngine;


namespace DLLTest {

public class MyClass {


}

}






설정, 출력파일 복사

응용프로그램 설정

대상프레임워크은 사용할 api 셋에 따라 선택해 준다.


기본적인 UnityEngine.dll 클래스들만을 사용

Unity 3.5 .net subset Base Class Libraries


UnityEditor.dll 사용

Unity 3.5 .net full Base Class Libraries





출력설정

빌드 후 이벤트에 다음 내용 추가 : 단순히 dll 을 Assets 하위의 원하는 폴더로 복사해도 된다.

아래는 빌드후 파일을 Assets/Plugins 폴더로 복사하도록 했음.




Unity 디버깅을 위한 mdb 생성

pdb2mdb.exe 는 mono 버전에 맞게 제공하고 있다.

"C:\Program Files\Unity\Editor\Data\Mono\lib\mono\2.0\pdb2mdb.exe"

"C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\4.5\pdb2mdb.exe"


.Net 3.5에 해당하는 api를 사용한 경우 pdb2mdb도 그 이상 버전을 사용해야 한다.



아무튼 4.5 버전으로 실행하면 실행은 되는데, 변환이 일어나지 않는다.

mono와 .net간에 인자를 처리하는데 문제가 있는지... 아무튼..


결국, pdb2mdb.exe를 .net이 아닌 mono로 실행시키면 정상 동작한다.


"C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\bin\mono" "C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\4.5\pdb2mdb.exe" "$(TargetDir)$(ProjectName).dll"



생성된 파일들을 사용하고자 하는 unity 프로젝트 plugins 폴더로 복사

copy /Y "$(TargetDir)$(ProjectName).dll" "$(SolutionDir)..\UnityProject\Assets\Plugins\$(ProjectName).dll"

copy /Y "$(TargetDir)$(ProjectName).pdb" "$(SolutionDir)..\UnityProject\Assets\Plugins\$(ProjectName).pdb"

copy /Y "$(TargetDir)$(ProjectName).dll.mdb" "$(SolutionDir)..\UnityProject\Assets\Plugins\$(ProjectName).mdb"





디버그

위 작업이 되어 있으면 기본적인 디버깅 설정은 된것이고, vs 디버그 메뉴에서 Unity Debug 연결을 사용해 유니티와 연결하면 정상적으로 디버깅이 가능하다.




dll을 수정하고 dll 복사한뒤에 디버깅시 브레이크가 동작하지 않는 경우가 있는데, editor를 껐다 다시 로드하면 정상 동작함.





리소스사용

이미지등 dll에 포함해 배포하고자 하는 경우.


사용하는 리소스를 프로젝트에 추가

각 파일의 속성정보에서 빌드 작업 항목을 '포함 리소스'로 변경

초기화 클래스 등에서 리소스 로드.


using System.Reflection;


namespace DllTest {

[InitializeOnLoad]

public class Startup {

static Startup()

{

if( EditorApplication.isPlayingOrWillChangePlaymode)

return;


// 에디터 시작시에만 호출하려면

// if( EditorApplication.timeSinceStartup > 10 ) return;



Assembly exeAssembly = Assembly.GetExecutingAssembly();


// 파일명은 namespace 부터 시작해 . 으로 구분

Stream fileStream = exeAssembly.GetManifestResourceStream("namespace.path.file-name");


// txt의 경우 reader 사용

StreamReader txtReader = 

new StreamReader( exeAssembly.GetManifestResourceStream("namespace.path.file-name"));



byte[] fileData = new byte[fileStream.Length];

fileStream.Read( fileData, 0, (int)fileStream.Length);


Texture2D texture = new Texture2D(1,1);

texture.LoadImage( fileData );

}

}

}

'프로그래밍 > Unity' 카테고리의 다른 글

[Unity] 테셀레이션  (0) 2019.04.05
[Unity] 인스펙터 변수 이름 변경  (0) 2018.11.13
[Unity] SteamVR 액션 설정  (0) 2018.11.05
[Unity] Post Process Stack v2  (0) 2018.10.31
[Unity] AR Foundation Package  (0) 2018.09.20
[Unity] VR 환경 끄거나 켜기  (0) 2018.09.14
[Unity] AssetDatabase  (0) 2018.09.12
[Unity] AssetBundle  (0) 2018.08.24
[unity3d] 서피스 쉐이더 정리  (1) 2018.06.26
[Unity] Mesh 생성 및 변경  (0) 2011.06.24