diff --git a/Editor/TemporaryBuildScenesUsingInTest.cs b/Editor/TemporaryBuildScenesUsingInTest.cs
new file mode 100644
index 0000000..6154ac6
--- /dev/null
+++ b/Editor/TemporaryBuildScenesUsingInTest.cs
@@ -0,0 +1,97 @@
+// Copyright (c) 2023 Koji Hasegawa.
+// This software is released under the MIT License.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using TestHelper.Attributes;
+using TestHelper.Editor;
+using UnityEditor;
+using UnityEditor.TestTools;
+
+[assembly: TestPlayerBuildModifier(typeof(TemporaryBuildScenesUsingInTest))]
+
+namespace TestHelper.Editor
+{
+ ///
+ /// Temporarily build scenes specified by LoadSceneAttribute when running play mode tests on standalone player.
+ ///
+ public class TemporaryBuildScenesUsingInTest : ITestPlayerBuildModifier
+ {
+ private static IEnumerable FindLoadSceneAttributesOnAssemblies()
+ {
+ var assemblies = AppDomain.CurrentDomain.GetAssemblies();
+ foreach (var attribute in assemblies
+ .Select(assembly => assembly.GetCustomAttributes(typeof(LoadSceneAttribute), false))
+ .SelectMany(attributes => attributes))
+ {
+ yield return attribute as LoadSceneAttribute;
+ }
+ }
+
+ private static IEnumerable FindLoadSceneAttributesOnTypes()
+ {
+ var symbols = TypeCache.GetTypesWithAttribute();
+ foreach (var attribute in symbols
+ .Select(symbol => symbol.GetCustomAttributes(typeof(LoadSceneAttribute), false))
+ .SelectMany(attributes => attributes))
+ {
+ yield return attribute as LoadSceneAttribute;
+ }
+ }
+
+ private static IEnumerable FindLoadSceneAttributesOnMethods()
+ {
+ var symbols = TypeCache.GetMethodsWithAttribute();
+ foreach (var attribute in symbols
+ .Select(symbol => symbol.GetCustomAttributes(typeof(LoadSceneAttribute), false))
+ .SelectMany(attributes => attributes))
+ {
+ yield return attribute as LoadSceneAttribute;
+ }
+ }
+
+ internal static IEnumerable GetScenesUsingInTest()
+ {
+ var attributes = FindLoadSceneAttributesOnAssemblies()
+ .Concat(FindLoadSceneAttributesOnTypes())
+ .Concat(FindLoadSceneAttributesOnMethods());
+ foreach (var attribute in attributes)
+ {
+ if (attribute.ScenePath.ToLower().EndsWith(".unity"))
+ {
+ yield return attribute.ScenePath;
+ }
+ else
+ {
+ foreach (var guid in AssetDatabase.FindAssets("t:SceneAsset", new[] { attribute.ScenePath }))
+ {
+ yield return AssetDatabase.GUIDToAssetPath(guid);
+ }
+ }
+ }
+ }
+
+ ///
+ /// Add temporary scenes to build when running play mode tests on standalone player.
+ ///
+ ///
+ /// Required Unity Test Framework package v1.1.13 or higher is to use this script.
+ /// For details, see the report in forum.
+ ///
+ public BuildPlayerOptions ModifyOptions(BuildPlayerOptions playerOptions)
+ {
+ var scenesInBuild = new List(playerOptions.scenes);
+ foreach (var scenePath in GetScenesUsingInTest())
+ {
+ if (!scenesInBuild.Contains(scenePath))
+ {
+ scenesInBuild.Add(scenePath);
+ }
+ }
+
+ playerOptions.scenes = scenesInBuild.ToArray();
+ return playerOptions;
+ }
+ }
+}
diff --git a/Editor/TemporaryBuildScenesUsingInTest.cs.meta b/Editor/TemporaryBuildScenesUsingInTest.cs.meta
new file mode 100644
index 0000000..64805ca
--- /dev/null
+++ b/Editor/TemporaryBuildScenesUsingInTest.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 5d0fcdd29f381442c83fa2a670d291cf
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/README.md b/README.md
index 7c22982..1e442f8 100644
--- a/README.md
+++ b/README.md
@@ -12,6 +12,7 @@ Required Unity 2019 LTS or later.
## Features
+
### Attributes
#### FocusGameView
@@ -130,6 +131,43 @@ public class MyTestClass
}
```
+#### LoadScene
+
+`LoadSceneAttribute` is an NUnit test attribute class to load scene before running test.
+
+It has the following benefits:
+
+- Can be used when running play mode tests in-editor and on-player
+- Can be specified scenes that are not in "Scenes in Build"
+
+This attribute can attached to test method only.
+
+Usage:
+
+```csharp
+using System;
+using NUnit.Framework;
+using TestHelper.Attributes;
+
+[TestFixture]
+public class MyTestClass
+{
+ [Test]
+ [LoadScene("Assets/MyTests/Scenes/Scene.unity")]
+ public void MyTestMethod()
+ {
+ var cube = GameObject.Find("Cube");
+ Assert.That(cube, Is.Not.Null);
+ }
+}
+```
+
+> **Note**
+> - Load scene run after OneTimeSetUp and before SetUp
+> - Scene file path is starts with `Assets/` or `Packages/`.
+> And package name using `name` instead of `displayName`, when scenes in the package.
+> (e.g., `Packages/com.nowsprinting.test-helper/Tests/Scenes/Scene.unity`)
+
### Constraints
diff --git a/Runtime/AssemblyInfo.cs b/Runtime/AssemblyInfo.cs
index c360b65..0a5509f 100644
--- a/Runtime/AssemblyInfo.cs
+++ b/Runtime/AssemblyInfo.cs
@@ -3,4 +3,5 @@
using System.Runtime.CompilerServices;
+[assembly: InternalsVisibleTo("TestHelper.Editor")]
[assembly: InternalsVisibleTo("TestHelper.Tests")]
diff --git a/Runtime/Attributes/LoadSceneAttribute.cs b/Runtime/Attributes/LoadSceneAttribute.cs
new file mode 100644
index 0000000..1b072b5
--- /dev/null
+++ b/Runtime/Attributes/LoadSceneAttribute.cs
@@ -0,0 +1,78 @@
+// Copyright (c) 2023 Koji Hasegawa.
+// This software is released under the MIT License.
+
+using System;
+using System.Collections;
+using NUnit.Framework;
+using NUnit.Framework.Interfaces;
+using UnityEngine;
+using UnityEngine.SceneManagement;
+using UnityEngine.TestTools;
+#if UNITY_EDITOR
+using UnityEditor;
+using UnityEditor.SceneManagement;
+#endif
+
+// ReSharper disable InvalidXmlDocComment
+
+namespace TestHelper.Attributes
+{
+ ///
+ /// Load scene before running test.
+ ///
+ /// It has the following benefits:
+ /// - Can be used when running play mode tests in-editor and on-player
+ /// - Can be specified scenes that are not in "Scenes in Build"
+ ///
+ /// Notes:
+ /// - Load scene run after OneTimeSetUp and before SetUp
+ /// - For the process of including a Scene not in "Scenes in Build" to a build for player, see:
+ ///
+ [AttributeUsage(AttributeTargets.Method)]
+ public class LoadSceneAttribute : NUnitAttribute, IOuterUnityTestAction
+ {
+ internal string ScenePath { get; private set; }
+
+ ///
+ /// Load scene before running test.
+ ///
+ /// Scene file path.
+ /// The path starts with `Assets/` or `Packages/`.
+ /// And package name using `name` instead of `displayName`, when scenes in the package.
+ /// (e.g., `Packages/com.nowsprinting.test-helper/Tests/Scenes/Scene.unity`)
+ ///
+ public LoadSceneAttribute(string path)
+ {
+ ScenePath = path;
+ }
+
+ ///
+ public IEnumerator BeforeTest(ITest test)
+ {
+ AsyncOperation loadSceneAsync = null;
+#if UNITY_EDITOR
+ if (EditorApplication.isPlaying)
+ {
+ // Use EditorSceneManager at run on Unity-editor
+ loadSceneAsync = EditorSceneManager.LoadSceneAsyncInPlayMode(
+ ScenePath,
+ new LoadSceneParameters(LoadSceneMode.Single));
+ }
+ else
+ {
+ EditorSceneManager.OpenScene(ScenePath);
+ }
+#else
+ // Use ITestPlayerBuildModifier to change the "Scenes in Build" list before run on player
+ loadSceneAsync = SceneManager.LoadSceneAsync(ScenePath);
+#endif
+ yield return loadSceneAsync;
+ }
+
+ ///
+ public IEnumerator AfterTest(ITest test)
+ {
+ yield return null;
+ }
+ }
+}
diff --git a/Runtime/Attributes/LoadSceneAttribute.cs.meta b/Runtime/Attributes/LoadSceneAttribute.cs.meta
new file mode 100644
index 0000000..a1cf587
--- /dev/null
+++ b/Runtime/Attributes/LoadSceneAttribute.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 3b18c8ded0304f06b2093dd31fe7803c
+timeCreated: 1697385945
\ No newline at end of file
diff --git a/Tests/Editor/AssemblyInfo.cs b/Tests/Editor/AssemblyInfo.cs
deleted file mode 100644
index f4fca75..0000000
--- a/Tests/Editor/AssemblyInfo.cs
+++ /dev/null
@@ -1,6 +0,0 @@
-// Copyright (c) 2023 Koji Hasegawa.
-// This software is released under the MIT License.
-
-using System.Runtime.CompilerServices;
-
-[assembly: InternalsVisibleTo("TestHelper.Editor.Tests")]
diff --git a/Tests/Editor/AssemblyInfo.cs.meta b/Tests/Editor/AssemblyInfo.cs.meta
deleted file mode 100644
index 4499430..0000000
--- a/Tests/Editor/AssemblyInfo.cs.meta
+++ /dev/null
@@ -1,3 +0,0 @@
-fileFormatVersion: 2
-guid: ab67a46afa2642ac8e0bfd22a1380d82
-timeCreated: 1684577391
\ No newline at end of file
diff --git a/Tests/Editor/LoadSceneAttributeTest.cs b/Tests/Editor/LoadSceneAttributeTest.cs
new file mode 100644
index 0000000..bc4fe07
--- /dev/null
+++ b/Tests/Editor/LoadSceneAttributeTest.cs
@@ -0,0 +1,24 @@
+// Copyright (c) 2023 Koji Hasegawa.
+// This software is released under the MIT License.
+
+using NUnit.Framework;
+using TestHelper.Attributes;
+using UnityEngine;
+
+namespace TestHelper.Editor
+{
+ [TestFixture]
+ public class LoadSceneAttributeTest
+ {
+ private const string TestScene = "Packages/com.nowsprinting.test-helper/Tests/Scenes/NotInScenesInBuild.unity";
+ private const string ObjectName = "CubeInNotInScenesInBuild";
+
+ [Test]
+ [LoadScene(TestScene)]
+ public void Attach_AlreadyLoadedSceneNotInBuild()
+ {
+ var cube = GameObject.Find(ObjectName);
+ Assert.That(cube, Is.Not.Null);
+ }
+ }
+}
diff --git a/Tests/Editor/LoadSceneAttributeTest.cs.meta b/Tests/Editor/LoadSceneAttributeTest.cs.meta
new file mode 100644
index 0000000..69d2792
--- /dev/null
+++ b/Tests/Editor/LoadSceneAttributeTest.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 331d640b2fcd4350bbc72a2a001024fc
+timeCreated: 1697956834
\ No newline at end of file
diff --git a/Tests/Editor/TemporaryBuildScenesUsingInTestTest.cs b/Tests/Editor/TemporaryBuildScenesUsingInTestTest.cs
new file mode 100644
index 0000000..d7715f1
--- /dev/null
+++ b/Tests/Editor/TemporaryBuildScenesUsingInTestTest.cs
@@ -0,0 +1,19 @@
+// Copyright (c) 2023 Koji Hasegawa.
+// This software is released under the MIT License.
+
+using NUnit.Framework;
+
+namespace TestHelper.Editor
+{
+ [TestFixture]
+ public class TemporaryBuildScenesUsingInTestTest
+ {
+ [Test]
+ public void GetScenesUsingInTest_AttachedToMethod_ReturnScenesSpecifiedByAttribute()
+ {
+ var actual = TemporaryBuildScenesUsingInTest.GetScenesUsingInTest();
+ Assert.That(actual,
+ Does.Contain("Packages/com.nowsprinting.test-helper/Tests/Scenes/NotInScenesInBuild.unity"));
+ }
+ }
+}
diff --git a/Tests/Editor/TemporaryBuildScenesUsingInTestTest.cs.meta b/Tests/Editor/TemporaryBuildScenesUsingInTestTest.cs.meta
new file mode 100644
index 0000000..d8c5705
--- /dev/null
+++ b/Tests/Editor/TemporaryBuildScenesUsingInTestTest.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 9d26c9d734ad40f6b808f998d41e14e3
+timeCreated: 1697469808
\ No newline at end of file
diff --git a/Tests/Runtime/Attributes/LoadSceneAttributeTest.cs b/Tests/Runtime/Attributes/LoadSceneAttributeTest.cs
new file mode 100644
index 0000000..dd865bc
--- /dev/null
+++ b/Tests/Runtime/Attributes/LoadSceneAttributeTest.cs
@@ -0,0 +1,50 @@
+// Copyright (c) 2023 Koji Hasegawa.
+// This software is released under the MIT License.
+
+using System.Collections;
+using System.Threading.Tasks;
+using NUnit.Framework;
+using UnityEngine;
+using UnityEngine.TestTools;
+
+namespace TestHelper.Attributes
+{
+ [TestFixture]
+ public class LoadSceneAttributeTest
+ {
+ private const string TestScene = "Packages/com.nowsprinting.test-helper/Tests/Scenes/NotInScenesInBuild.unity";
+ private const string ObjectName = "CubeInNotInScenesInBuild";
+
+ [Test]
+ [LoadScene(TestScene)]
+ public void Attach_AlreadyLoadedSceneNotInBuild()
+ {
+ var cube = GameObject.Find(ObjectName);
+ Assert.That(cube, Is.Not.Null);
+
+ Object.Destroy(cube); // For not giving false negatives in subsequent tests.
+ }
+
+ [Test]
+ [LoadScene(TestScene)]
+ public async Task AttachToAsyncTest_AlreadyLoadedSceneNotInBuild()
+ {
+ var cube = GameObject.Find(ObjectName);
+ Assert.That(cube, Is.Not.Null);
+
+ Object.Destroy(cube); // For not giving false negatives in subsequent tests.
+ await Task.Yield();
+ }
+
+ [UnityTest]
+ [LoadScene(TestScene)]
+ public IEnumerator AttachToUnityTest_AlreadyLoadedSceneNotInBuild()
+ {
+ var cube = GameObject.Find(ObjectName);
+ Assert.That(cube, Is.Not.Null);
+
+ Object.Destroy(cube); // For not giving false negatives in subsequent tests.
+ yield return null;
+ }
+ }
+}
diff --git a/Tests/Runtime/Attributes/LoadSceneAttributeTest.cs.meta b/Tests/Runtime/Attributes/LoadSceneAttributeTest.cs.meta
new file mode 100644
index 0000000..350878e
--- /dev/null
+++ b/Tests/Runtime/Attributes/LoadSceneAttributeTest.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 8a037c539b07452eb4d65554fedf7664
+timeCreated: 1697385966
\ No newline at end of file
diff --git a/Tests/Scenes.meta b/Tests/Scenes.meta
new file mode 100644
index 0000000..70c4a9a
--- /dev/null
+++ b/Tests/Scenes.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 7bcf4f77838e24762800c51c522453e8
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Tests/Scenes/NotInScenesInBuild.unity b/Tests/Scenes/NotInScenesInBuild.unity
new file mode 100644
index 0000000..c839fce
--- /dev/null
+++ b/Tests/Scenes/NotInScenesInBuild.unity
@@ -0,0 +1,480 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!29 &1
+OcclusionCullingSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 2
+ m_OcclusionBakeSettings:
+ smallestOccluder: 5
+ smallestHole: 0.25
+ backfaceThreshold: 100
+ m_SceneGUID: 00000000000000000000000000000000
+ m_OcclusionCullingData: {fileID: 0}
+--- !u!104 &2
+RenderSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 9
+ m_Fog: 0
+ m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
+ m_FogMode: 3
+ m_FogDensity: 0.01
+ m_LinearFogStart: 0
+ m_LinearFogEnd: 300
+ m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1}
+ m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1}
+ m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1}
+ m_AmbientIntensity: 1
+ m_AmbientMode: 0
+ m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
+ m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0}
+ m_HaloStrength: 0.5
+ m_FlareStrength: 1
+ m_FlareFadeSpeed: 3
+ m_HaloTexture: {fileID: 0}
+ m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0}
+ m_DefaultReflectionMode: 0
+ m_DefaultReflectionResolution: 128
+ m_ReflectionBounces: 1
+ m_ReflectionIntensity: 1
+ m_CustomReflection: {fileID: 0}
+ m_Sun: {fileID: 0}
+ m_IndirectSpecularColor: {r: 0.44657838, g: 0.49641228, b: 0.57481676, a: 1}
+ m_UseRadianceAmbientProbe: 0
+--- !u!157 &3
+LightmapSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 12
+ m_GIWorkflowMode: 1
+ m_GISettings:
+ serializedVersion: 2
+ m_BounceScale: 1
+ m_IndirectOutputScale: 1
+ m_AlbedoBoost: 1
+ m_EnvironmentLightingMode: 0
+ m_EnableBakedLightmaps: 1
+ m_EnableRealtimeLightmaps: 0
+ m_LightmapEditorSettings:
+ serializedVersion: 12
+ m_Resolution: 2
+ m_BakeResolution: 40
+ m_AtlasSize: 1024
+ m_AO: 0
+ m_AOMaxDistance: 1
+ m_CompAOExponent: 1
+ m_CompAOExponentDirect: 0
+ m_ExtractAmbientOcclusion: 0
+ m_Padding: 2
+ m_LightmapParameters: {fileID: 0}
+ m_LightmapsBakeMode: 1
+ m_TextureCompression: 1
+ m_FinalGather: 0
+ m_FinalGatherFiltering: 1
+ m_FinalGatherRayCount: 256
+ m_ReflectionCompression: 2
+ m_MixedBakeMode: 2
+ m_BakeBackend: 1
+ m_PVRSampling: 1
+ m_PVRDirectSampleCount: 32
+ m_PVRSampleCount: 512
+ m_PVRBounces: 2
+ m_PVREnvironmentSampleCount: 256
+ m_PVREnvironmentReferencePointCount: 2048
+ m_PVRFilteringMode: 1
+ m_PVRDenoiserTypeDirect: 1
+ m_PVRDenoiserTypeIndirect: 1
+ m_PVRDenoiserTypeAO: 1
+ m_PVRFilterTypeDirect: 0
+ m_PVRFilterTypeIndirect: 0
+ m_PVRFilterTypeAO: 0
+ m_PVREnvironmentMIS: 1
+ m_PVRCulling: 1
+ m_PVRFilteringGaussRadiusDirect: 1
+ m_PVRFilteringGaussRadiusIndirect: 5
+ m_PVRFilteringGaussRadiusAO: 2
+ m_PVRFilteringAtrousPositionSigmaDirect: 0.5
+ m_PVRFilteringAtrousPositionSigmaIndirect: 2
+ m_PVRFilteringAtrousPositionSigmaAO: 1
+ m_ExportTrainingData: 0
+ m_TrainingDataDestination: TrainingData
+ m_LightProbeSampleCountMultiplier: 4
+ m_LightingDataAsset: {fileID: 0}
+ m_LightingSettings: {fileID: 629626379}
+--- !u!196 &4
+NavMeshSettings:
+ serializedVersion: 2
+ m_ObjectHideFlags: 0
+ m_BuildSettings:
+ serializedVersion: 3
+ agentTypeID: 0
+ agentRadius: 0.5
+ agentHeight: 2
+ agentSlope: 45
+ agentClimb: 0.4
+ ledgeDropHeight: 0
+ maxJumpAcrossDistance: 0
+ minRegionArea: 2
+ manualCellSize: 0
+ cellSize: 0.16666667
+ manualTileSize: 0
+ tileSize: 256
+ buildHeightMesh: 0
+ maxJobWorkers: 0
+ preserveTilesOutsideBounds: 0
+ debug:
+ m_Flags: 0
+ m_NavMeshData: {fileID: 0}
+--- !u!850595691 &629626379
+LightingSettings:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name:
+ serializedVersion: 6
+ m_GIWorkflowMode: 1
+ m_EnableBakedLightmaps: 1
+ m_EnableRealtimeLightmaps: 0
+ m_RealtimeEnvironmentLighting: 1
+ m_BounceScale: 1
+ m_AlbedoBoost: 1
+ m_IndirectOutputScale: 1
+ m_UsingShadowmask: 1
+ m_BakeBackend: 1
+ m_LightmapMaxSize: 1024
+ m_BakeResolution: 40
+ m_Padding: 2
+ m_LightmapCompression: 3
+ m_AO: 0
+ m_AOMaxDistance: 1
+ m_CompAOExponent: 1
+ m_CompAOExponentDirect: 0
+ m_ExtractAO: 0
+ m_MixedBakeMode: 2
+ m_LightmapsBakeMode: 1
+ m_FilterMode: 1
+ m_LightmapParameters: {fileID: 15204, guid: 0000000000000000f000000000000000, type: 0}
+ m_ExportTrainingData: 0
+ m_TrainingDataDestination: TrainingData
+ m_RealtimeResolution: 2
+ m_ForceWhiteAlbedo: 0
+ m_ForceUpdates: 0
+ m_FinalGather: 0
+ m_FinalGatherRayCount: 256
+ m_FinalGatherFiltering: 1
+ m_PVRCulling: 1
+ m_PVRSampling: 1
+ m_PVRDirectSampleCount: 32
+ m_PVRSampleCount: 512
+ m_PVREnvironmentSampleCount: 256
+ m_PVREnvironmentReferencePointCount: 2048
+ m_LightProbeSampleCountMultiplier: 4
+ m_PVRBounces: 2
+ m_PVRMinBounces: 2
+ m_PVREnvironmentImportanceSampling: 1
+ m_PVRFilteringMode: 1
+ m_PVRDenoiserTypeDirect: 1
+ m_PVRDenoiserTypeIndirect: 1
+ m_PVRDenoiserTypeAO: 1
+ m_PVRFilterTypeDirect: 0
+ m_PVRFilterTypeIndirect: 0
+ m_PVRFilterTypeAO: 0
+ m_PVRFilteringGaussRadiusDirect: 1
+ m_PVRFilteringGaussRadiusIndirect: 5
+ m_PVRFilteringGaussRadiusAO: 2
+ m_PVRFilteringAtrousPositionSigmaDirect: 0.5
+ m_PVRFilteringAtrousPositionSigmaIndirect: 2
+ m_PVRFilteringAtrousPositionSigmaAO: 1
+ m_PVRTiledBaking: 0
+ m_NumRaysToShootPerTexel: -1
+ m_RespectSceneVisibilityWhenBakingGI: 0
+--- !u!1 &662139854
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 662139857}
+ - component: {fileID: 662139856}
+ - component: {fileID: 662139855}
+ m_Layer: 0
+ m_Name: Main Camera
+ m_TagString: MainCamera
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!81 &662139855
+AudioListener:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 662139854}
+ m_Enabled: 1
+--- !u!20 &662139856
+Camera:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 662139854}
+ m_Enabled: 1
+ serializedVersion: 2
+ m_ClearFlags: 1
+ m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0}
+ m_projectionMatrixMode: 1
+ m_GateFitMode: 2
+ m_FOVAxisMode: 0
+ m_Iso: 200
+ m_ShutterSpeed: 0.005
+ m_Aperture: 16
+ m_FocusDistance: 10
+ m_FocalLength: 50
+ m_BladeCount: 5
+ m_Curvature: {x: 2, y: 11}
+ m_BarrelClipping: 0.25
+ m_Anamorphism: 0
+ m_SensorSize: {x: 36, y: 24}
+ m_LensShift: {x: 0, y: 0}
+ m_NormalizedViewPortRect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 1
+ height: 1
+ near clip plane: 0.3
+ far clip plane: 1000
+ field of view: 60
+ orthographic: 0
+ orthographic size: 5
+ m_Depth: -1
+ m_CullingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+ m_RenderingPath: -1
+ m_TargetTexture: {fileID: 0}
+ m_TargetDisplay: 0
+ m_TargetEye: 3
+ m_HDR: 1
+ m_AllowMSAA: 1
+ m_AllowDynamicResolution: 0
+ m_ForceIntoRT: 0
+ m_OcclusionCulling: 1
+ m_StereoConvergence: 10
+ m_StereoSeparation: 0.022
+--- !u!4 &662139857
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 662139854}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 1, z: -10}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &981211536
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 981211540}
+ - component: {fileID: 981211539}
+ - component: {fileID: 981211538}
+ - component: {fileID: 981211537}
+ m_Layer: 0
+ m_Name: CubeInNotInScenesInBuild
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!65 &981211537
+BoxCollider:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 981211536}
+ m_Material: {fileID: 0}
+ m_IncludeLayers:
+ serializedVersion: 2
+ m_Bits: 0
+ m_ExcludeLayers:
+ serializedVersion: 2
+ m_Bits: 0
+ m_LayerOverridePriority: 0
+ m_IsTrigger: 0
+ m_ProvidesContacts: 0
+ m_Enabled: 1
+ serializedVersion: 3
+ m_Size: {x: 1, y: 1, z: 1}
+ m_Center: {x: 0, y: 0, z: 0}
+--- !u!23 &981211538
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 981211536}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_StaticShadowCaster: 0
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RayTracingMode: 2
+ m_RayTraceProcedural: 0
+ m_RenderingLayerMask: 1
+ m_RendererPriority: 0
+ m_Materials:
+ - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_ReceiveGI: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 3
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+ m_AdditionalVertexStreams: {fileID: 0}
+--- !u!33 &981211539
+MeshFilter:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 981211536}
+ m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!4 &981211540
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 981211536}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_RootOrder: 2
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &1407779068
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1407779070}
+ - component: {fileID: 1407779069}
+ m_Layer: 0
+ m_Name: Directional Light
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!108 &1407779069
+Light:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1407779068}
+ m_Enabled: 1
+ serializedVersion: 10
+ m_Type: 1
+ m_Shape: 0
+ m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1}
+ m_Intensity: 1
+ m_Range: 10
+ m_SpotAngle: 30
+ m_InnerSpotAngle: 21.80208
+ m_CookieSize: 10
+ m_Shadows:
+ m_Type: 2
+ m_Resolution: -1
+ m_CustomResolution: -1
+ m_Strength: 1
+ m_Bias: 0.05
+ m_NormalBias: 0.4
+ m_NearPlane: 0.2
+ m_CullingMatrixOverride:
+ e00: 1
+ e01: 0
+ e02: 0
+ e03: 0
+ e10: 0
+ e11: 1
+ e12: 0
+ e13: 0
+ e20: 0
+ e21: 0
+ e22: 1
+ e23: 0
+ e30: 0
+ e31: 0
+ e32: 0
+ e33: 1
+ m_UseCullingMatrixOverride: 0
+ m_Cookie: {fileID: 0}
+ m_DrawHalo: 0
+ m_Flare: {fileID: 0}
+ m_RenderMode: 0
+ m_CullingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+ m_RenderingLayerMask: 1
+ m_Lightmapping: 4
+ m_LightShadowCasterMode: 0
+ m_AreaSize: {x: 1, y: 1}
+ m_BounceIntensity: 1
+ m_ColorTemperature: 6570
+ m_UseColorTemperature: 0
+ m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0}
+ m_UseBoundingSphereOverride: 0
+ m_UseViewFrustumForShadowCasterCull: 1
+ m_ShadowRadius: 0
+ m_ShadowAngle: 0
+--- !u!4 &1407779070
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1407779068}
+ m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261}
+ m_LocalPosition: {x: 0, y: 3, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_RootOrder: 1
+ m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0}
diff --git a/Tests/Scenes/NotInScenesInBuild.unity.meta b/Tests/Scenes/NotInScenesInBuild.unity.meta
new file mode 100644
index 0000000..1a50e55
--- /dev/null
+++ b/Tests/Scenes/NotInScenesInBuild.unity.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: a3a216e95babd455980e92a0fc911909
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant: