Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/109.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用于Unity的Objective C iOS插件_C#_Ios_Objective C_Xcode_Unity3d - Fatal编程技术网

C# 用于Unity的Objective C iOS插件

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 {

使用我制作的Objective C插件在Xcode中构建Unity3d项目(在设备上测试)时遇到问题。
以下是文件:

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代码中使用
    extern“C”
    wrapper,因为它是一个“.m”文件,而不是“.mm”,所以不应该存在名称混乱的问题
  • 该插件是通过“Cocoa Touch静态库”模板在Xcode中创建的。在将Xcode项目导入Unity3d之前,我能够成功地自行构建Xcode项目
如果有人遇到了这样的问题并解决了它,我很想听听解决方案。

您已经编写了一个“objective-c”类和方法,但它不能暴露于Unity中。您需要创建一个“c”方法(如果需要,可以调用objective-c方法)

例如:

plugin.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:

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小时,直到我可以开始,然后分配奖励!)