1

Unity3d iOS 用のシンプルなプラグインを作成しようとしていますが、これはストリーミング ビデオについて聞いたことがあるかもしれません。私は実際にそれを行うことができました.ストリーミングビデオビットは機能します.

今、スワイプ ジェスチャを検出して Unity にメッセージを送信するプラグインの一部である機能を追加しようとしています。私はObjective Cの経験がなく、現在、この1つの特定の問題の解決策を探しているだけなので、詳細を学ぶことに興味がありません.

だから私は、実際のビデオをストリーミングするために必要なすべてのものと、スワイプジェスチャーを登録するためのいくつかのコードをGoogleに管理しました. 問題は、UISwipeGestureRecognizer を定義する際に、それにアクション メソッドを割り当てる必要があることです。ただし、ビデオ ストリーミングを行う関数は、Unity で参照できるようにするために必要な extern "C" ブロックで定義されています。

ただし、ジェスチャー認識エンジンに割り当てられたメソッドは、iOS アプリの通常のフレームワークで定義する必要があります (私はそう思います) が、これにより、ジェスチャー認識クラスが extern "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];


    }


}
4

1 に答える 1

2

あなたの問題はswipe、ターゲットとして渡すときに未定義であることです。渡されたときにスタックに何があるか誰が知っていますか? これにより、スワイプしたときにメソッドがメモリ内の不適切な場所に送信されます。

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

これは次と同等です。

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

ターゲットは、loadLevel:メソッドを定義するクラスのインスタンスである必要があります。


編集 (リンクを追跡した後): のインスタンスVideoPlugin

2 つ目の問題は、メソッドloadLevel:が とは異なることloadLevelです。それらが一貫していることを確認してください。

于 2013-06-05T20:50:12.757 に答える