Google iOS 使用 Unity 5 的 Cardboard 视频纹理
Google Cardboard video texture on iOS with Unity 5
我正在尝试使用 Google Cardboard SDK 制作球形 360 视频。
我已经用 MovieTexture
进行了一些测试,以获得运行良好的桌面版本,但是 iOS 中没有实现此 class。
我在资产商店看到了一些外部插件,但其中 none 似乎与 Unity 5.
兼容
Cardboard SDK 是否提供了 class 来实现此目的,如果没有,您是否知道可以实现此目的的其他解决方案或插件?
终于解决了
我们必须删除 CardboardAppController 和 MMTAppController 并将它们合并为一个。
基本上在 Assets/Plugin/ios 中有 2 个 AppControllers:"CardboardAppController.mm"(也有一个 CardboardAppController.h header)和 "MMTAppController.mm"
诀窍是 ios 生成后只有 "see" 一个应用程序控制器。由于 CardboardAppController 排在第一位,因此 MMTAppController 被丢弃。
为了解决这个问题,我做了以下工作:
创建新的 AppController:在我的例子中,它被命名为 SVAppController.mm 和 SVAppController.h
然后我们必须将两个应用程序控制器合并到那个应用程序控制器中并删除它们。
所以我将CardboardAppController.h的内容复制粘贴到SVAppController.h中,将CardboardAppController.mm的内容复制粘贴到SVAppController.mm中(使请务必更改代码中的名称,将 CardboardAppController 替换为 SVAppController)
然后将MMTAppController.mm的内容复制到SVAppController.mm正确的地方
最后删除 CardboardAppController 和 MMTAppController。
您将剩下 1 个应用程序控制器并且一切正常。
供参考
这是我的最终 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)
Unity 中的电影通常渲染为对象上的纹理。在移动设备上,问题变成了设备只想在视频播放器中显示视频,因此不支持 Unity class MovieTexture。
我成功地规避了这个问题,并使用 Unity Asset Store 中名为 Easy Movie Texture 的 Unity 插件成功地在球体内部渲染了 360 度视频。
为了 Mac,我做了以下工作:
- 从 Unity Asset Store 下载 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" 字段并提供新导出的视频文件的完整文件名。确保将扩展名作为字符串的一部分包含在内,"mymovie.mp4".
很确定这就是一切。希望它能帮助其他人解决这个问题。
最后请注意,视频只会在设备上呈现。在编辑器中,您只会在球体上看到白色纹理。您必须发布到设备才能看到精彩的 360 度全景视频。
我正在尝试使用 Google Cardboard SDK 制作球形 360 视频。
我已经用 MovieTexture
进行了一些测试,以获得运行良好的桌面版本,但是 iOS 中没有实现此 class。
我在资产商店看到了一些外部插件,但其中 none 似乎与 Unity 5.
兼容Cardboard SDK 是否提供了 class 来实现此目的,如果没有,您是否知道可以实现此目的的其他解决方案或插件?
终于解决了
我们必须删除 CardboardAppController 和 MMTAppController 并将它们合并为一个。
基本上在 Assets/Plugin/ios 中有 2 个 AppControllers:"CardboardAppController.mm"(也有一个 CardboardAppController.h header)和 "MMTAppController.mm"
诀窍是 ios 生成后只有 "see" 一个应用程序控制器。由于 CardboardAppController 排在第一位,因此 MMTAppController 被丢弃。
为了解决这个问题,我做了以下工作:
创建新的 AppController:在我的例子中,它被命名为 SVAppController.mm 和 SVAppController.h
然后我们必须将两个应用程序控制器合并到那个应用程序控制器中并删除它们。
所以我将CardboardAppController.h的内容复制粘贴到SVAppController.h中,将CardboardAppController.mm的内容复制粘贴到SVAppController.mm中(使请务必更改代码中的名称,将 CardboardAppController 替换为 SVAppController)
然后将MMTAppController.mm的内容复制到SVAppController.mm正确的地方
最后删除 CardboardAppController 和 MMTAppController。
您将剩下 1 个应用程序控制器并且一切正常。
供参考 这是我的最终 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)
Unity 中的电影通常渲染为对象上的纹理。在移动设备上,问题变成了设备只想在视频播放器中显示视频,因此不支持 Unity class MovieTexture。
我成功地规避了这个问题,并使用 Unity Asset Store 中名为 Easy Movie Texture 的 Unity 插件成功地在球体内部渲染了 360 度视频。
为了 Mac,我做了以下工作:
- 从 Unity Asset Store 下载 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" 字段并提供新导出的视频文件的完整文件名。确保将扩展名作为字符串的一部分包含在内,"mymovie.mp4".
很确定这就是一切。希望它能帮助其他人解决这个问题。
最后请注意,视频只会在设备上呈现。在编辑器中,您只会在球体上看到白色纹理。您必须发布到设备才能看到精彩的 360 度全景视频。