我在使用我制作的Objective C插件在Xcode中构建Unity3d项目(在设备上进行测试)时遇到了问题。
以下是文件:
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/
文件夹中extern "C"
包装器,因为它是“ .m”文件,而不是“ .mm”,所以不应该名称错误的问题。如果有人遇到解决问题,我很乐意听到解决方案。
答案 0 :(得分:7)
您已经写过&#34; objective-c&#34;类和方法,但不能暴露给Unity。你需要创建一个&#34; c&#34;方法(如果需要,可以调用objective-c方法)。
例如:
<强> plugin.m:强>
long getGoodNumber() {
return 111;
}
这是一个更全面的例子,演示了参考陀螺获得陀螺仪。
让我们让运动经理得到陀螺(暂时伪造)。这将是标准目标-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]);
}
}