FittsLaw/Assets/GoogleVR/Editor/GvrBuildProcessor.cs
2018-10-08 23:54:11 -04:00

131 lines
4.5 KiB
C#

// Copyright 2017 Google Inc. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Only invoke custom build processor when building for Android or iOS.
#if UNITY_ANDROID || UNITY_IOS
using UnityEngine;
using UnityEditor;
using UnityEditor.Build;
using System.Linq;
#if UNITY_IOS
using UnityEditor.iOS.Xcode;
using System.IO;
#endif
#if UNITY_2017_2_OR_NEWER
using UnityEngine.XR;
#else
using XRSettings = UnityEngine.VR.VRSettings;
#endif // UNITY_2017_2_OR_NEWER
#if UNITY_2018_1_OR_NEWER
using UnityEditor.Build.Reporting;
#endif
// Notifies users if they build for Android or iOS without Cardboard or Daydream enabled.
#if UNITY_2018_1_OR_NEWER
class GvrBuildProcessor : IPreprocessBuildWithReport, IPostprocessBuildWithReport {
#else
class GvrBuildProcessor : IPreprocessBuild, IPostprocessBuild {
#endif
private const string VR_SETTINGS_NOT_ENABLED_ERROR_MESSAGE_FORMAT =
"To use the Google VR SDK on {0}, 'Player Settings > Virtual Reality Supported' setting must be checked.\n" +
"Please fix this setting and rebuild your app.";
private const string IOS_MISSING_GVR_SDK_ERROR_MESSAGE =
"To use the Google VR SDK on iOS, 'Player Settings > Virtual Reality SDKs' must include 'Cardboard'.\n" +
"Please fix this setting and rebuild your app.";
private const string ANDROID_MISSING_GVR_SDK_ERROR_MESSAGE =
"To use the Google VR SDK on Android, 'Player Settings > Virtual Reality SDKs' must include 'Daydream' or 'Cardboard'.\n" +
"Please fix this setting and rebuild your app.";
public int callbackOrder {
get { return 0; }
}
#if UNITY_2018_1_OR_NEWER
public void OnPreprocessBuild(BuildReport report)
{
OnPreprocessBuild(report.summary.platform, report.summary.outputPath);
}
#endif
public void OnPreprocessBuild (BuildTarget target, string path)
{
if (target != BuildTarget.Android && target != BuildTarget.iOS) {
// Do nothing when not building for Android or iOS.
return;
}
// 'Player Settings > Virtual Reality Supported' must be enabled.
if (!IsVRSupportEnabled()) {
Debug.LogErrorFormat(VR_SETTINGS_NOT_ENABLED_ERROR_MESSAGE_FORMAT, target);
}
if (target == BuildTarget.Android) {
// When building for Android at least one VR SDK must be included.
// For Google VR valid VR SDKs are 'Daydream' and/or 'Cardboard'.
if (!IsSDKOtherThanNoneIncluded()) {
Debug.LogError(ANDROID_MISSING_GVR_SDK_ERROR_MESSAGE);
}
}
if (target == BuildTarget.iOS) {
// When building for iOS at least one VR SDK must be included.
// For Google VR only 'Cardboard' is supported.
if (!IsSDKOtherThanNoneIncluded()) {
Debug.LogError(IOS_MISSING_GVR_SDK_ERROR_MESSAGE);
}
}
}
#if UNITY_2018_1_OR_NEWER
public void OnPostprocessBuild(BuildReport report) {
OnPostprocessBuild(report.summary.platform, report.summary.outputPath);
}
#endif
public void OnPostprocessBuild(BuildTarget target, string outputPath) {
#if UNITY_IOS
// Add Camera usage description for scanning viewer QR codes on iOS.
if (target == BuildTarget.iOS) {
// Read plist
var plistPath = Path.Combine(outputPath, "Info.plist");
var plist = new PlistDocument();
plist.ReadFromFile(plistPath);
// Update value
PlistElementDict rootDict = plist.root;
rootDict.SetString("NSCameraUsageDescription", "Scan Cardboard viewer QR code");
// Write plist
File.WriteAllText(plistPath, plist.WriteToString());
}
#endif
}
// 'Player Settings > Virtual Reality Supported' enabled?
private bool IsVRSupportEnabled() {
return PlayerSettings.virtualRealitySupported;
}
// 'Player Settings > Virtual Reality SDKs' includes any VR SDK other than 'None'?
private bool IsSDKOtherThanNoneIncluded() {
bool containsNone = XRSettings.supportedDevices.Contains(GvrSettings.VR_SDK_NONE);
int numSdks = XRSettings.supportedDevices.Length;
return containsNone ? numSdks > 1 : numSdks > 0;
}
}
#endif // UNITY_ANDROID || UNITY_IOS