// 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 permissioßns and // limitations under the License. // This script only works in Unity 5.6 or newer since older versions of Unity // don't have IPreprocessBuild and IPostprocessBuild. #if UNITY_5_6_OR_NEWER && UNITY_ANDROID using System; using UnityEditor; using UnityEditor.Build; using UnityEngine; using UnityEditorInternal.VR; class MyCustomBuildProcessor : IPreprocessBuild, IPostprocessBuild { private const string SCENE_NAME_PERMISSIONS_DEMO = "PermissionsDemo"; private const string VR_DEVICE_CARDBOARD = "cardboard"; private const string VR_DEVICE_DAYDREAM = "daydream"; private bool m_cardboardAddedFromCode = false; public int callbackOrder { get { return 0; } } // OnPreprocessBuild() is called rigth before the build process begins. If it // detects that the first enabled scene in the build arrays is the PermissionsDemo, // and Daydream is in the VR SDKs, it will add Cardboard to the VR SDKs. Because // the PermissionsDemo needs a perm statement in the Manifest while other demos don't. // Adding Cardboard to VR SDKs will merge in the Manifest-Cardboard which has perm // statemetn in it. public void OnPreprocessBuild(BuildTarget target, string path) { m_cardboardAddedFromCode = false; string[] androidVrSDKs = VREditor.GetVREnabledDevicesOnTargetGroup(BuildTargetGroup.Android); EditorBuildSettingsScene[] scenes = EditorBuildSettings.scenes; // See if PermissionsDemo is the first enabled scene in the array of scenes to build. for (int i = 0; i < scenes.Length; i++) { if (scenes[i].path.Contains(SCENE_NAME_PERMISSIONS_DEMO)) { if (!scenes[i].enabled) { return; } else { break; } } else { if (scenes[i].enabled) { return; } } } bool hasCardboard = Array.Exists(androidVrSDKs, element => element.Equals(VR_DEVICE_CARDBOARD)); if (hasCardboard) { return; } bool hasDaydream = Array.Exists(androidVrSDKs, element => element.Equals(VR_DEVICE_DAYDREAM)); if (!hasDaydream) { return; } string[] androidVrSDKsAppended = new string[androidVrSDKs.Length+1]; for (int i = 0; i < androidVrSDKs.Length; i++) { androidVrSDKsAppended[i] = androidVrSDKs[i]; } androidVrSDKsAppended[androidVrSDKsAppended.Length - 1] = VR_DEVICE_CARDBOARD; VREditor.SetVREnabledOnTargetGroup( BuildTargetGroup.Android, true); VREditor.SetVREnabledDevicesOnTargetGroup( BuildTargetGroup.Android, androidVrSDKsAppended); m_cardboardAddedFromCode = true; } // OnPostprocessBuild() is called after the build process. It does appropriate cleanup // so that this script only affects build process for PermissionsDemo, not others. public void OnPostprocessBuild(BuildTarget target, string path) { if (!m_cardboardAddedFromCode) return; string[] androidVrSDKs = VREditor.GetVREnabledDevicesOnTargetGroup(BuildTargetGroup.Android); // The enabled devices are modified somehow, which shoudln't happen. Abort the post build process. if (androidVrSDKs.Length == 0 || androidVrSDKs[androidVrSDKs.Length - 1] != VR_DEVICE_CARDBOARD) { return; } string[] androidVrSDKsShortened = new string[androidVrSDKs.Length - 1]; for (int i = 0; i < androidVrSDKsShortened.Length; i++) { androidVrSDKsShortened[i] = androidVrSDKs[i]; } VREditor.SetVREnabledOnTargetGroup( BuildTargetGroup.Android, true); VREditor.SetVREnabledDevicesOnTargetGroup( BuildTargetGroup.Android, androidVrSDKsShortened); m_cardboardAddedFromCode = false; } } #endif // UNITY_5_6_OR_NEWER