なえ箱

メモを植えます

C#で作成したdllのプリプロセッサが動かない【Unity】

この記事をシェアする

最近、dllを作ってみたいという気持ちから何個かdllを作成しているわけだが、

nae3na.hatenablog.com

nae3na.hatenablog.com

nae3na.hatenablog.com

プリプロセッサを仕込んだ処理が動かなくて、まじかよ...と思いつつ仕方なく処理を書き換える

みたいな事があったのだけど、何故なのかなと思ったら結構基本的なことだったので、

また「なんで?」って調べないようにするためにメモっておく。

広告設定のエディタ拡張ではDefine Symbol設定してたら動作するようにしようとしたが、常にtrueが返るように変更した

どういう事なの

stackoverflow.com

ここの中にあるリンクから見てみたら

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( );
    }
}

こんな感じに書いたら動作した。

「エディタだよ」って表示された

結局コアになる部分の処理は隠蔽出来てるし、これでもいいかもねとは思った