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
  • /Plugins/iOS/文件夹中
  • 构建目标是带有最新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项目。

如果有人遇到了这样的问题并解决了它,我很乐意听到解决方案。

Objective C iOS plug-ins for Unity

你已经写了一个"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]);
    }
}