最近、dllを作ってみたいという気持ちから何個かdllを作成しているわけだが、
プリプロセッサを仕込んだ処理が動かなくて、まじかよ...と思いつつ仕方なく処理を書き換える
みたいな事があったのだけど、何故なのかなと思ったら結構基本的なことだったので、
また「なんで?」って調べないようにするためにメモっておく。
どういう事なの
ここの中にあるリンクから見てみたら
Before the actual compilation of every C program it is passed through a Preprocessor.
C言語のプログラムを実際にコンパイルする前に、プリプロセッサを通すんだよって書いてました。。
作成する時のその時点のプリプロセッサ分岐した内容でビルドされるから、
dllを作ってもその分岐内容が意味を成さなくなるって事かな?と
#if UNITY_EDITOR Debug.Log("エディタです"); #else // dll作る時エディタ上動作してるわけではないのでUNITY_EDITORを通らない。 // だからここを通る状態でビルドされる。 // dllがそもそも"elseを通った状態"で出来てるから、 // dllを置いてエディタ上で動かしても「エディタじゃないよ」と出力される Debug.Log("エディタじゃないよ"); #endif
どうしてもプリプロセッサを使いたい時
実際に使う時には、関数で分けて、エディタ側で呼ぶ用のスクリプトから該当の関数を呼び出せばいいっぽい
もし自分ならこうするかもっていうサンプル↓
DLL側
using UnityEngine; using UnityEditor; // とりあえずネームスペースも切っといた namespace DllTest { // DLL側に記述するメインとなるコード public class DllTestEditor { // OnGUI()とかはエディタ側のプログラムで使用する /// <summary> /// エディタの場合の要素 /// </summary> public static void SampleEditor( ) { EditorGUILayout.LabelField( "エディタだよ", EditorStyles.boldLabel ); } /// <summary> /// エディタでない場合の要素 /// </summary> public static void SampleNotEditor( ) { EditorGUILayout.LabelField( "エディタだよ", EditorStyles.boldLabel ); } /// <summary> /// メインになる要素 /// </summary> public static void SampleMain( ) { EditorGUILayout.BeginHorizontal( ); { EditorGUILayout.Toggle( false, GUILayout.Width( 16f ) ); EditorGUILayout.LabelField( "メインの要素", GUILayout.ExpandWidth( true ), GUILayout.MinWidth( 0f ) ); } EditorGUILayout.EndHorizontal( ); } } }
エディタ側
using UnityEditor; using DllTest; /// <summary> /// エディタ側のスクリプト /// </summary> public class DllTestEditorMain : EditorWindow { [MenuItem( "Test/DllTestEditorMain", false, 1 )] public static void OpenTestWindow( ) { DllTestEditorMain window = EditorWindow.GetWindow<DllTestEditorMain>( "DllTestEditorMain" ); window.Show( ); } /// <summary> /// Unity OnGUI /// </summary> private void OnGUI( ) { #if UNITY_EDITOR // エディタの場合の要素 DllTestEditor.SampleEditor( ); #else // エディタじゃない場合の要素 DllTestEditor.SampleNotEditor( ); #endif // メインの要素 DllTestEditor.SampleMain( ); } }
こんな感じに書いたら動作した。
結局コアになる部分の処理は隠蔽出来てるし、これでもいいかもねとは思った