using System.IO; using UnityEngine; using UnityEngine.UI; using UnityEngine.TestTools; using NUnit.Framework; using System.Collections; using UnityEditor; public class NestedCanvas : IPrebuildSetup { Object m_GO1; Object m_GO2; const string kPrefabPath = "Assets/Resources/NestedCanvasPrefab.prefab"; public void Setup() { #if UNITY_EDITOR var rootGO = new GameObject("RootGO"); var rootCanvasGO = new GameObject("Canvas", typeof(Canvas), typeof(CanvasGroup)); rootCanvasGO.transform.SetParent(rootGO.transform); var nestedCanvas = new GameObject("Nested Canvas", typeof(Canvas), typeof(Image)); nestedCanvas.transform.SetParent(rootCanvasGO.transform); var nestedCanvasCamera = new GameObject("Nested Canvas Camera", typeof(Camera)); nestedCanvasCamera.transform.SetParent(rootCanvasGO.transform); var rootCanvas = rootCanvasGO.GetComponent(); rootCanvas.renderMode = RenderMode.WorldSpace; rootCanvas.worldCamera = nestedCanvasCamera.GetComponent(); if (!Directory.Exists("Assets/Resources/")) Directory.CreateDirectory("Assets/Resources/"); UnityEditor.PrefabUtility.SaveAsPrefabAsset(rootGO, kPrefabPath); GameObject.DestroyImmediate(rootGO); #endif } [UnityTest] [Description("[UI] Button does not interact after nested canvas is used(case 892913)")] public IEnumerator WorldCanvas_CanFindCameraAfterDisablingAndEnablingRootCanvas() { m_GO1 = Object.Instantiate(Resources.Load("NestedCanvasPrefab")); yield return null; var nestedCanvasGo = GameObject.Find("Nested Canvas"); var nestedCanvas = nestedCanvasGo.GetComponent(); Assert.IsNotNull(nestedCanvas.worldCamera, "Expected the nested canvas worldCamera to NOT be null after loading the scene."); nestedCanvasGo.transform.parent.gameObject.SetActive(false); nestedCanvasGo.transform.parent.gameObject.SetActive(true); Assert.IsNotNull(nestedCanvas.worldCamera, "Expected the nested canvas worldCamera to NOT be null after the parent canvas has been re-enabled."); } [UnityTest] public IEnumerator WorldCanvas_CanFindTheSameCameraAfterDisablingAndEnablingRootCanvas() { m_GO2 = Object.Instantiate(Resources.Load("NestedCanvasPrefab")); yield return null; var nestedCanvasGo = GameObject.Find("Nested Canvas"); var nestedCanvas = nestedCanvasGo.GetComponent(); var worldCamera = nestedCanvas.worldCamera; nestedCanvasGo.transform.parent.gameObject.SetActive(false); nestedCanvasGo.transform.parent.gameObject.SetActive(true); Assert.AreEqual(worldCamera, nestedCanvas.worldCamera, "Expected the same world camera to be returned after the root canvas was disabled and then re-enabled."); } [UnityTest] public IEnumerator NestedCanvasHasProperInheritedAlpha() { GameObject root = (GameObject)Object.Instantiate(Resources.Load("NestedCanvasPrefab")); CanvasGroup group = root.GetComponentInChildren(); Image image = root.GetComponentInChildren(); group.alpha = 0.5f; yield return null; Assert.True(image.canvasRenderer.GetInheritedAlpha() == 0.5f); GameObject.DestroyImmediate(root); } [TearDown] public void TearDown() { GameObject.DestroyImmediate(m_GO1); GameObject.DestroyImmediate(m_GO2); } [OneTimeTearDown] public void OneTimeTearDown() { #if UNITY_EDITOR AssetDatabase.DeleteAsset(kPrefabPath); #endif } }