diff --git a/Editor/Depra.Template.Editor.asmdef b/Editor/Depra.Template.Editor.asmdef deleted file mode 100644 index ff5f45f..0000000 --- a/Editor/Depra.Template.Editor.asmdef +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "Depra.Template.Editor", - "rootNamespace": "Depra.Template.Editor", - "references": [], - "includePlatforms": [ - "Editor" - ], - "excludePlatforms": [], - "allowUnsafeCode": false, - "overrideReferences": false, - "precompiledReferences": [], - "autoReferenced": true, - "defineConstraints": [], - "versionDefines": [] -} \ No newline at end of file diff --git a/LICENSE.md.meta b/LICENSE.md.meta new file mode 100644 index 0000000..a304510 --- /dev/null +++ b/LICENSE.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: ce223e5447ae69a4e9139329aacef152 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/README.md.meta b/README.md.meta new file mode 100644 index 0000000..1f5d14b --- /dev/null +++ b/README.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 2c45b667f865fdb4890cc1db6f3ea80e +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime.meta b/Runtime.meta new file mode 100644 index 0000000..8580937 --- /dev/null +++ b/Runtime.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f648c07fa322bd546bee4cbeb80d8562 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/Depra.Scenes.asmdef b/Runtime/Depra.Scenes.asmdef new file mode 100644 index 0000000..b89fa92 --- /dev/null +++ b/Runtime/Depra.Scenes.asmdef @@ -0,0 +1,20 @@ +{ + "name": "Depra.Scenes", + "rootNamespace": "Depra.Scenes", + "references": [ + "GUID:36e952f101acb024da7ad1c7de888799", + "GUID:dae2464e94296ca48971481784720efc" + ], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": true, + "precompiledReferences": [ + "Depra.Assets.dll", + "Depra.Loading.dll" + ], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Runtime/Depra.Scenes.asmdef.meta b/Runtime/Depra.Scenes.asmdef.meta new file mode 100644 index 0000000..f02ba46 --- /dev/null +++ b/Runtime/Depra.Scenes.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: f86db9196a48117498e0454a2faf0fc5 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/Depra.Template.asmdef b/Runtime/Depra.Template.asmdef deleted file mode 100644 index 9ee9eae..0000000 --- a/Runtime/Depra.Template.asmdef +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "Depra.Template", - "rootNamespace": "Depra.Template", - "references": [], - "includePlatforms": [], - "excludePlatforms": [], - "allowUnsafeCode": false, - "overrideReferences": false, - "precompiledReferences": [], - "autoReferenced": true, - "defineConstraints": [], - "versionDefines": [] -} \ No newline at end of file diff --git a/Runtime/ISceneChange.cs b/Runtime/ISceneChange.cs new file mode 100644 index 0000000..3f149b8 --- /dev/null +++ b/Runtime/ISceneChange.cs @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: Apache-2.0 +// © 2023-2024 Nikolay Melnikov + +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Depra.Loading.Operations; + +namespace Depra.Scenes +{ + public interface ISceneChange + { + bool IsActive(SceneDefinition scene); + + void Switch(SceneDefinition scene); + + Task Reload(IEnumerable addOperations, CancellationToken token); + + Task SwitchAsync(SceneDefinition scene, IEnumerable addOperations, CancellationToken token); + } +} \ No newline at end of file diff --git a/Runtime/ISceneChange.cs.meta b/Runtime/ISceneChange.cs.meta new file mode 100644 index 0000000..e186c53 --- /dev/null +++ b/Runtime/ISceneChange.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 9dea6989787748c79fcc363f60216316 +timeCreated: 1706294199 \ No newline at end of file diff --git a/Runtime/SceneChange.cs b/Runtime/SceneChange.cs new file mode 100644 index 0000000..8072000 --- /dev/null +++ b/Runtime/SceneChange.cs @@ -0,0 +1,57 @@ +// SPDX-License-Identifier: Apache-2.0 +// © 2023-2024 Nikolay Melnikov + +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Depra.Loading.Curtain; +using Depra.Loading.Operations; +using UnityEngine.SceneManagement; + +namespace Depra.Scenes +{ + public sealed class SceneChange : ISceneChange + { + private readonly ILoadingCurtain _loadingCurtain; + private SceneDefinition _currentScene; + + public SceneChange(SceneDefinition initialScene, ILoadingCurtain loadingCurtain) + { + _currentScene = initialScene; + _loadingCurtain = loadingCurtain; + } + + private async Task SwitchAsyncInternal(SceneDefinition scene, IEnumerable addOperations, + CancellationToken token) + { + var operations = addOperations.Concat(new[] + { new SceneLoadingOperation(scene, OperationDescription.Default(scene.Name)) }); + + await _loadingCurtain.Load(operations, token); + _loadingCurtain.Unload(); + } + + public bool IsActive(SceneDefinition scene) => + scene == _currentScene || scene.Name == SceneManager.GetActiveScene().name; + + void ISceneChange.Switch(SceneDefinition scene) + { + if (IsActive(scene)) + { + throw new UnexpectedSceneSwitch(scene.Name); + } + + _currentScene = scene; + SceneManager.LoadScene(_currentScene.Name, _currentScene.LoadMode); + } + + Task ISceneChange.SwitchAsync(SceneDefinition scene, IEnumerable addOperations, + CancellationToken token) => IsActive(scene) + ? throw new UnexpectedSceneSwitch(scene.Name) + : SwitchAsyncInternal(_currentScene = scene, addOperations, token); + + Task ISceneChange.Reload(IEnumerable addOperations, CancellationToken token) => + SwitchAsyncInternal(_currentScene, addOperations, token); + } +} \ No newline at end of file diff --git a/Runtime/SceneChange.cs.meta b/Runtime/SceneChange.cs.meta new file mode 100644 index 0000000..75ce912 --- /dev/null +++ b/Runtime/SceneChange.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: ddea6c038d9b4572af36082774e104ea +timeCreated: 1706294199 \ No newline at end of file diff --git a/Runtime/SceneDefinition.cs b/Runtime/SceneDefinition.cs new file mode 100644 index 0000000..9468bd3 --- /dev/null +++ b/Runtime/SceneDefinition.cs @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: Apache-2.0 +// © 2023-2024 Nikolay Melnikov + +using System; +using Depra.Inspector.Attributes; +using UnityEngine; +using UnityEngine.SceneManagement; + +namespace Depra.Scenes +{ + [Serializable] + public sealed class SceneDefinition : IEquatable + { + [Scene] [SerializeField] private string _name; + [SerializeField] private LoadSceneMode _loadMode; + + public static bool operator ==(SceneDefinition a, SceneDefinition b) => a?.Equals(b) ?? b is null; + + public static bool operator !=(SceneDefinition a, SceneDefinition b) => !(a == b); + + public string Name => _name; + public LoadSceneMode LoadMode => _loadMode; + + public bool Equals(SceneDefinition other) => other != null && Name == other.Name; + + public override bool Equals(object obj) => obj is SceneDefinition other && Equals(other); + + public override int GetHashCode() => Name.GetHashCode(); + + public override string ToString() => Name; + } +} \ No newline at end of file diff --git a/Runtime/SceneDefinition.cs.meta b/Runtime/SceneDefinition.cs.meta new file mode 100644 index 0000000..d639d5e --- /dev/null +++ b/Runtime/SceneDefinition.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 50d2de51bb1a4a3aab76484f1d9db385 +timeCreated: 1706294199 \ No newline at end of file diff --git a/Runtime/SceneLoadingOperation.cs b/Runtime/SceneLoadingOperation.cs new file mode 100644 index 0000000..e2ae6e2 --- /dev/null +++ b/Runtime/SceneLoadingOperation.cs @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: Apache-2.0 +// © 2023-2024 Nikolay Melnikov + +using System; +using System.Threading; +using System.Threading.Tasks; +using Depra.Loading.Operations; +using UnityEngine.SceneManagement; + +namespace Depra.Scenes +{ + public sealed class SceneLoadingOperation : ILoadingOperation + { + private readonly SceneDefinition _sceneDefinition; + + public SceneLoadingOperation(SceneDefinition sceneDefinition, OperationDescription description) + { + Description = description; + _sceneDefinition = sceneDefinition; + } + + public OperationDescription Description { get; } + + async Task ILoadingOperation.Load(Action onProgress, CancellationToken token) + { + onProgress?.Invoke(0); + var operation = SceneManager.LoadSceneAsync(_sceneDefinition.Name, _sceneDefinition.LoadMode); + operation.allowSceneActivation = true; + + while (operation.isDone == false) + { + onProgress?.Invoke(operation.progress); + await Task.Yield(); + } + + onProgress?.Invoke(1); + } + } +} \ No newline at end of file diff --git a/Runtime/SceneLoadingOperation.cs.meta b/Runtime/SceneLoadingOperation.cs.meta new file mode 100644 index 0000000..5f1be0d --- /dev/null +++ b/Runtime/SceneLoadingOperation.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 12a7bbeae47943c28329654ddace70d6 +timeCreated: 1706294199 \ No newline at end of file diff --git a/Runtime/UnexpectedSceneSwitch.cs b/Runtime/UnexpectedSceneSwitch.cs new file mode 100644 index 0000000..60cd1e5 --- /dev/null +++ b/Runtime/UnexpectedSceneSwitch.cs @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: Apache-2.0 +// © 2023-2024 Nikolay Melnikov + +using System; + +namespace Depra.Scenes +{ + internal sealed class UnexpectedSceneSwitch : Exception + { + public UnexpectedSceneSwitch(string sceneName) : base($"Unexpected switch to same scene '{sceneName}'!") { } + } +} \ No newline at end of file diff --git a/Runtime/UnexpectedSceneSwitch.cs.meta b/Runtime/UnexpectedSceneSwitch.cs.meta new file mode 100644 index 0000000..083ab04 --- /dev/null +++ b/Runtime/UnexpectedSceneSwitch.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 37983bb77f3545ca81c6c8a706e44814 +timeCreated: 1706294199 \ No newline at end of file diff --git a/package.json b/package.json index 98c0e83..d633561 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,15 @@ { - "name": "com.depra.template", + "name": "com.depra.scenes", "version": "0.0.1", - "displayName": "Unity Package Template", - "description": "Template for creating Unity game engine packages.", + "displayName": "Depra.Scenes", + "description": "", "unity": "2022.3", "license": "Apache-2.0", - "dependencies": {}, - "keywords": [], + "keywords": [ + "depra", + "unity", + "scenes" + ], "author": { "name": "Depra, Inc.", "email": "n.melnikov@depra.org", @@ -14,6 +17,6 @@ }, "repository": { "type": "git", - "url": "https://github.com/Depra-Inc/Template.Package.Unity.git" + "url": "https://github.com/Depra-Inc/Scenes.git" } -} +} \ No newline at end of file diff --git a/package.json.meta b/package.json.meta new file mode 100644 index 0000000..25083e1 --- /dev/null +++ b/package.json.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 78fc815fc1884ab5a6da4b375b86f401 +timeCreated: 1706294418 \ No newline at end of file