2

Unity 用のプラグインを作成するための基本的な前提は、Unity 内から呼び出したいすべてのクラスのラッパーを作成することです。ただし、私が見つけたすべてのドキュメントと例では、対応する .cpp (c++ の場合) または .mm (objective-c の場合) ファイルが必要でした。

ただし、ソース ファイルを含まないネイティブ iOS コード用のプラグインを作成しようとしています。私がアクセスできるのは、4 つのヘッダー ファイルと 1 つの .a ファイルだけです。ここから得たもの。

現在、ラップする .mm ファイルがないため、これらのファイルを Unity に取り込み、内部から呼び出すことができるようにする方法について少し混乱しています。誰もこれをやったことがありますか?

プラグインとして 4 つのヘッダー ファイルと .a ファイルを Unity に取り込む際に役立つドキュメントや何かを教えてもらえますか?

私がアクセスできるソース ファイルはありません。ヘッダーファイル自体のみ。

4

3 に答える 3

2

関数の宣言を知っている限り、ソース ファイルは必要ありません。ヘッダー ファイルも必要ありません。

iOS 用プラグインの構築で説明されているように:

1.) .a ファイルを Assets/Plugins/iOS に配置します

2.) ヘッダー ファイルを見て、必要な関数シグネチャを取得します。

void RegisterUnityIPodCallbackListener (const char* gameObject, const char* method);

3.) RegisterUnityIPodCallbackListenerC# クラス内で次のように宣言します。

public class IPodHandler {
    [DllImport("__Internal")]
    private static extern void RegisterUnityIPodCallbackListener (string gameObject, string method);
    public static void MyRegisterUnityIPodCallbackListener () {
       if (Application.platform == RuntimePlatform.IPhonePlayer) {
           RegisterUnityIPodCallbackListener (GAME_OBJECT, METHOD);
       }
    }
}

4.) 適切な場所に電話します。

IPodHandler.MyRegisterUnityIPodCallbackListener ("MyCallbackGameObject", "MyCallbackMethod");

よくある落とし穴:

  • Assets/Plugins/iOS 内にディレクトリ構造を構築しないでください。そうしないと、生成された Xcode プロジェクトにファイルがコピーされません。
  • エディター プレーヤーでのテスト時にフォールバック ソリューションを提供する
于 2013-10-31T19:57:27.437 に答える
1

ここに別のガイドがあります: iOS 用 Unity3d プラグインのビルド方法

「アーキテクチャの未定義シンボル...」のようなエラーが発生した場合の注意事項

1) .a-file で使用されているアーキテクチャが自分のものと一致していることを確認します (たとえば、armv7)。

2) Unity が必要とするため、.a ファイルが libstdc++ (GNU C++ 標準ライブラリ) でコンパイルされていることを確認します。

于 2013-11-01T07:45:35.597 に答える
1

使用している Estimote SDK には ObjectiveC クラスがあります。ObjectiveC の関数は、Unity プラグインを介して直接呼び出すことはできません (C++ クラスも同様です)。その理由は、コンパイル時に関数名が処理されるためです。

Unity C# クラスとライブラリ間のインターフェイスは、純粋な C インターフェイスである必要があります。そのため、.a ファイルと一緒に .mm または .cpp ファイルが存在することがよくあります。これらは、純粋な C ラッパーで C++ または ObjectiveC クラスをラップするためのものです。

Estimote 関数のほとんどはクラス関数のように見えるため、作業は少し簡単になります。したがって、NSObject を作成および削除するためにラッパー関数を記述する必要はありません。

これは私が書いた例で、TestFlightSDK の純粋な C ラッパーです。https://github.com/notoes/TestFlightUnity/blob/master/src/TestFlightCBinding.mm

extern "C" ブロックに注意してください。これは、ファイルのコードを名前マングリングなしでコンパイルすることを強制しています。C 関数シグネチャと、関数内の ObjectiveC 呼び出し。

Esitmote ESTBeacon クラスを例として使用すると、connectToBeacon 呼び出しは次のようになります。

extern "C" {
    void ESTBeacom_Connect()
    {
        [ESTBeacon connectToBeacon];
    }
}

.cs 関数は次のようになります。

class ESTBeacon {
    [DllImport ("__Internal")]
    private static extern void ESTBeacon_Connect();

    public static void Connect() {
        if( Application.platform == RuntimePlatform.IPhonePlayer )
            ESTBeacon_Connect()            
    }
} 

.cs、.mm、および .a ファイルを Plugins/iOS に配置すれば、問題ありません。

このリファレンスを使用して、さまざまなデータ型を渡す方法を確認してください。http://www.mono-project.com/Interop_with_Native_Libraries

于 2013-11-01T08:46:57.137 に答える