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

时间:2015-06-02 07:13:58

标签: ios unity3d google-cardboard

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

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

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

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

2 个答案:

答案 0 :(得分:2)

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

我正在成功避免这种情况,并使用Unity资源商店中名为Easy Movie Texture的Unity插件在球体内部成功渲染360度视频。

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

  1. 从Unity资源商店下载Easy Movie Texture插件
  2. 从Assets / EasyMovieTexture / Scene
  3. 打开Demo Sphere演示场景
  4. 为项目创建一个新的(空)预制件,并将Sphere GameObject从Demo Sphere场景拖到预制件上。
  5. 重新打开您的Cardboard场景并将新的videosphere预制件拖到您的层次结构中。
  6. 在Quicktime中打开源360视频
  7. 文件 - >出口 - > 720P
  8. 将文件扩展名从“.mov”更改为“.mp4”
  9. 将新的mp4文件拖到项目的Assets / Streaming Assets目录中。注意:不要通过菜单系统导入,因为这会强制Unity转换为OGG。
  10. 在您的videosphere GameObject的“Media Player Ctrl”脚本组件中,找到“Str_File_Name”字段并提供新导出的视频文件的FULL文件名。确保将扩展名包含在字符串“mymovie.mp4”中。
  11. 很确定这就是一切。希望它可以帮助其他人坚持这个问题。

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

答案 1 :(得分:1)

我终于解决了它。

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

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

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

要解决此问题,我已完成以下操作:

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

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

所以我将CardboardAppController.h的内容粘贴到SVAppController.h中,将CardboardAppController.mm的内容粘贴到SVAppController.mm中( 确保更改代码中的名称替换为SVAppController的CardboardAppController

然后将MMTAppController.mm的内容复制到SVAppController.mm 的正确位置

最后删除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)