首页 文章

iOS上的Google Cardboard视频纹理与Unity 5

提问于
浏览
3

我正在尝试使用Google Cardboard SDK制作一个球形360视频 .

我已经使用 MovieTexture 对桌面构建进行了一些测试,但是在iOS中没有实现此类 .

我在资产商店看到了一些外部插件,但它们似乎都没有与Unity 5兼容 .

是否有Cardboard SDK提供的类来实现这一目标,或者您是否知道可以实现此目的的其他解决方案或插件?

2 回答

  • 2

    我终于解决了它 .

    我们必须删除CardboardAppController和MMTAppController并将它们合并为一个 .

    基本上在Assets / Plugin / ios中有2个AppControllers:“CardboardAppController.mm”(也有一个CardboardAppController.h头)和“MMTAppController.mm”

    诀窍是ios只在生成后“看到”一个app控制器 . 由于CardboardAppController是第一个,因此丢弃了MMTAppController .

    To solve this issue I have done the following:

    创建新的AppController:在我的例子中,它被命名为SVAppController.mm和SVAppController.h

    然后我们必须将app控制器合并到那个并删除它们 .

    所以我将CardboardAppController.h的内容粘贴到SVAppController.h,将CardboardAppController.mm的内容粘贴到SVAppController.mm( Make sure to change the names in the code replace CardboardAppController by SVAppController

    然后将MMTAppController.mm的内容复制到SVAppController.mm in the right place

    最后删除CardboardAppController和MMTAppController .

    您将留下1个app控制器,一切都应该正常工作 .

    供参考这是我的最终SVAppController:

    SVAppController.h

    #import "UnityAppController.h"
    #import "UnityAppController+Rendering.h"
    #import "UnityAppController+ViewHandling.h"
    
    // Unity 4.6.2 added a category to the app controller.
    #if UNITY_VERSION < 462
    #import "UnityInterface.h"
    #else
    #import "UnityAppController+UnityInterface.h"
    #endif
    
    // Unity 4 used a different method name to create the UnityView.
    #if UNITY_VERSION < 500
    #define createUnityView initUnityViewImpl
    #endif
    
    @interface SVAppController : UnityAppController
    
    - (void)preStartUnity;
    
    - (UnityView *)createUnityView;
    
    - (void)startSettingsDialog:(UIViewController *)dialog;
    
    - (void)stopSettingsDialog;
    
    - (void)pause:(bool)paused;
    
    - (void)shouldAttachRenderDelegate;
    
    @end
    

    SVAppController.mm

    #import "SVAppController.h"
    #import "CardboardView.h"
    #import <UIKit/UIKit.h>
    extern "C" {
    
        extern void readProfile();
        extern void syncProfile();
    
        extern "C" void MMTUnitySetGraphicsDevice(void* device, int deviceType, int eventType);
        extern "C" void MMTUnityRenderEvent(int marker);
    
        extern UIViewController* createSettingsDialog(id app);
        extern UIViewController* createOnboardingDialog(id app);
    
        bool isOpenGLAPI() {
    #if UNITY_VERSION < 463
            return true;
    #else
            SVAppController* app = (SVAppController *)GetAppController();
            UnityRenderingAPI api = [app renderingAPI];
            return api == apiOpenGLES2 || api == apiOpenGLES3;
    #endif
        }
    
        void launchSettingsDialog() {
            SVAppController* app = (SVAppController *)GetAppController();
            [app startSettingsDialog:createSettingsDialog(app)];
        }
    
        void launchOnboardingDialog() {
            SVAppController* app = (SVAppController *)GetAppController();
            [app startSettingsDialog:createOnboardingDialog(app)];
        }
    
        void endSettingsDialog() {
            SVAppController* app = (SVAppController *)GetAppController();
            [app stopSettingsDialog];
        }
    
    }  // extern "C"
    
    @implementation SVAppController
    
    - (void)preStartUnity {
        [super preStartUnity];
        syncProfile();
    }
    
    - (UnityView *)createUnityView {
        return [[CardboardView alloc] initFromMainScreen];
    }
    
    - (void)startSettingsDialog:(UIViewController*)dialog {
        [self pause:YES];
        [self.rootViewController presentViewController:dialog animated:NO completion:nil];
    }
    
    - (void)stopSettingsDialog {
        [[self rootViewController] dismissViewControllerAnimated:NO completion:nil];
        [self pause:NO];
    }
    
    - (void)pause:(bool)paused {
    #if UNITY_VERSION < 462
        UnityPause(paused);
    #else
        self.paused = paused;
    #endif
    }
    
    - (void)shouldAttachRenderDelegate;
    {
        UnityRegisterRenderingPlugin(&MMTUnitySetGraphicsDevice, &MMTUnityRenderEvent);
    }
    
    @end
    
    IMPL_APP_CONTROLLER_SUBCLASS(SVAppController)
    
  • 1

    Unity中的电影通常在对象上呈现为纹理 . 在移动设备上,问题变得设备只想在视频播放器中显示视频,因此不支持Unity类MovieTexture .

    我正在成功绕过这一点,并使用Unity资源商店中名为Easy Movie Texture的Unity插件在球体内部成功渲染360视频 .

    在Mac上工作,这就是我所做的:

    • 从Unity资源商店下载Easy Movie Texture插件

    • 从Assets / EasyMovieTexture / Scene打开Demo Sphere演示场景

    • 为项目创建一个新的(空)预制件,并将Sphere GameObject从Demo Sphere场景拖到预制件上 .

    • 重新打开Cardboard场景并将新的videosphere预制件拖动到层次结构中 .

    • 在Quicktime中打开源360视频

    • 文件 - >导出 - > 720p

    • 将文件扩展名从'.mov'更改为'.mp4'

    • 将新的mp4文件拖到项目的Assets / Streaming Assets目录中 . 注意:不要通过菜单系统导入,因为这会强制Unity转换为OGG .

    • 在您的videosphere GameObject的"Media Player Ctrl"脚本组件上,找到"Str_File_Name"字段并提供新导出的视频文件的FULL文件名 . 确保将扩展名包含在字符串"mymovie.mp4"中 .

    很确定这就是一切 . 希望它可以帮助其他人坚持这个问题 .

    最后请注意,视频只会在设备上呈现 . 在编辑器中,您只会在球体上看到白色纹理 . 您必须发布到设备才能看到令人敬畏的360视频 .

相关问题