2013-06-05 25 views
1

我正在尝试为Unity3d iOS编写一个简单的插件,您可能已经听说过那个流视频。我真的设法做到这一点,流视频位的作品。在extern“C”块中定义一个能够引用外部方法的类

现在,我正在尝试添加插件的功能,以检测滑动手势并向Unity发送消息。我没有使用Objective C的经验,而且目前对学习这些细节并不感兴趣,因为我只想为这个特定问题寻找解决方案。

所以我设法谷歌所需的所有东西流实际的视频,也注册滑动手势的一些代码。问题在于,在定义UISwipeGestureRecognizer时,您需要为其分配一个操作方法。但是执行视频流的功能是在extern“C”块中定义的,这个块需要在Unity中引用。

分配给手势识别器的方法虽然必须在iOS应用程序的常规框架中定义(我认为),但是我的怀疑是这会产生手势识别器类不知道外部定义的方法的问题外部“C”块。

所以,现在当我运行它,视频开始流式传输,但只要我开始刷屏幕,它全部崩溃。大概是因为指定的方法不能被引用是我的猜测。

我的问题是......我如何做到这一点,也许有一些明显的东西我不知道?重要的是使它在一个在extern“C”块中定义的函数中工作,因为Unity毕竟是必需的。

这是实际的代码,我放在一起至今:

http://www.hastebin.com/ragocorola.m < - 完整的代码

要揣loadLevel方法究竟应该如何申报?

extern "C" { 


    void _playVideo(const char *videoFilepath) 
    { 

     NSURL *url = [NSURL URLWithString:CreateNSString(videoFilepath)]; 

     MPMoviePlayerController *player = [[MPMoviePlayerController alloc] 
     initWithContentURL:url]; 

     player.controlStyle = MPMovieControlStyleFullscreen; 
     player.view.transform = CGAffineTransformConcat(player.view.transform, 
           CGAffineTransformMakeRotation(M_PI_2)); 

     UIWindow *backgroundWindow = [[UIApplication sharedApplication] keyWindow]; 

     [player.view setFrame:backgroundWindow.frame]; 
     [backgroundWindow addSubview:player.view]; 



     UISwipeGestureRecognizer * swipe = [[UISwipeGestureRecognizer alloc] 
     initWithTarget:swipe action:@selector(loadLevel:)]; 

     [swipe setDirection:(UISwipeGestureRecognizerDirectionUp | 
     UISwipeGestureRecognizerDirectionDown | UISwipeGestureRecognizerDirectionLeft 
     |UISwipeGestureRecognizerDirectionRight)]; 


     [player.view addGestureRecognizer:swipe]; 

     [player play]; 


    } 


} 
+0

在你的代码中有一条评论说'extern C'块只需要在.mm或者.cpp文件中。你有一个.m文件,那么它是绝对必要的? – SevenBits

+0

Extern C块是必需的,以便在Unity3D中使用该函数。它不是一个.m文件,它是一个.mm文件,这就是巧合生成的链接hastebin。我的Xcode项目中的文件名称叫做VideoPlugin。mm – Balthatczar

+0

此功能在Unity3D中的代码中引用如下: [DllImport(“__Internal”)] private static extern void _playVideo(string videoFilepath); – Balthatczar

回答

2

您的问题是,当您将它作为目标传递时,未定义swipe。当它通过时,谁知道堆栈上有什么?这会导致在您滑动时将方法发送到内存中的错误位置。

UISwipeGestureRecognizer * swipe = [[UISwipeGestureRecognizer alloc] 
initWithTarget:swipe action:@selector(loadLevel:)]; 

这相当于:

id undefinedTarget; 
UISwipeGestureRecognizer * swipe = [[UISwipeGestureRecognizer alloc] 
    initWithTarget:undefinedTarget action:@selector(loadLevel:)]; 

你的目标必须定义loadLevel:方法的类的一个实例。


编辑(在追踪您的链接后):即VideoPlugin的实例。

虽然第二个问题你会得到的是,方法loadLevel:是不同于loadLevel。确保它们一致。

+0

非常感谢您的评论。我怀疑这应该是一个问题,但所有的例子,我发现宣布自我作为一个目标,我不知道它是什么,也被确定为Xcode的未申报的标识符,如果我尝试。你能否给我提供一个例子,解释如何创建一个定义LoadLevel:方法的类(我怀疑是 - (void)loadLevel),然后创建一个实例?我会非常感谢:) – Balthatczar

+0

这是否有利于我的代码的上下文? VideoPlugin * swipetarget = [[VideoPlugin alloc] init]; – Balthatczar

+0

谢谢!我实际上得到它的工作 – Balthatczar

相关问题