Objective C iOS plug-ins for Unity
本文关键字:for Unity plug-ins iOS Objective | 更新日期: 2023-09-27 18:18:43
我用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
最后是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 的
- 构建目标是带有最新iOS的iPad Air 2,所以不会出现问题。在最新的OS X版本上使用最新的Xcode。
- 我有最新版本的Unity3d,如果这很重要-我确实有Unity3d的Pro版本。
- 项目工作,如果插件被删除,所以这不是Unity3d和Xcode之间的问题。
- 我不认为我需要使用
extern "C"
包装在Objective-C代码,因为它是一个"。M "文件,而不是"。,所以应该不会有名字混淆的问题。 这个插件是在Xcode中通过"Cocoa Touch Static Library"模板创建的。在将Xcode项目导入Unity3d之前,我能够成功地自己构建Xcode项目。
/Plugins/iOS/
文件夹中如果有人遇到了这样的问题并解决了它,我很乐意听到解决方案。
你已经写了一个"objective-c"类和方法,但这不能暴露给Unity。你需要创建一个"c"方法(如果需要的话,它可以调用objective-c方法)。
,
plugin.m:
long getGoodNumber() {
return 111;
}
这里是一个更完整的例子,演示了我们获得陀螺仪的参数。
让我们制作一个运动管理器来获得陀螺仪(现在伪造)。这将是标准的objective-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]);
}
}