2015-10-22 46 views
3

我在使用我製作的Objective C插件在Xcode中構建Unity3d項目(以在設備上測試)時遇到問題。
以下是文件:Objective C適用於Unity的iOS插件

TestPlugin.h文件:

#import <Foundation/Foundation.h> 

@interface TestPlugin : NSObject 

+(int)getGoodNumber; 
@end 

TestPlugin.m文件:

#import "TestPlugin.h" 

@implementation TestPlugin 

+(int)getGoodNumber 
{ 
    return 1111111; 
} 

@end 

最後的C#腳本在統一那是應該打印出來的值getGoodNumber()回報:

using UnityEngine; 
using System.Collections; 
using System.Runtime.InteropServices; 

public class PluginTest : MonoBehaviour 
{ 
    [DllImport ("__Internal")] 
    public static extern int getGoodNumber(); 

    void OnGUI() 
    { 
     string goodNum = getGoodNumber().ToString(); 
     GUILayout.Label (goodNum); 
    } 

} 

儘管我可以告訴代碼應該沒有任何問題。但是,即使我跟很多不同的教程,當我嘗試編譯我在Xcode中得到一個錯誤:

Undefined symbols for architecture armv7: 
    "_getGoodNumber", referenced from: 
     RegisterMonoModules() in RegisterMonoModules.o 
ld: symbol(s) not found for architecture armv7 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

我嘗試一百萬個不同的東西,似乎沒有任何幫助。儘管我可以從其他教程中閱讀,但我不需要爲Xcode進行任何特殊設置,並且可以將其保留爲不帶插件的Unity項目。

我也想澄清一些事情:

  • 插件文件位於/Plugins/iOS/文件夾中Unity3d
  • 構建目標是產品iPad Air 2採用最新的iOS,所以沒有問題應該出現那裏。還在最新的OS X版本上使用最新的Xcode。
  • 我有最新的Unity3d可用版本,如果這很重要 - 我確實有Pro版本的Unity3d。
  • 該項目如果插件被刪除,所以它不是Unity3d和Xcode之間的問題。
  • 我認爲我不需要在Objective-C代碼中使用extern "C"包裝,因爲它是「.m」文件,而不是「 .mm」,所以不應該存在名稱混亂的問題。
  • 插件是通過「Cocoa Touch Static Library」模板在Xcode中創建的。在將其導入到Unity3d之前,我能夠自己成功構建Xcode項目。

如果有人遇到這樣的問題解決了它,我很樂意聽到解決方案。

回答

6

你已經寫了一個「objective-c」的類和方法,但是它不能暴露給Unity。您需要創建一個「c」方法(如果需要,可以調用objective-c方法)。

如:

plugin.m:

long getGoodNumber() { 
    return 111; 
} 

下面是一個說明OUT參數,以獲得陀螺儀更完整的例子。

讓我們做一個運動管理器來獲取陀螺儀(現在僞造)。這將是標準目標c:

MyMotionManager.h

@interface MyMotionManager : NSObject { } 

+(MyMotionManager*) sharedManager; 
-(void) getGyroXYZ:(float[])xyz; 

@end 

MyMotionManager.m:

@implementation MyMotionManager 

+ (MyMotionManager*)sharedManager 
{ 
    static MyMotionManager *sharedManager = nil; 
    if(!sharedManager) 
     sharedManager = [[MyMotionManager alloc] init]; 
    return sharedManager; 
} 

- (void) getGyroXYZ:(float[])xyz 
{ 
    // fake 
    xyz[0] = 0.5f; 
    xyz[1] = 0.5f; 
    xyz[2] = 0.5f; 
} 

@end 

現在讓我們通過C的外部基準(無需將其暴露extern,因爲它在.m(不是.mm)中:

MyMotionManagerExterns.m:

#import "MyMotionManager.h" 

void GetGyroXYZ(float xyz[]) 
{ 
    [[MyMotionManager sharedManager] getGyroXYZ:xyz]; 
} 

最後,在Unity C#讓調用它:

MotionPlugin.cs:

using UnityEngine; 
using System; 
using System.Collections; 
using System.Runtime.InteropServices; 

public class MotionPlugin 
{ 
    [DllImport("__Internal")] 
    private static extern void GetGyroXYZ(float[] xyz); 

    public static Vector3 GetGyro() 
    { 
     float [] xyz = {0, 0, 0}; 
      GetGyroXYZ(xyz); 
      return new Vector3(xyz[0], xyz[1], xyz[2]); 
    } 
} 
+0

如果你能與plugin.m電話的延伸。例如你的答案,比如陀螺儀的getter (x,y或z,沒關係),我以後可以用Unity獲得,例如一個可以調用其他objective-c方法的插件。在這種情況下,我想給這個答案一個質量的賞金。 –

+0

請等待48小時,直到我可以開始,然後指定賞金! :) –

+0

哦哈哈!我太快了 - 以前從未做過賞金! – peterept

相關問題