UnityでC言語のポインタを扱う方法

C/C++のソースコード

私は以前ゲームエンジンとして Cocos2d-x を利用していた時期がありました。今では専らUnityですが、当時のアルゴリズムを利用したいときもあります。しかし、Cocos2d-xは開発時のプログラミング言語がC/C++でありポインタを使うのが当たり前の言語であるため、そのままではC#で利用することはできません。最も良いのはC/C++からC#に移植することですが、膨大にあるソースコードの移植作業は非常に困難です。そこで Unity の C# でもポイントを扱えるようにしましょう。
ここではUnityのC#でC言語のポインタを扱う方法を紹介します。

C#でポインタを使用

C#のソースコード中に次のソースコードのようにポインタを書こうとすると、エラーが発生します。

using UnityEngine;

public class Manager : MonoBehaviour
{
    void Start()
    {
        int num = 2;
        int *p_num;
        p_num = #
    
        Debug.Log("int num: " + num);
        Debug.Log("intポインタ p_num: %p" + *p_num);
    }
}
error CS0214: Pointers and fixed size buffers may only be used in an unsafe context

エラーメッセージにあるように、ポインタは unsafe コンテキストでのみ使用できます。

unsafe キーワード

C# には unsafe キーワードが用意されており、unsafe で囲まれたメソッドやブロック内でポインタを使用することができるようになります。
試しに次のソースコードのように、Startメソッドに unsafe 修飾子を用いると、またエラーが発生します。

using UnityEngine;

public class Manager : MonoBehaviour
{
    unsafe void Start()
    {
        int num = 2;
        int *p_num;
        p_num = #
    
        Debug.Log("int num: " + num);
        Debug.Log("intポインタ p_num: %p" + *p_num);
    }
}
error CS0227: Unsafe code may only appear if compiling with /unsafe. Enable "Allow 'unsafe' code" in Player Settings to fix this error.

エラーメッセージに、Player Settingsの「 Allow 'unsafe' code 」を有効にしてくださいと書かれていますね。

Allow 'unsafe' code を有効にする

では Player Settings の Other Settings にある「 Allow 'unsafe' code 」にチェックを入れましょう。

これでポインタが利用できるようになります。
先のソースコードを実行してみます。正常にログを出力することができましたね。

また unsafe は次のようにブロックでも利用することができます。

using UnityEngine;

public class Manager : MonoBehaviour
{
    void Start()
    {
        unsafe
        {
            int num = 2;
            int *p_num;
            p_num = #
    
            Debug.Log("int num: " + num);
            Debug.Log("intポインタ p_num: %p" + *p_num);
        }
    }
}

まとめ

C/C++で書かれたソースコードをC#に移植したい場合、ポインタを用いずC#のルールで記述することが一番望ましいですが、手っ取り早くC#で動かすには unsafe を用いるといいでしょう。

TKS2では、C/C++で書かれたソースコードをUnityへ移植するお手伝いもさせて頂いております。もしお困りのときはぜひお声がけください。