C# 用于Unity的Objective C iOS插件
使用我制作的Objective C插件在Xcode中构建Unity3d项目(在设备上测试)时遇到问题。C# 用于Unity的Objective C iOS插件,c#,ios,objective-c,xcode,unity3d,C#,Ios,Objective C,Xcode,Unity3d,使用我制作的Objective C插件在Xcode中构建Unity3d项目(在设备上测试)时遇到问题。 以下是文件: TestPlugin.h文件: #import <Foundation/Foundation.h> @interface TestPlugin : NSObject +(int)getGoodNumber; @end #import "TestPlugin.h" @implementation TestPlugin +(int)getGoodNumber {
以下是文件:
TestPlugin.h
文件:
#import <Foundation/Foundation.h>
@interface TestPlugin : NSObject
+(int)getGoodNumber;
@end
#import "TestPlugin.h"
@implementation TestPlugin
+(int)getGoodNumber
{
return 1111111;
}
@end
最后,unity中的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项目保持相同
我还想澄清几件事:
- 插件文件位于Unity3d的
文件夹中/Plugins/iOS/
- 构建目标是配备最新iOS的iPadAir 2,因此不会出现任何问题。在最新的OSX版本上也使用最新的Xcode
- 我有最新版本的Unity3d,如果这很重要的话,我有专业版的Unity3d
- 如果插件被删除,项目就可以运行,因此Unity3d和Xcode之间没有问题
- 我认为我不需要在Objective-C代码中使用
wrapper,因为它是一个“.m”文件,而不是“.mm”,所以不应该存在名称混乱的问题extern“C”
- 该插件是通过“Cocoa Touch静态库”模板在Xcode中创建的。在将Xcode项目导入Unity3d之前,我能够成功地自行构建Xcode项目
long getGoodNumber() {
return 111;
}
@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:
MyMotionManager.h
@interface MyMotionManager : NSObject { }
+(MyMotionManager*) sharedManager;
-(void) getGyroXYZ:(float[])xyz;
@end
MyMotionManager.m:
long getGoodNumber() {
return 111;
}
@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,因为它在a.m(不是a.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]);
}
}
如果您可以用plugin.m调用的例子来扩展您的答案,例如陀螺仪getter(x、y或z,没关系)我以后可以通过Unity获得,例如一个可以调用其他objective-c方法的插件。在这种情况下,我想给这个答案一个质量奖励。请等待48小时,直到我可以开始,然后分配奖励!)