From 6ed099807871bd353dc0e9dccc19ec5727c0dfc7 Mon Sep 17 00:00:00 2001 From: MpakobecEx Date: Wed, 21 Oct 2026 17:49:41 +0500 Subject: [PATCH] Move client to 3D scenes with SceneFlow --- IMPLEMENTATION_CHECKLIST.md | 5 +- README.md | 2 +- client/Assets/Vanguard/Editor.meta | 8 + client/Assets/Vanguard/Editor/SceneBuilder.cs | 83 +++++ .../Vanguard/Editor/SceneBuilder.cs.meta | 2 + client/Assets/Vanguard/Editor/SceneSmoke.cs | 62 +++ .../Assets/Vanguard/Editor/SceneSmoke.cs.meta | 2 + .../Vanguard.Editor.asmdef} | 15 +- .../Vanguard.Editor.asmdef.meta} | 2 +- .../Runtime/App/BattleSceneController.cs | 35 ++ .../Runtime/App/BattleSceneController.cs.meta | 2 + .../Runtime/App/CollectionSceneController.cs | 23 ++ .../App/CollectionSceneController.cs.meta | 2 + .../Runtime/App/DeckBuilderSceneController.cs | 25 ++ .../App/DeckBuilderSceneController.cs.meta | 2 + .../Runtime/App/LobbySceneController.cs | 98 +++++ .../Runtime/App/LobbySceneController.cs.meta | 2 + .../Runtime/App/LoginSceneController.cs | 48 +++ .../Runtime/App/LoginSceneController.cs.meta | 2 + .../Runtime/App/SceneControllerBase.cs | 31 ++ .../Runtime/App/SceneControllerBase.cs.meta | 2 + .../Vanguard/Runtime/App/SceneEnvironment.cs | 251 +++++++++++++ .../Runtime/App/SceneEnvironment.cs.meta | 2 + .../Assets/Vanguard/Runtime/App/SceneFlow.cs | 84 +++++ .../Vanguard/Runtime/App/SceneFlow.cs.meta | 2 + .../Vanguard/Runtime/App/VanguardApp.cs | 47 +-- .../Assets/Vanguard/Runtime/UI/AppRootView.cs | 148 -------- .../Vanguard/Runtime/UI/AppRootView.cs.meta | 2 - client/Assets/Vanguard/Runtime/UI/UiKit.cs | 4 +- client/Assets/Vanguard/Scenes.meta | 8 + client/Assets/Vanguard/Scenes/Battle.unity | 352 ++++++++++++++++++ .../Assets/Vanguard/Scenes/Battle.unity.meta | 7 + .../Assets/Vanguard/Scenes/Collection.unity | 352 ++++++++++++++++++ .../Vanguard/Scenes/Collection.unity.meta | 7 + .../Assets/Vanguard/Scenes/DeckBuilder.unity | 352 ++++++++++++++++++ .../Vanguard/Scenes/DeckBuilder.unity.meta | 7 + client/Assets/Vanguard/Scenes/Lobby.unity | 352 ++++++++++++++++++ .../Assets/Vanguard/Scenes/Lobby.unity.meta | 7 + client/Assets/Vanguard/Scenes/Login.unity | 352 ++++++++++++++++++ .../Assets/Vanguard/Scenes/Login.unity.meta | 7 + .../Vanguard/Tests/Editor/ClientSmokeTests.cs | 41 +- .../PlayMode/AppBootstrapPlayModeTests.cs | 68 ---- .../AppBootstrapPlayModeTests.cs.meta | 2 - .../ProjectSettings/EditorBuildSettings.asset | 15 + client/README.md | 20 +- docs/HANDOFF.md | 21 +- docs/client-visual-direction.md | 30 +- 47 files changed, 2686 insertions(+), 307 deletions(-) create mode 100644 client/Assets/Vanguard/Editor.meta create mode 100644 client/Assets/Vanguard/Editor/SceneBuilder.cs create mode 100644 client/Assets/Vanguard/Editor/SceneBuilder.cs.meta create mode 100644 client/Assets/Vanguard/Editor/SceneSmoke.cs create mode 100644 client/Assets/Vanguard/Editor/SceneSmoke.cs.meta rename client/Assets/Vanguard/{Tests/PlayMode/Vanguard.Tests.PlayMode.asmdef => Editor/Vanguard.Editor.asmdef} (50%) rename client/Assets/Vanguard/{Tests/PlayMode/Vanguard.Tests.PlayMode.asmdef.meta => Editor/Vanguard.Editor.asmdef.meta} (76%) create mode 100644 client/Assets/Vanguard/Runtime/App/BattleSceneController.cs create mode 100644 client/Assets/Vanguard/Runtime/App/BattleSceneController.cs.meta create mode 100644 client/Assets/Vanguard/Runtime/App/CollectionSceneController.cs create mode 100644 client/Assets/Vanguard/Runtime/App/CollectionSceneController.cs.meta create mode 100644 client/Assets/Vanguard/Runtime/App/DeckBuilderSceneController.cs create mode 100644 client/Assets/Vanguard/Runtime/App/DeckBuilderSceneController.cs.meta create mode 100644 client/Assets/Vanguard/Runtime/App/LobbySceneController.cs create mode 100644 client/Assets/Vanguard/Runtime/App/LobbySceneController.cs.meta create mode 100644 client/Assets/Vanguard/Runtime/App/LoginSceneController.cs create mode 100644 client/Assets/Vanguard/Runtime/App/LoginSceneController.cs.meta create mode 100644 client/Assets/Vanguard/Runtime/App/SceneControllerBase.cs create mode 100644 client/Assets/Vanguard/Runtime/App/SceneControllerBase.cs.meta create mode 100644 client/Assets/Vanguard/Runtime/App/SceneEnvironment.cs create mode 100644 client/Assets/Vanguard/Runtime/App/SceneEnvironment.cs.meta create mode 100644 client/Assets/Vanguard/Runtime/App/SceneFlow.cs create mode 100644 client/Assets/Vanguard/Runtime/App/SceneFlow.cs.meta delete mode 100644 client/Assets/Vanguard/Runtime/UI/AppRootView.cs delete mode 100644 client/Assets/Vanguard/Runtime/UI/AppRootView.cs.meta create mode 100644 client/Assets/Vanguard/Scenes.meta create mode 100644 client/Assets/Vanguard/Scenes/Battle.unity create mode 100644 client/Assets/Vanguard/Scenes/Battle.unity.meta create mode 100644 client/Assets/Vanguard/Scenes/Collection.unity create mode 100644 client/Assets/Vanguard/Scenes/Collection.unity.meta create mode 100644 client/Assets/Vanguard/Scenes/DeckBuilder.unity create mode 100644 client/Assets/Vanguard/Scenes/DeckBuilder.unity.meta create mode 100644 client/Assets/Vanguard/Scenes/Lobby.unity create mode 100644 client/Assets/Vanguard/Scenes/Lobby.unity.meta create mode 100644 client/Assets/Vanguard/Scenes/Login.unity create mode 100644 client/Assets/Vanguard/Scenes/Login.unity.meta delete mode 100644 client/Assets/Vanguard/Tests/PlayMode/AppBootstrapPlayModeTests.cs delete mode 100644 client/Assets/Vanguard/Tests/PlayMode/AppBootstrapPlayModeTests.cs.meta diff --git a/IMPLEMENTATION_CHECKLIST.md b/IMPLEMENTATION_CHECKLIST.md index 8a4972c..2f17f17 100644 --- a/IMPLEMENTATION_CHECKLIST.md +++ b/IMPLEMENTATION_CHECKLIST.md @@ -234,8 +234,9 @@ - [x] Unity 6 LTS, URP, Addressables, Input System, Localization. DOTween — следующим шагом (пока UI без внешних твинов). -- [ ] 3D-сцены `Login`, `Lobby`, `Collection`, `DeckBuilder`, `Battle` - и `SceneFlow`; `Boot` уже есть как служебный bootstrap. +- [x] 3D-сцены `Login`, `Lobby`, `Collection`, `DeckBuilder`, `Battle` + и `SceneFlow`; `Boot` — стартовая служебная сцена. 3D-окружение пока + из примитивов, UI — code-generated uGUI. - [x] Composition root + DI (VContainer), без синглтон-свалок. - [x] `ApiClient` (HTTP/JSON), `PlayerState`, таймауты и разбор `ApiError`. - [x] `GameConnection` (WebSocket + MessagePack), snapshot/events, diff --git a/README.md b/README.md index 089d7d6..812a5fa 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ | CI (Forgejo Actions) | готово: `ci.yml` проходит на `home-runner` | | EF-миграции | готово (`InitialCreate`) | | Orleans | готово: silo + `MatchActorGrain`, включается `Orleans:Enabled` | -| Клиент | Unity 6.6: 3D-сцены Login/Lobby/Collection/DeckBuilder/Battle; сейчас gray-box на одном Canvas | +| Клиент | Unity 6.6: 3D-сцены Login/Lobby/Collection/DeckBuilder/Battle + SceneFlow; UI gray-box | | Лаунчер | не начато | ## Требования diff --git a/client/Assets/Vanguard/Editor.meta b/client/Assets/Vanguard/Editor.meta new file mode 100644 index 0000000..2323856 --- /dev/null +++ b/client/Assets/Vanguard/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7fb54fe32f66fc44fac44b13550d9cc9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/client/Assets/Vanguard/Editor/SceneBuilder.cs b/client/Assets/Vanguard/Editor/SceneBuilder.cs new file mode 100644 index 0000000..325e9a8 --- /dev/null +++ b/client/Assets/Vanguard/Editor/SceneBuilder.cs @@ -0,0 +1,83 @@ +using System.Collections.Generic; +using System.IO; +using UnityEditor; +using UnityEditor.SceneManagement; +using UnityEngine; +using UnityEngine.SceneManagement; +using Vanguard.App; + +namespace Vanguard.Editor +{ + /// + /// Создаёт сцены-экраны и прописывает их в Build Settings. + /// Запуск: меню Vanguard → Rebuild Client Scenes или + /// Unity -batchmode -quit -executeMethod Vanguard.Editor.SceneBuilder.BuildAll. + /// + public static class SceneBuilder + { + private const string SceneDir = "Assets/Vanguard/Scenes"; + private const string BootPath = "Assets/Scenes/Boot.unity"; + + [MenuItem("Vanguard/Rebuild Client Scenes")] + public static void BuildAll() + { + if (!Directory.Exists(SceneDir)) + { + Directory.CreateDirectory(SceneDir); + AssetDatabase.Refresh(); + } + + Create("Login"); + Create("Lobby"); + Create("Collection"); + Create("DeckBuilder"); + Create("Battle"); + + var scenes = new List(); + Add(scenes, BootPath); + Add(scenes, SceneDir + "/Login.unity"); + Add(scenes, SceneDir + "/Lobby.unity"); + Add(scenes, SceneDir + "/Collection.unity"); + Add(scenes, SceneDir + "/DeckBuilder.unity"); + Add(scenes, SceneDir + "/Battle.unity"); + + EditorBuildSettings.scenes = scenes.ToArray(); + AssetDatabase.SaveAssets(); + AssetDatabase.Refresh(); + + Debug.Log("Vanguard scenes rebuilt: " + scenes.Count); + } + + private static void Create(string sceneName) where T : MonoBehaviour + { + var scene = EditorSceneManager.NewScene(NewSceneSetup.EmptyScene, NewSceneMode.Single); + + var root = new GameObject(sceneName + " Scene"); + root.AddComponent(); + + var cameraGo = new GameObject("Main Camera"); + cameraGo.tag = "MainCamera"; + var camera = cameraGo.AddComponent(); + camera.clearFlags = CameraClearFlags.SolidColor; + camera.backgroundColor = new Color(0.02f, 0.03f, 0.055f); + camera.transform.position = new Vector3(0f, 3.2f, -10f); + camera.transform.rotation = Quaternion.Euler(12f, 0f, 0f); + + var lightGo = new GameObject("Directional Light"); + var light = lightGo.AddComponent(); + light.type = LightType.Directional; + light.color = new Color(0.82f, 0.88f, 1f); + light.intensity = 0.9f; + light.shadows = LightShadows.Soft; + light.transform.rotation = Quaternion.Euler(48f, -32f, 0f); + + EditorSceneManager.SaveScene(scene, SceneDir + "/" + sceneName + ".unity"); + } + + private static void Add(ICollection scenes, string path) + { + if (File.Exists(path)) + scenes.Add(new EditorBuildSettingsScene(path, true)); + } + } +} diff --git a/client/Assets/Vanguard/Editor/SceneBuilder.cs.meta b/client/Assets/Vanguard/Editor/SceneBuilder.cs.meta new file mode 100644 index 0000000..47904d3 --- /dev/null +++ b/client/Assets/Vanguard/Editor/SceneBuilder.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: c24d38169d69d16429c902bae594a19d \ No newline at end of file diff --git a/client/Assets/Vanguard/Editor/SceneSmoke.cs b/client/Assets/Vanguard/Editor/SceneSmoke.cs new file mode 100644 index 0000000..1077088 --- /dev/null +++ b/client/Assets/Vanguard/Editor/SceneSmoke.cs @@ -0,0 +1,62 @@ +using System; +using UnityEditor; +using UnityEditor.SceneManagement; +using UnityEngine; +using UnityEngine.SceneManagement; +using Vanguard.App; + +namespace Vanguard.Editor +{ + /// + /// Быстрый smoke-запуск сцен из командной строки: + /// Unity -batchmode -nographics -executeMethod Vanguard.Editor.SceneSmoke.Run. + /// Открывает Boot, входит в Play Mode, ждёт загрузку Login/Lobby и выходит. + /// + public static class SceneSmoke + { + private static double _started; + private static int _checks; + + [MenuItem("Vanguard/Play Scene Smoke")] + public static void Run() + { + EditorSceneManager.OpenScene("Assets/Scenes/Boot.unity"); + _started = EditorApplication.timeSinceStartup; + _checks = 0; + EditorApplication.update += Tick; + EditorApplication.EnterPlaymode(); + } + + private static void Tick() + { + if (!EditorApplication.isPlaying) + return; + + _checks++; + if (EditorApplication.timeSinceStartup - _started < 6.0) + return; + + EditorApplication.update -= Tick; + + var active = SceneManager.GetActiveScene().name; + var environment = GameObject.Find("Vanguard 3D Environment"); + var login = GameObject.Find("LoginScreen"); + var lobby = GameObject.Find("MetaScreen"); + var onboarding = GameObject.Find("OnboardingScreen"); + var success = environment != null + && (active == SceneFlow.Login || active == SceneFlow.Lobby) + && (login != null || lobby != null || onboarding != null); + + Debug.Log( + "SCENE_SMOKE success=" + success + + " active=" + active + + " env=" + (environment != null) + + " login=" + (login != null) + + " lobby=" + (lobby != null) + + " onboarding=" + (onboarding != null) + + " error=" + VanguardApp.LastInitializationError); + + EditorApplication.Exit(success ? 0 : 1); + } + } +} diff --git a/client/Assets/Vanguard/Editor/SceneSmoke.cs.meta b/client/Assets/Vanguard/Editor/SceneSmoke.cs.meta new file mode 100644 index 0000000..3f9d53c --- /dev/null +++ b/client/Assets/Vanguard/Editor/SceneSmoke.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: dfcd15474d289f848b7fa616f9b1d4e2 \ No newline at end of file diff --git a/client/Assets/Vanguard/Tests/PlayMode/Vanguard.Tests.PlayMode.asmdef b/client/Assets/Vanguard/Editor/Vanguard.Editor.asmdef similarity index 50% rename from client/Assets/Vanguard/Tests/PlayMode/Vanguard.Tests.PlayMode.asmdef rename to client/Assets/Vanguard/Editor/Vanguard.Editor.asmdef index db84e10..103dcca 100644 --- a/client/Assets/Vanguard/Tests/PlayMode/Vanguard.Tests.PlayMode.asmdef +++ b/client/Assets/Vanguard/Editor/Vanguard.Editor.asmdef @@ -1,19 +1,18 @@ { - "name": "Vanguard.Tests.PlayMode", - "rootNamespace": "Vanguard.Tests", + "name": "Vanguard.Editor", + "rootNamespace": "Vanguard.Editor", "references": [ "Vanguard.Runtime" ], - "includePlatforms": [], + "includePlatforms": [ + "Editor" + ], "excludePlatforms": [], "allowUnsafeCode": false, "overrideReferences": false, "precompiledReferences": [], - "autoReferenced": false, + "autoReferenced": true, "defineConstraints": [], "versionDefines": [], - "noEngineReferences": false, - "optionalUnityReferences": [ - "TestAssemblies" - ] + "noEngineReferences": false } diff --git a/client/Assets/Vanguard/Tests/PlayMode/Vanguard.Tests.PlayMode.asmdef.meta b/client/Assets/Vanguard/Editor/Vanguard.Editor.asmdef.meta similarity index 76% rename from client/Assets/Vanguard/Tests/PlayMode/Vanguard.Tests.PlayMode.asmdef.meta rename to client/Assets/Vanguard/Editor/Vanguard.Editor.asmdef.meta index 4d19767..b84ade5 100644 --- a/client/Assets/Vanguard/Tests/PlayMode/Vanguard.Tests.PlayMode.asmdef.meta +++ b/client/Assets/Vanguard/Editor/Vanguard.Editor.asmdef.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 199ad6dea713aef4cb50a4d8d01c9ca4 +guid: f65969750402d974c8bc90b95a61ae96 AssemblyDefinitionImporter: externalObjects: {} userData: diff --git a/client/Assets/Vanguard/Runtime/App/BattleSceneController.cs b/client/Assets/Vanguard/Runtime/App/BattleSceneController.cs new file mode 100644 index 0000000..d8402c0 --- /dev/null +++ b/client/Assets/Vanguard/Runtime/App/BattleSceneController.cs @@ -0,0 +1,35 @@ +using UnityEngine; +using Vanguard.Meta; +using Vanguard.UI; + +namespace Vanguard.App +{ + public sealed class BattleSceneController : SceneControllerBase + { + private BattleView _view; + + private void Start() + { + SceneEnvironment.Build(SceneTheme.Battle); + + var info = Flow.ConsumePendingMatch(); + if (info == null) + { + _ = Flow.LoadLobbyAsync(); + return; + } + + var canvas = CreateCanvas("Battle Canvas"); + _view = new BattleView( + canvas.transform, + Resolve(), + () => _ = Flow.LoadLobbyAsync()); + _view.Show(info); + } + + private void Update() + { + _view?.Tick(); + } + } +} diff --git a/client/Assets/Vanguard/Runtime/App/BattleSceneController.cs.meta b/client/Assets/Vanguard/Runtime/App/BattleSceneController.cs.meta new file mode 100644 index 0000000..1651fe8 --- /dev/null +++ b/client/Assets/Vanguard/Runtime/App/BattleSceneController.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 9a62d9e570dfb024d96981ddfffdf2ad \ No newline at end of file diff --git a/client/Assets/Vanguard/Runtime/App/CollectionSceneController.cs b/client/Assets/Vanguard/Runtime/App/CollectionSceneController.cs new file mode 100644 index 0000000..0472bf6 --- /dev/null +++ b/client/Assets/Vanguard/Runtime/App/CollectionSceneController.cs @@ -0,0 +1,23 @@ +using UnityEngine; +using Vanguard.Meta; +using Vanguard.State; +using Vanguard.UI; + +namespace Vanguard.App +{ + public sealed class CollectionSceneController : SceneControllerBase + { + private CollectionView _view; + + private void Start() + { + SceneEnvironment.Build(SceneTheme.Collection); + var canvas = CreateCanvas("Collection Canvas"); + _view = new CollectionView( + canvas.transform, + Resolve(), + Resolve(), + () => _ = Flow.LoadLobbyAsync()); + } + } +} diff --git a/client/Assets/Vanguard/Runtime/App/CollectionSceneController.cs.meta b/client/Assets/Vanguard/Runtime/App/CollectionSceneController.cs.meta new file mode 100644 index 0000000..40f31ba --- /dev/null +++ b/client/Assets/Vanguard/Runtime/App/CollectionSceneController.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 8ccb09cec5c89814493fae05cf2d6051 \ No newline at end of file diff --git a/client/Assets/Vanguard/Runtime/App/DeckBuilderSceneController.cs b/client/Assets/Vanguard/Runtime/App/DeckBuilderSceneController.cs new file mode 100644 index 0000000..321df07 --- /dev/null +++ b/client/Assets/Vanguard/Runtime/App/DeckBuilderSceneController.cs @@ -0,0 +1,25 @@ +using UnityEngine; +using Vanguard.Api.Contracts; +using Vanguard.Meta; +using Vanguard.State; +using Vanguard.UI; + +namespace Vanguard.App +{ + public sealed class DeckBuilderSceneController : SceneControllerBase + { + private DecksView _view; + + private void Start() + { + SceneEnvironment.Build(SceneTheme.DeckBuilder); + var canvas = CreateCanvas("DeckBuilder Canvas"); + _view = new DecksView( + canvas.transform, + Resolve(), + Resolve(), + () => _ = Flow.LoadLobbyAsync(), + deck => _ = Flow.OpenLobbyWithQueueAsync(deck)); + } + } +} diff --git a/client/Assets/Vanguard/Runtime/App/DeckBuilderSceneController.cs.meta b/client/Assets/Vanguard/Runtime/App/DeckBuilderSceneController.cs.meta new file mode 100644 index 0000000..dce0b78 --- /dev/null +++ b/client/Assets/Vanguard/Runtime/App/DeckBuilderSceneController.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: c87789aeb7d84cc438babc89db55d1fc \ No newline at end of file diff --git a/client/Assets/Vanguard/Runtime/App/LobbySceneController.cs b/client/Assets/Vanguard/Runtime/App/LobbySceneController.cs new file mode 100644 index 0000000..e4f94a7 --- /dev/null +++ b/client/Assets/Vanguard/Runtime/App/LobbySceneController.cs @@ -0,0 +1,98 @@ +using UnityEngine; +using Vanguard.Api.Contracts; +using Vanguard.Auth; +using Vanguard.Battle; +using Vanguard.Meta; +using Vanguard.State; +using Vanguard.UI; + +namespace Vanguard.App +{ + public sealed class LobbySceneController : SceneControllerBase + { + private AuthService _auth; + private MetaService _meta; + private PlayerState _player; + private MetaView _metaView; + private OnboardingView _onboarding; + private QueueView _queue; + + private void Start() + { + SceneEnvironment.Build(SceneTheme.Lobby); + + _auth = Resolve(); + _meta = Resolve(); + _player = Resolve(); + var canvas = CreateCanvas("Lobby Canvas"); + + _metaView = new MetaView( + canvas.transform, + _auth, + _player, + OnLogout, + () => _ = Flow.LoadCollectionAsync(), + () => _ = Flow.LoadDeckBuilderAsync(), + () => _ = Flow.LoadDeckBuilderAsync(), + ShowOnboarding); + _onboarding = new OnboardingView( + canvas.transform, _auth, _meta, OnOnboarded, OnLogout); + _queue = new QueueView( + canvas.transform, _meta, _auth, OnQueueBack, OnMatched); + + ShowDefault(); + } + + private void ShowDefault() + { + var pendingDeck = Flow.ConsumePendingQueueDeck(); + if (pendingDeck != null) + { + HideAll(); + _queue.Show(pendingDeck); + return; + } + + HideAll(); + if (_player.OnboardingCompleted) + _metaView.Show(); + else + _onboarding.Show(); + } + + private void ShowOnboarding() + { + HideAll(); + _onboarding.Show(); + } + + private void OnOnboarded() + { + HideAll(); + _metaView.Show(); + } + + private void OnQueueBack() + { + _queue.Hide(); + _metaView.Show(); + } + + private void OnMatched(MatchConnectionInfo info) + { + _ = Flow.LoadBattleAsync(info); + } + + private void OnLogout() + { + _ = Flow.LoadLoginAsync(); + } + + private void HideAll() + { + _metaView.Hide(); + _onboarding.Hide(); + _queue.Hide(); + } + } +} diff --git a/client/Assets/Vanguard/Runtime/App/LobbySceneController.cs.meta b/client/Assets/Vanguard/Runtime/App/LobbySceneController.cs.meta new file mode 100644 index 0000000..bf7ccda --- /dev/null +++ b/client/Assets/Vanguard/Runtime/App/LobbySceneController.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: a1fe2c339c891e849a96ecc6a5c22748 \ No newline at end of file diff --git a/client/Assets/Vanguard/Runtime/App/LoginSceneController.cs b/client/Assets/Vanguard/Runtime/App/LoginSceneController.cs new file mode 100644 index 0000000..d5d4d19 --- /dev/null +++ b/client/Assets/Vanguard/Runtime/App/LoginSceneController.cs @@ -0,0 +1,48 @@ +using System.Threading.Tasks; +using UnityEngine; +using Vanguard.Auth; +using Vanguard.UI; + +namespace Vanguard.App +{ + public sealed class LoginSceneController : SceneControllerBase + { + private AuthService _auth; + private LoginView _view; + + private void Start() + { + SceneEnvironment.Build(SceneTheme.Login); + _auth = Resolve(); + var config = Resolve(); + + var canvas = CreateCanvas("Login Canvas"); + _view = new LoginView(canvas.transform, config, _auth, OnAuthenticated); + _view.Show("Проверяем сессию…"); + _ = RestoreAsync(); + } + + private async Task RestoreAsync() + { + try + { + if (await _auth.TryRestoreAsync()) + { + await Flow.LoadLobbyAsync(); + return; + } + } + catch (System.Exception exception) + { + Debug.LogException(exception); + } + + _view.Show("Введите данные игрока."); + } + + private void OnAuthenticated() + { + _ = Flow.LoadLobbyAsync(); + } + } +} diff --git a/client/Assets/Vanguard/Runtime/App/LoginSceneController.cs.meta b/client/Assets/Vanguard/Runtime/App/LoginSceneController.cs.meta new file mode 100644 index 0000000..9c0b910 --- /dev/null +++ b/client/Assets/Vanguard/Runtime/App/LoginSceneController.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: dc0007ae5cfaa2647a674301f0042159 \ No newline at end of file diff --git a/client/Assets/Vanguard/Runtime/App/SceneControllerBase.cs b/client/Assets/Vanguard/Runtime/App/SceneControllerBase.cs new file mode 100644 index 0000000..cc55c92 --- /dev/null +++ b/client/Assets/Vanguard/Runtime/App/SceneControllerBase.cs @@ -0,0 +1,31 @@ +using UnityEngine; +using VContainer; +using Vanguard.UI; + +namespace Vanguard.App +{ + /// База контроллера сцены: доступ к персистентным сервисам и Canvas. + public abstract class SceneControllerBase : MonoBehaviour + { + protected VanguardApp App { get; private set; } + protected IObjectResolver Container => App.Container; + protected SceneFlow Flow => App.Flow; + + protected virtual void Awake() + { + App = VanguardApp.Instance; + if (App == null) + { + Debug.LogError("VanguardApp не создан. Запусти игру из Boot или через Play в любой сцене клиента."); + enabled = false; + } + } + + protected Canvas CreateCanvas(string name) + { + return UiKit.CreateCanvas(name, persistent: false); + } + + protected T Resolve() where T : class => Container.Resolve(); + } +} diff --git a/client/Assets/Vanguard/Runtime/App/SceneControllerBase.cs.meta b/client/Assets/Vanguard/Runtime/App/SceneControllerBase.cs.meta new file mode 100644 index 0000000..bec8752 --- /dev/null +++ b/client/Assets/Vanguard/Runtime/App/SceneControllerBase.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 861c568d3c51e8a4e9997279e60fee32 \ No newline at end of file diff --git a/client/Assets/Vanguard/Runtime/App/SceneEnvironment.cs b/client/Assets/Vanguard/Runtime/App/SceneEnvironment.cs new file mode 100644 index 0000000..df3fcbd --- /dev/null +++ b/client/Assets/Vanguard/Runtime/App/SceneEnvironment.cs @@ -0,0 +1,251 @@ +using UnityEngine; + +namespace Vanguard.App +{ + public enum SceneTheme + { + Login, + Lobby, + Collection, + DeckBuilder, + Battle, + } + + /// + /// Простой 3D-фон для экранов: камера, свет, пол и тематические + /// примитивы. Это заготовка под будущие модели и арт; UI остаётся + /// отдельным Canvas-слоем. + /// + public static class SceneEnvironment + { + private const string RootName = "Vanguard 3D Environment"; + + public static void Build(SceneTheme theme) + { + if (GameObject.Find(RootName) != null) + return; + + var root = new GameObject(RootName); + var palette = GetPalette(theme); + + SetCamera(theme, palette); + SetLight(theme, palette); + RenderSettings.ambientLight = palette.Ambient; + RenderSettings.fog = true; + RenderSettings.fogMode = FogMode.Exponential; + RenderSettings.fogColor = palette.Background; + RenderSettings.fogDensity = 0.012f; + + CreateFloor(root.transform, palette); + Decorate(theme, root.transform, palette); + } + + private static void SetCamera(SceneTheme theme, ScenePalette palette) + { + var camera = Camera.main; + if (camera == null) + { + var go = new GameObject("Main Camera"); + go.tag = "MainCamera"; + camera = go.AddComponent(); + } + + camera.clearFlags = CameraClearFlags.SolidColor; + camera.backgroundColor = palette.Background; + camera.fieldOfView = 52f; + camera.transform.position = theme == SceneTheme.Battle + ? new Vector3(0f, 7.5f, -13f) + : new Vector3(0f, 3.2f, -10f); + camera.transform.rotation = theme == SceneTheme.Battle + ? Quaternion.Euler(28f, 0f, 0f) + : Quaternion.Euler(12f, 0f, 0f); + } + + private static void SetLight(SceneTheme theme, ScenePalette palette) + { + var light = Object.FindAnyObjectByType(); + if (light == null) + { + var go = new GameObject("Directional Light"); + light = go.AddComponent(); + light.type = LightType.Directional; + } + + light.color = palette.Light; + light.intensity = theme == SceneTheme.Battle ? 1.15f : 0.9f; + light.transform.rotation = Quaternion.Euler(48f, -32f, 0f); + light.shadows = LightShadows.Soft; + } + + private static void CreateFloor(Transform root, ScenePalette palette) + { + var floor = GameObject.CreatePrimitive(PrimitiveType.Plane); + floor.name = "Floor"; + floor.transform.SetParent(root, false); + floor.transform.localScale = new Vector3(4f, 1f, 4f); + floor.transform.position = new Vector3(0f, -0.02f, 2f); + Paint(floor, palette.Floor, 0f); + } + + private static void Decorate(SceneTheme theme, Transform root, ScenePalette palette) + { + switch (theme) + { + case SceneTheme.Login: + Cube(root, "Column L", new Vector3(-5.5f, 2.4f, 2f), new Vector3(1f, 5f, 1f), palette.Structure); + Cube(root, "Column R", new Vector3(5.5f, 2.4f, 2f), new Vector3(1f, 5f, 1f), palette.Structure); + Cube(root, "Backdrop", new Vector3(0f, 3.2f, 8f), new Vector3(16f, 7f, 0.4f), palette.Structure); + Cube(root, "Emblem", new Vector3(0f, 3.4f, 7.7f), new Vector3(2.4f, 2.4f, 0.2f), palette.Accent, 1.6f); + break; + + case SceneTheme.Lobby: + for (var i = -1; i <= 1; i += 2) + { + Cube(root, "Pillar " + i, new Vector3(i * 7f, 2.5f, 3f), new Vector3(1.2f, 5f, 1.2f), palette.Structure); + Cube(root, "Table " + i, new Vector3(i * 3.6f, 0.55f, 0.5f), new Vector3(3f, 1f, 3f), palette.Structure); + } + Cube(root, "Back Wall", new Vector3(0f, 3f, 9f), new Vector3(18f, 6f, 0.5f), palette.Structure); + Cube(root, "Lobby Light", new Vector3(0f, 5.2f, 4f), new Vector3(6f, 0.2f, 1f), palette.Accent, 1.8f); + break; + + case SceneTheme.Collection: + for (var i = -2; i <= 2; i++) + { + Cube(root, "Shelf " + i, new Vector3(i * 3.2f, 1.6f, 6.5f), new Vector3(2.2f, 3.2f, 0.5f), palette.Structure); + Cube(root, "Shelf Glow " + i, new Vector3(i * 3.2f, 3.35f, 6.2f), new Vector3(2.2f, 0.1f, 0.5f), palette.Accent, 1.2f); + } + Cube(root, "Table", new Vector3(0f, 0.4f, 1.5f), new Vector3(7f, 0.8f, 4f), palette.Structure); + break; + + case SceneTheme.DeckBuilder: + Cube(root, "Table", new Vector3(0f, 0.5f, 2f), new Vector3(11f, 1f, 6f), palette.Structure); + Cube(root, "Deck Stack", new Vector3(-3.8f, 1.3f, 3.2f), new Vector3(1.5f, 1.4f, 2.2f), palette.Accent, 0.8f); + Cube(root, "Mat", new Vector3(1.5f, 1.06f, 3f), new Vector3(5f, 0.08f, 3.5f), palette.Floor); + break; + + case SceneTheme.Battle: + Cube(root, "Battle Table", new Vector3(0f, 0.2f, 1.5f), new Vector3(13f, 0.4f, 7f), palette.Structure); + Cube(root, "Center Line", new Vector3(0f, 0.44f, 1.5f), new Vector3(13f, 0.04f, 0.12f), palette.Accent, 1.2f); + for (var i = 0; i < 5; i++) + { + var x = (i - 2) * 2.2f; + Cube(root, "Zone " + i, new Vector3(x, 0.44f, 3.1f), new Vector3(1.8f, 0.04f, 2.2f), palette.Zone, 0.5f); + Cube(root, "Enemy Zone " + i, new Vector3(x, 0.44f, -0.1f), new Vector3(1.8f, 0.04f, 2.2f), palette.EnemyZone, 0.5f); + } + break; + } + } + + private static void Cube( + Transform parent, + string name, + Vector3 position, + Vector3 scale, + Color color, + float emission = 0f) + { + var cube = GameObject.CreatePrimitive(PrimitiveType.Cube); + cube.name = name; + cube.transform.SetParent(parent, false); + cube.transform.position = position; + cube.transform.localScale = scale; + Paint(cube, color, emission); + } + + private static void Paint(GameObject target, Color color, float emission) + { + var renderer = target.GetComponent(); + if (renderer == null) + return; + + var shader = Shader.Find("Universal Render Pipeline/Lit"); + if (shader == null) + shader = Shader.Find("Standard"); + + var material = new Material(shader); + if (material.HasProperty("_BaseColor")) + material.SetColor("_BaseColor", color); + else if (material.HasProperty("_Color")) + material.color = color; + + if (emission > 0f) + { + material.EnableKeyword("_EMISSION"); + material.SetColor("_EmissionColor", color * emission); + } + + renderer.material = material; + } + + private static ScenePalette GetPalette(SceneTheme theme) + { + switch (theme) + { + case SceneTheme.Login: + return new ScenePalette( + new Color(0.015f, 0.02f, 0.045f), + new Color(0.035f, 0.045f, 0.075f), + new Color(0.10f, 0.12f, 0.18f), + new Color(0.20f, 0.42f, 0.95f), + new Color(0.75f, 0.82f, 1f), + new Color(0.04f, 0.05f, 0.09f), + new Color(0.10f, 0.20f, 0.40f), + new Color(0.40f, 0.12f, 0.10f)); + + case SceneTheme.Battle: + return new ScenePalette( + new Color(0.035f, 0.025f, 0.03f), + new Color(0.08f, 0.06f, 0.07f), + new Color(0.18f, 0.12f, 0.12f), + new Color(0.85f, 0.55f, 0.24f), + new Color(1f, 0.88f, 0.66f), + new Color(0.05f, 0.08f, 0.14f), + new Color(0.10f, 0.22f, 0.42f), + new Color(0.42f, 0.10f, 0.10f)); + + default: + return new ScenePalette( + new Color(0.02f, 0.03f, 0.055f), + new Color(0.06f, 0.075f, 0.11f), + new Color(0.12f, 0.15f, 0.20f), + new Color(0.30f, 0.55f, 0.85f), + new Color(0.82f, 0.88f, 1f), + new Color(0.08f, 0.11f, 0.17f), + new Color(0.16f, 0.30f, 0.52f), + new Color(0.38f, 0.12f, 0.12f)); + } + } + + private sealed class ScenePalette + { + public ScenePalette( + Color background, + Color floor, + Color structure, + Color accent, + Color light, + Color ambient, + Color zone, + Color enemyZone) + { + Background = background; + Floor = floor; + Structure = structure; + Accent = accent; + Light = light; + Ambient = ambient; + Zone = zone; + EnemyZone = enemyZone; + } + + public Color Background { get; } + public Color Floor { get; } + public Color Structure { get; } + public Color Accent { get; } + public Color Light { get; } + public Color Ambient { get; } + public Color Zone { get; } + public Color EnemyZone { get; } + } + } +} diff --git a/client/Assets/Vanguard/Runtime/App/SceneEnvironment.cs.meta b/client/Assets/Vanguard/Runtime/App/SceneEnvironment.cs.meta new file mode 100644 index 0000000..2ab1a8b --- /dev/null +++ b/client/Assets/Vanguard/Runtime/App/SceneEnvironment.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: d1a7a96d0d591fe458e5ec20dfebeb73 \ No newline at end of file diff --git a/client/Assets/Vanguard/Runtime/App/SceneFlow.cs b/client/Assets/Vanguard/Runtime/App/SceneFlow.cs new file mode 100644 index 0000000..25cb020 --- /dev/null +++ b/client/Assets/Vanguard/Runtime/App/SceneFlow.cs @@ -0,0 +1,84 @@ +using System.Threading.Tasks; +using UnityEngine; +using UnityEngine.SceneManagement; +using Vanguard.Api.Contracts; +using Vanguard.Battle; + +namespace Vanguard.App +{ + /// + /// Переходы между сценами-экранами. Boot и VanguardApp остаются + /// персистентными; данные перехода (выбранная колода, тикет) временно + /// лежат здесь и забираются целевой сценой. + /// + public sealed class SceneFlow + { + public const string Boot = "Boot"; + public const string Login = "Login"; + public const string Lobby = "Lobby"; + public const string Collection = "Collection"; + public const string DeckBuilder = "DeckBuilder"; + public const string Battle = "Battle"; + + public DeckDto PendingQueueDeck { get; private set; } + public MatchConnectionInfo PendingMatch { get; private set; } + + public Task LoadLoginAsync() + { + PendingQueueDeck = null; + PendingMatch = null; + return LoadAsync(Login); + } + + public Task LoadLobbyAsync() => LoadAsync(Lobby); + + public Task LoadCollectionAsync() => LoadAsync(Collection); + + public Task LoadDeckBuilderAsync() => LoadAsync(DeckBuilder); + + public Task OpenLobbyWithQueueAsync(DeckDto deck) + { + PendingQueueDeck = deck; + return LoadAsync(Lobby); + } + + public Task LoadBattleAsync(MatchConnectionInfo info) + { + PendingMatch = info; + return LoadAsync(Battle); + } + + public DeckDto ConsumePendingQueueDeck() + { + var deck = PendingQueueDeck; + PendingQueueDeck = null; + return deck; + } + + public MatchConnectionInfo ConsumePendingMatch() + { + var match = PendingMatch; + PendingMatch = null; + return match; + } + + public async Task LoadAsync(string sceneName) + { + if (string.IsNullOrEmpty(sceneName)) + return; + + if (SceneManager.GetActiveScene().name == sceneName) + return; + + var operation = SceneManager.LoadSceneAsync(sceneName, LoadSceneMode.Single); + if (operation == null) + { + Debug.LogError("Сцена не добавлена в Build Settings: " + sceneName); + return; + } + + while (!operation.isDone) + await Task.Yield(); + } + } +} diff --git a/client/Assets/Vanguard/Runtime/App/SceneFlow.cs.meta b/client/Assets/Vanguard/Runtime/App/SceneFlow.cs.meta new file mode 100644 index 0000000..638a6fb --- /dev/null +++ b/client/Assets/Vanguard/Runtime/App/SceneFlow.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: c543dd07e75d9c948a29d8a429860c95 \ No newline at end of file diff --git a/client/Assets/Vanguard/Runtime/App/VanguardApp.cs b/client/Assets/Vanguard/Runtime/App/VanguardApp.cs index 32f40e9..f3e6dfe 100644 --- a/client/Assets/Vanguard/Runtime/App/VanguardApp.cs +++ b/client/Assets/Vanguard/Runtime/App/VanguardApp.cs @@ -1,30 +1,32 @@ using System; -using System.Threading.Tasks; using UnityEngine; using VContainer; using Vanguard.Api; using Vanguard.Auth; using Vanguard.Meta; using Vanguard.State; -using Vanguard.UI; namespace Vanguard.App { /// - /// Composition root клиента. Создаётся из runtime-инициализатора, поэтому - /// не зависит от содержимого сцены; сцены появятся позже. + /// Composition root клиента. Живёт между сценами, хранит DI-контейнер и + /// общие сервисы; сцены отвечают только за 3D-вид и свой UI. /// public sealed class VanguardApp : MonoBehaviour { + public static VanguardApp Instance { get; private set; } public static string LastInitializationError { get; private set; } private IObjectResolver _container; - private AppRootView _root; + + public IObjectResolver Container => _container; + public SceneFlow Flow { get; private set; } private void Awake() { try { + Instance = this; DontDestroyOnLoad(gameObject); Application.targetFrameRate = 60; @@ -38,13 +40,10 @@ namespace Vanguard.App builder.Register(Lifetime.Singleton); builder.Register(Lifetime.Singleton); builder.Register(Lifetime.Singleton); - builder.Register(Lifetime.Singleton); + builder.Register(Lifetime.Singleton); _container = builder.Build(); - _root = _container.Resolve(); - _root.Initialize(); - - _ = RestoreSessionAsync(); + Flow = _container.Resolve(); } catch (Exception exception) { @@ -53,33 +52,17 @@ namespace Vanguard.App } } - private async Task RestoreSessionAsync() + private void Start() { - var auth = _container.Resolve(); - - try - { - if (await auth.TryRestoreAsync()) - { - _root.ShowAfterLogin(); - return; - } - } - catch (Exception exception) - { - Debug.LogException(exception); - } - - _root.ShowLogin("Введите данные игрока."); - } - - private void Update() - { - _root?.Tick(); + if (Flow != null) + _ = Flow.LoadLoginAsync(); } private void OnDestroy() { + if (Instance == this) + Instance = null; + if (_container is IDisposable disposable) disposable.Dispose(); } diff --git a/client/Assets/Vanguard/Runtime/UI/AppRootView.cs b/client/Assets/Vanguard/Runtime/UI/AppRootView.cs deleted file mode 100644 index 1a3c72e..0000000 --- a/client/Assets/Vanguard/Runtime/UI/AppRootView.cs +++ /dev/null @@ -1,148 +0,0 @@ -using UnityEngine; -using Vanguard.Api.Contracts; -using Vanguard.App; -using Vanguard.Auth; -using Vanguard.Battle; -using Vanguard.Meta; -using Vanguard.State; - -namespace Vanguard.UI -{ - /// Владелец Canvas и переключения экранов. - public sealed class AppRootView - { - private readonly AppConfig _config; - private readonly AuthService _auth; - private readonly PlayerState _player; - private readonly MetaService _metaService; - - private LoginView _login; - private MetaView _metaView; - private OnboardingView _onboarding; - private CollectionView _collection; - private DecksView _decks; - private QueueView _queue; - private BattleView _battle; - - public AppRootView( - AppConfig config, - AuthService auth, - PlayerState player, - MetaService metaService) - { - _config = config; - _auth = auth; - _player = player; - _metaService = metaService; - } - - public void Initialize() - { - var canvas = UiKit.CreateCanvas("Vanguard Canvas"); - - _login = new LoginView(canvas.transform, _config, _auth, OnAuthenticated); - _metaView = new MetaView( - canvas.transform, - _auth, - _player, - OnLoggedOut, - ShowCollection, - ShowDecks, - ShowDecks, - ShowOnboarding); - _onboarding = new OnboardingView( - canvas.transform, _auth, _metaService, OnOnboarded, OnLoggedOut); - _collection = new CollectionView( - canvas.transform, _metaService, _player, ShowMeta); - _decks = new DecksView( - canvas.transform, _metaService, _player, ShowMeta, ShowQueue); - _queue = new QueueView( - canvas.transform, _metaService, _auth, ShowDecks, ShowBattle); - _battle = new BattleView( - canvas.transform, _metaService, ShowMeta); - - ShowLogin("Проверяем сессию…"); - } - - public void Tick() - { - _battle?.Tick(); - } - - public void ShowLogin(string status = null) - { - HideAll(); - _login.Show(status); - } - - public void ShowAfterLogin() - { - if (_player.OnboardingCompleted) - ShowMeta(); - else - ShowOnboarding(); - } - - public void ShowMeta() - { - HideAll(); - _metaView.Show(); - } - - public void ShowOnboarding() - { - HideAll(); - _onboarding.Show(); - } - - public void ShowCollection() - { - HideAll(); - _collection.Show(); - } - - public void ShowDecks() - { - HideAll(); - _decks.Show(); - } - - public void ShowQueue(DeckDto deck) - { - HideAll(); - _queue.Show(deck); - } - - public void ShowBattle(MatchConnectionInfo info) - { - HideAll(); - _battle.Show(info); - } - - private void HideAll() - { - _login.Hide(); - _metaView.Hide(); - _onboarding.Hide(); - _collection.Hide(); - _decks.Hide(); - _queue.Hide(); - _battle.Hide(); - } - - private void OnAuthenticated() - { - ShowAfterLogin(); - } - - private void OnOnboarded() - { - ShowMeta(); - } - - private void OnLoggedOut() - { - ShowLogin("Сессия завершена. Войдите снова."); - } - } -} diff --git a/client/Assets/Vanguard/Runtime/UI/AppRootView.cs.meta b/client/Assets/Vanguard/Runtime/UI/AppRootView.cs.meta deleted file mode 100644 index fe5719b..0000000 --- a/client/Assets/Vanguard/Runtime/UI/AppRootView.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: ff1fdb94bf828d64099d3458f8e34b12 \ No newline at end of file diff --git a/client/Assets/Vanguard/Runtime/UI/UiKit.cs b/client/Assets/Vanguard/Runtime/UI/UiKit.cs index 51a2fa0..c16a3f8 100644 --- a/client/Assets/Vanguard/Runtime/UI/UiKit.cs +++ b/client/Assets/Vanguard/Runtime/UI/UiKit.cs @@ -29,12 +29,12 @@ namespace Vanguard.UI } } - public static Canvas CreateCanvas(string name) + public static Canvas CreateCanvas(string name, bool persistent = false) { EnsureEventSystem(); var go = new GameObject(name, typeof(Canvas), typeof(CanvasScaler), typeof(GraphicRaycaster)); - if (Application.isPlaying) + if (Application.isPlaying && persistent) Object.DontDestroyOnLoad(go); var canvas = go.GetComponent(); diff --git a/client/Assets/Vanguard/Scenes.meta b/client/Assets/Vanguard/Scenes.meta new file mode 100644 index 0000000..ce7bf5d --- /dev/null +++ b/client/Assets/Vanguard/Scenes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e59af53696c9cac4499af3e46be58991 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/client/Assets/Vanguard/Scenes/Battle.unity b/client/Assets/Vanguard/Scenes/Battle.unity new file mode 100644 index 0000000..a5cffb9 --- /dev/null +++ b/client/Assets/Vanguard/Scenes/Battle.unity @@ -0,0 +1,352 @@ +%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: 10 + 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_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 13 + m_BakeOnSceneLoad: 0 + 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_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 2 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 256 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 1 + m_PVRDenoiserTypeDirect: 2 + m_PVRDenoiserTypeIndirect: 2 + m_PVRDenoiserTypeAO: 2 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 1 + m_PVRFilteringGaussRadiusAO: 1 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 20201, guid: 0000000000000000f000000000000000, type: 0} + m_LightingSettings: {fileID: 0} +--- !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!1 &490282527 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 490282529} + - component: {fileID: 490282528} + m_Layer: 0 + m_Name: Battle Scene + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &490282528 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 490282527} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9a62d9e570dfb024d96981ddfffdf2ad, type: 3} + m_Name: + m_EditorClassIdentifier: Vanguard.Runtime::Vanguard.App.BattleSceneController +--- !u!4 &490282529 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 490282527} + serializedVersion: 2 + 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_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1697705437 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1697705439} + - component: {fileID: 1697705438} + 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 &1697705438 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1697705437} + m_Enabled: 1 + serializedVersion: 13 + m_Type: 1 + m_Color: {r: 0.82, g: 0.88, b: 1, a: 1} + m_Intensity: 0.9 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize2D: {x: 0.5, y: 0.5} + 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_ForceVisible: 0 + m_ShapeRadius: 0.025 + m_ShadowAngle: 0 + m_LightUnit: 1 + m_LuxAtDistance: 1 + m_EnableSpotReflector: 1 +--- !u!4 &1697705439 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1697705437} + serializedVersion: 2 + m_LocalRotation: {x: 0.39098036, y: -0.25180724, z: 0.112111814, w: 0.87815624} + 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_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1894381784 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1894381786} + - component: {fileID: 1894381785} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!20 &1894381785 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1894381784} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 2 + m_BackGroundColor: {r: 0.02, g: 0.03, b: 0.055, a: 1} + 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: 0 + 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 &1894381786 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1894381784} + serializedVersion: 2 + m_LocalRotation: {x: 0.104528464, y: 0, z: 0, w: 0.9945219} + m_LocalPosition: {x: 0, y: 3.2, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1660057539 &9223372036854775807 +SceneRoots: + m_ObjectHideFlags: 0 + m_Roots: + - {fileID: 490282529} + - {fileID: 1894381786} + - {fileID: 1697705439} diff --git a/client/Assets/Vanguard/Scenes/Battle.unity.meta b/client/Assets/Vanguard/Scenes/Battle.unity.meta new file mode 100644 index 0000000..6656462 --- /dev/null +++ b/client/Assets/Vanguard/Scenes/Battle.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 410b134e05d389242af202ca07840dec +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/client/Assets/Vanguard/Scenes/Collection.unity b/client/Assets/Vanguard/Scenes/Collection.unity new file mode 100644 index 0000000..8fef218 --- /dev/null +++ b/client/Assets/Vanguard/Scenes/Collection.unity @@ -0,0 +1,352 @@ +%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: 10 + 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_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 13 + m_BakeOnSceneLoad: 0 + 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_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 2 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 256 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 1 + m_PVRDenoiserTypeDirect: 2 + m_PVRDenoiserTypeIndirect: 2 + m_PVRDenoiserTypeAO: 2 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 1 + m_PVRFilteringGaussRadiusAO: 1 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 20201, guid: 0000000000000000f000000000000000, type: 0} + m_LightingSettings: {fileID: 0} +--- !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!1 &490282527 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 490282529} + - component: {fileID: 490282528} + m_Layer: 0 + m_Name: Collection Scene + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &490282528 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 490282527} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 8ccb09cec5c89814493fae05cf2d6051, type: 3} + m_Name: + m_EditorClassIdentifier: Vanguard.Runtime::Vanguard.App.CollectionSceneController +--- !u!4 &490282529 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 490282527} + serializedVersion: 2 + 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_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1697705437 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1697705439} + - component: {fileID: 1697705438} + 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 &1697705438 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1697705437} + m_Enabled: 1 + serializedVersion: 13 + m_Type: 1 + m_Color: {r: 0.82, g: 0.88, b: 1, a: 1} + m_Intensity: 0.9 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize2D: {x: 0.5, y: 0.5} + 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_ForceVisible: 0 + m_ShapeRadius: 0.025 + m_ShadowAngle: 0 + m_LightUnit: 1 + m_LuxAtDistance: 1 + m_EnableSpotReflector: 1 +--- !u!4 &1697705439 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1697705437} + serializedVersion: 2 + m_LocalRotation: {x: 0.39098036, y: -0.25180724, z: 0.112111814, w: 0.87815624} + 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_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1894381784 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1894381786} + - component: {fileID: 1894381785} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!20 &1894381785 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1894381784} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 2 + m_BackGroundColor: {r: 0.02, g: 0.03, b: 0.055, a: 1} + 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: 0 + 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 &1894381786 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1894381784} + serializedVersion: 2 + m_LocalRotation: {x: 0.104528464, y: 0, z: 0, w: 0.9945219} + m_LocalPosition: {x: 0, y: 3.2, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1660057539 &9223372036854775807 +SceneRoots: + m_ObjectHideFlags: 0 + m_Roots: + - {fileID: 490282529} + - {fileID: 1894381786} + - {fileID: 1697705439} diff --git a/client/Assets/Vanguard/Scenes/Collection.unity.meta b/client/Assets/Vanguard/Scenes/Collection.unity.meta new file mode 100644 index 0000000..1634913 --- /dev/null +++ b/client/Assets/Vanguard/Scenes/Collection.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: cd8d654fe14bfb0419574bc6d2820591 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/client/Assets/Vanguard/Scenes/DeckBuilder.unity b/client/Assets/Vanguard/Scenes/DeckBuilder.unity new file mode 100644 index 0000000..73bd2e3 --- /dev/null +++ b/client/Assets/Vanguard/Scenes/DeckBuilder.unity @@ -0,0 +1,352 @@ +%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: 10 + 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_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 13 + m_BakeOnSceneLoad: 0 + 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_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 2 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 256 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 1 + m_PVRDenoiserTypeDirect: 2 + m_PVRDenoiserTypeIndirect: 2 + m_PVRDenoiserTypeAO: 2 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 1 + m_PVRFilteringGaussRadiusAO: 1 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 20201, guid: 0000000000000000f000000000000000, type: 0} + m_LightingSettings: {fileID: 0} +--- !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!1 &490282527 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 490282529} + - component: {fileID: 490282528} + m_Layer: 0 + m_Name: DeckBuilder Scene + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &490282528 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 490282527} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c87789aeb7d84cc438babc89db55d1fc, type: 3} + m_Name: + m_EditorClassIdentifier: Vanguard.Runtime::Vanguard.App.DeckBuilderSceneController +--- !u!4 &490282529 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 490282527} + serializedVersion: 2 + 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_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1697705437 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1697705439} + - component: {fileID: 1697705438} + 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 &1697705438 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1697705437} + m_Enabled: 1 + serializedVersion: 13 + m_Type: 1 + m_Color: {r: 0.82, g: 0.88, b: 1, a: 1} + m_Intensity: 0.9 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize2D: {x: 0.5, y: 0.5} + 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_ForceVisible: 0 + m_ShapeRadius: 0.025 + m_ShadowAngle: 0 + m_LightUnit: 1 + m_LuxAtDistance: 1 + m_EnableSpotReflector: 1 +--- !u!4 &1697705439 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1697705437} + serializedVersion: 2 + m_LocalRotation: {x: 0.39098036, y: -0.25180724, z: 0.112111814, w: 0.87815624} + 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_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1894381784 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1894381786} + - component: {fileID: 1894381785} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!20 &1894381785 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1894381784} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 2 + m_BackGroundColor: {r: 0.02, g: 0.03, b: 0.055, a: 1} + 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: 0 + 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 &1894381786 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1894381784} + serializedVersion: 2 + m_LocalRotation: {x: 0.104528464, y: 0, z: 0, w: 0.9945219} + m_LocalPosition: {x: 0, y: 3.2, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1660057539 &9223372036854775807 +SceneRoots: + m_ObjectHideFlags: 0 + m_Roots: + - {fileID: 490282529} + - {fileID: 1894381786} + - {fileID: 1697705439} diff --git a/client/Assets/Vanguard/Scenes/DeckBuilder.unity.meta b/client/Assets/Vanguard/Scenes/DeckBuilder.unity.meta new file mode 100644 index 0000000..cdbd60e --- /dev/null +++ b/client/Assets/Vanguard/Scenes/DeckBuilder.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: b8567d3f2f60dcc4f85794bdbaf95b45 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/client/Assets/Vanguard/Scenes/Lobby.unity b/client/Assets/Vanguard/Scenes/Lobby.unity new file mode 100644 index 0000000..8053de8 --- /dev/null +++ b/client/Assets/Vanguard/Scenes/Lobby.unity @@ -0,0 +1,352 @@ +%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: 10 + 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_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 13 + m_BakeOnSceneLoad: 0 + 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_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 2 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 256 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 1 + m_PVRDenoiserTypeDirect: 2 + m_PVRDenoiserTypeIndirect: 2 + m_PVRDenoiserTypeAO: 2 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 1 + m_PVRFilteringGaussRadiusAO: 1 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 20201, guid: 0000000000000000f000000000000000, type: 0} + m_LightingSettings: {fileID: 0} +--- !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!1 &490282527 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 490282529} + - component: {fileID: 490282528} + m_Layer: 0 + m_Name: Lobby Scene + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &490282528 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 490282527} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a1fe2c339c891e849a96ecc6a5c22748, type: 3} + m_Name: + m_EditorClassIdentifier: Vanguard.Runtime::Vanguard.App.LobbySceneController +--- !u!4 &490282529 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 490282527} + serializedVersion: 2 + 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_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1697705437 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1697705439} + - component: {fileID: 1697705438} + 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 &1697705438 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1697705437} + m_Enabled: 1 + serializedVersion: 13 + m_Type: 1 + m_Color: {r: 0.82, g: 0.88, b: 1, a: 1} + m_Intensity: 0.9 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize2D: {x: 0.5, y: 0.5} + 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_ForceVisible: 0 + m_ShapeRadius: 0.025 + m_ShadowAngle: 0 + m_LightUnit: 1 + m_LuxAtDistance: 1 + m_EnableSpotReflector: 1 +--- !u!4 &1697705439 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1697705437} + serializedVersion: 2 + m_LocalRotation: {x: 0.39098036, y: -0.25180724, z: 0.112111814, w: 0.87815624} + 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_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1894381784 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1894381786} + - component: {fileID: 1894381785} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!20 &1894381785 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1894381784} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 2 + m_BackGroundColor: {r: 0.02, g: 0.03, b: 0.055, a: 1} + 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: 0 + 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 &1894381786 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1894381784} + serializedVersion: 2 + m_LocalRotation: {x: 0.104528464, y: 0, z: 0, w: 0.9945219} + m_LocalPosition: {x: 0, y: 3.2, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1660057539 &9223372036854775807 +SceneRoots: + m_ObjectHideFlags: 0 + m_Roots: + - {fileID: 490282529} + - {fileID: 1894381786} + - {fileID: 1697705439} diff --git a/client/Assets/Vanguard/Scenes/Lobby.unity.meta b/client/Assets/Vanguard/Scenes/Lobby.unity.meta new file mode 100644 index 0000000..c7d92b9 --- /dev/null +++ b/client/Assets/Vanguard/Scenes/Lobby.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 59a25f3bae0ec7c489d2a139d7eea285 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/client/Assets/Vanguard/Scenes/Login.unity b/client/Assets/Vanguard/Scenes/Login.unity new file mode 100644 index 0000000..04f4bd0 --- /dev/null +++ b/client/Assets/Vanguard/Scenes/Login.unity @@ -0,0 +1,352 @@ +%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: 10 + 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_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 13 + m_BakeOnSceneLoad: 0 + 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_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 2 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 256 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 1 + m_PVRDenoiserTypeDirect: 2 + m_PVRDenoiserTypeIndirect: 2 + m_PVRDenoiserTypeAO: 2 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 1 + m_PVRFilteringGaussRadiusAO: 1 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 20201, guid: 0000000000000000f000000000000000, type: 0} + m_LightingSettings: {fileID: 0} +--- !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!1 &490282527 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 490282529} + - component: {fileID: 490282528} + m_Layer: 0 + m_Name: Login Scene + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &490282528 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 490282527} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc0007ae5cfaa2647a674301f0042159, type: 3} + m_Name: + m_EditorClassIdentifier: Vanguard.Runtime::Vanguard.App.LoginSceneController +--- !u!4 &490282529 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 490282527} + serializedVersion: 2 + 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_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1697705437 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1697705439} + - component: {fileID: 1697705438} + 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 &1697705438 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1697705437} + m_Enabled: 1 + serializedVersion: 13 + m_Type: 1 + m_Color: {r: 0.82, g: 0.88, b: 1, a: 1} + m_Intensity: 0.9 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize2D: {x: 0.5, y: 0.5} + 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_ForceVisible: 0 + m_ShapeRadius: 0.025 + m_ShadowAngle: 0 + m_LightUnit: 1 + m_LuxAtDistance: 1 + m_EnableSpotReflector: 1 +--- !u!4 &1697705439 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1697705437} + serializedVersion: 2 + m_LocalRotation: {x: 0.39098036, y: -0.25180724, z: 0.112111814, w: 0.87815624} + 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_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1894381784 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1894381786} + - component: {fileID: 1894381785} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!20 &1894381785 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1894381784} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 2 + m_BackGroundColor: {r: 0.02, g: 0.03, b: 0.055, a: 1} + 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: 0 + 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 &1894381786 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1894381784} + serializedVersion: 2 + m_LocalRotation: {x: 0.104528464, y: 0, z: 0, w: 0.9945219} + m_LocalPosition: {x: 0, y: 3.2, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1660057539 &9223372036854775807 +SceneRoots: + m_ObjectHideFlags: 0 + m_Roots: + - {fileID: 490282529} + - {fileID: 1894381786} + - {fileID: 1697705439} diff --git a/client/Assets/Vanguard/Scenes/Login.unity.meta b/client/Assets/Vanguard/Scenes/Login.unity.meta new file mode 100644 index 0000000..8cf3d62 --- /dev/null +++ b/client/Assets/Vanguard/Scenes/Login.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 63d2c59dfa0801c4ab7a27406481f94c +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/client/Assets/Vanguard/Tests/Editor/ClientSmokeTests.cs b/client/Assets/Vanguard/Tests/Editor/ClientSmokeTests.cs index 303b1ca..0369a27 100644 --- a/client/Assets/Vanguard/Tests/Editor/ClientSmokeTests.cs +++ b/client/Assets/Vanguard/Tests/Editor/ClientSmokeTests.cs @@ -14,7 +14,7 @@ namespace Vanguard.Tests public sealed class ClientSmokeTests { [Test] - public void AppRootView_Builds_Login_And_Meta_Screens() + public void Client_Views_Build() { var config = new AppConfig(); config.Load(); @@ -24,26 +24,43 @@ namespace Vanguard.Tests var player = new PlayerState(); var auth = new AuthService(api, tokens, player); var meta = new MetaService(api, player); - var root = new AppRootView(config, auth, player, meta); - root.Initialize(); - root.ShowLogin("smoke"); + var canvas = UiKit.CreateCanvas("Test Canvas"); + + var login = new LoginView(canvas.transform, config, auth, () => { }); + login.Show("smoke"); + + var lobby = new MetaView( + canvas.transform, auth, player, () => { }, + () => { }, () => { }, () => { }, () => { }); + var onboarding = new OnboardingView( + canvas.transform, auth, meta, () => { }, () => { }); + var collection = new CollectionView( + canvas.transform, meta, player, () => { }); + var decks = new DecksView( + canvas.transform, meta, player, () => { }, _ => { }); + var queue = new QueueView( + canvas.transform, meta, auth, () => { }, _ => { }); + var battle = new BattleView( + canvas.transform, meta, () => { }); - Assert.IsNotNull(GameObject.Find("Vanguard Canvas")); Assert.IsNotNull(GameObject.Find("LoginScreen")); - Assert.IsTrue(Resources.FindObjectsOfTypeAll().Any(go => go.name == "MetaScreen")); - Assert.IsTrue(Resources.FindObjectsOfTypeAll().Any(go => go.name == "OnboardingScreen")); - Assert.IsTrue(Resources.FindObjectsOfTypeAll().Any(go => go.name == "CollectionScreen")); - Assert.IsTrue(Resources.FindObjectsOfTypeAll().Any(go => go.name == "DecksScreen")); - Assert.IsTrue(Resources.FindObjectsOfTypeAll().Any(go => go.name == "QueueScreen")); - Assert.IsTrue(Resources.FindObjectsOfTypeAll().Any(go => go.name == "BattleScreen")); + Assert.IsTrue(Exists("MetaScreen")); + Assert.IsTrue(Exists("OnboardingScreen")); + Assert.IsTrue(Exists("CollectionScreen")); + Assert.IsTrue(Exists("DecksScreen")); + Assert.IsTrue(Exists("QueueScreen")); + Assert.IsTrue(Exists("BattleScreen")); Cleanup(); } + private static bool Exists(string name) => + Resources.FindObjectsOfTypeAll().Any(go => go.name == name); + private static void Cleanup() { - var canvas = GameObject.Find("Vanguard Canvas"); + var canvas = GameObject.Find("Test Canvas"); if (canvas != null) Object.DestroyImmediate(canvas); diff --git a/client/Assets/Vanguard/Tests/PlayMode/AppBootstrapPlayModeTests.cs b/client/Assets/Vanguard/Tests/PlayMode/AppBootstrapPlayModeTests.cs deleted file mode 100644 index 0139ebd..0000000 --- a/client/Assets/Vanguard/Tests/PlayMode/AppBootstrapPlayModeTests.cs +++ /dev/null @@ -1,68 +0,0 @@ -using System.Collections; -using System.Linq; -using NUnit.Framework; -using UnityEngine; -using UnityEngine.EventSystems; -using UnityEngine.TestTools; -using Vanguard.App; - -namespace Vanguard.Tests -{ - public sealed class AppBootstrapPlayModeTests - { - [UnityTest] - public IEnumerator App_Bootstraps_And_Shows_A_Screen() - { - if (Object.FindAnyObjectByType() == null) - { - var go = new GameObject("Test App"); - go.AddComponent(); - } - - yield return null; - yield return null; - - Assert.IsNotNull(Object.FindAnyObjectByType()); - Assert.IsNotNull(GameObject.Find("Vanguard Canvas")); - - var login = Resources.FindObjectsOfTypeAll() - .FirstOrDefault(go => go.name == "LoginScreen"); - var onboarding = Resources.FindObjectsOfTypeAll() - .FirstOrDefault(go => go.name == "OnboardingScreen"); - var meta = Resources.FindObjectsOfTypeAll() - .FirstOrDefault(go => go.name == "MetaScreen"); - var hierarchy = string.Join( - "\n", - Resources.FindObjectsOfTypeAll() - .Where(go => go.name.EndsWith("Screen") || go.name == "Vanguard Canvas") - .Select(go => go.name + ": activeSelf=" + go.activeSelf + ", activeInHierarchy=" + go.activeInHierarchy)); - - var hasStartScreen = (login != null && login.activeInHierarchy) - || (onboarding != null && onboarding.activeInHierarchy) - || (meta != null && meta.activeInHierarchy); - - Assert.IsTrue( - hasStartScreen, - "Ни LoginScreen, ни OnboardingScreen, ни MetaScreen не активны.\nInitError: " - + VanguardApp.LastInitializationError + "\n" + hierarchy); - - Cleanup(); - yield return null; - } - - private static void Cleanup() - { - var app = Object.FindAnyObjectByType(); - if (app != null) - Object.Destroy(app.gameObject); - - var canvas = GameObject.Find("Vanguard Canvas"); - if (canvas != null) - Object.Destroy(canvas); - - var eventSystem = Object.FindAnyObjectByType(); - if (eventSystem != null) - Object.Destroy(eventSystem.gameObject); - } - } -} diff --git a/client/Assets/Vanguard/Tests/PlayMode/AppBootstrapPlayModeTests.cs.meta b/client/Assets/Vanguard/Tests/PlayMode/AppBootstrapPlayModeTests.cs.meta deleted file mode 100644 index a810c07..0000000 --- a/client/Assets/Vanguard/Tests/PlayMode/AppBootstrapPlayModeTests.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: b8e1375853da4264f80f4fd944176ac4 \ No newline at end of file diff --git a/client/ProjectSettings/EditorBuildSettings.asset b/client/ProjectSettings/EditorBuildSettings.asset index 8662b1b..6c87a33 100644 --- a/client/ProjectSettings/EditorBuildSettings.asset +++ b/client/ProjectSettings/EditorBuildSettings.asset @@ -8,5 +8,20 @@ EditorBuildSettings: - enabled: 1 path: Assets/Scenes/Boot.unity guid: 99c9720ab356a0642a771bea13969a05 + - enabled: 1 + path: Assets/Vanguard/Scenes/Login.unity + guid: 63d2c59dfa0801c4ab7a27406481f94c + - enabled: 1 + path: Assets/Vanguard/Scenes/Lobby.unity + guid: 59a25f3bae0ec7c489d2a139d7eea285 + - enabled: 1 + path: Assets/Vanguard/Scenes/Collection.unity + guid: cd8d654fe14bfb0419574bc6d2820591 + - enabled: 1 + path: Assets/Vanguard/Scenes/DeckBuilder.unity + guid: b8567d3f2f60dcc4f85794bdbaf95b45 + - enabled: 1 + path: Assets/Vanguard/Scenes/Battle.unity + guid: 410b134e05d389242af202ca07840dec m_configObjects: com.unity.input.settings.actions: {fileID: -944628639613478452, guid: 052faaac586de48259a63d0c4782560b, type: 3} diff --git a/client/README.md b/client/README.md index 8be57c0..d315b47 100644 --- a/client/README.md +++ b/client/README.md @@ -44,7 +44,7 @@ http://localhost:5080 - `ClientBootstrap` — запуск без привязки к сцене. - DI на VContainer: `AppConfig`, `TokenStore`, `ApiClient`, `AuthService`, - `MetaService`, `PlayerState`, `AppRootView`. + `MetaService`, `PlayerState`, `SceneFlow`. - HTTP-клиент на `UnityWebRequest` + Newtonsoft.Json, разбор `ApiError`. - Логин, регистрация, refresh, `/me`, выход. - Восстановление сессии по refresh-токену при старте. @@ -89,9 +89,8 @@ MessagePack-сериализатор и юнион-кадры. это значение вернуть в «Not allowed». - Токены лежат в `PlayerPrefs` — только для разработки; для релиза нужно защищённое хранилище. -- Текущий UI собран кодом на uGUI и одном Canvas — это временный gray-box. - Финальные экраны — отдельные 3D-сцены; UI-слой может быть uGUI или - UI Toolkit в зависимости от сцены. +- Текущий UI собран кодом на uGUI; каждая сцена имеет свой Canvas. + Префабы/UI Toolkit подключим, когда появятся макеты. - DOTween пока не добавлен; анимации UI — после перехода на сцены. - Мета-экраны — заглушки: сеть и авторизация настоящие, разделы следующие. - Бой — gray-box: карты показываются по `printingId`, без артов и анимаций; @@ -111,5 +110,14 @@ EditMode: -testResults client\TestResults.xml ``` -PlayMode — то же с `-testPlatform PlayMode`. Тесты не ходят в сеть: -проверяются composition root, создание Canvas и обоих экранов. +Smoke сцен (входит в Play Mode, открывает Boot → Login, проверяет 3D-фон +и экран): + +```powershell +& 'C:\Program Files\Unity\Hub\Editor\6000.6.6f1\Editor\Unity.exe' ` + -batchmode -nographics -projectPath client ` + -executeMethod Vanguard.Editor.SceneSmoke.Run +``` + +Тесты не ходят в сеть: проверяются composition root, создание Canvas, +экранов и 3D-окружения. diff --git a/docs/HANDOFF.md b/docs/HANDOFF.md index 0a08a8f..b7eade0 100644 --- a/docs/HANDOFF.md +++ b/docs/HANDOFF.md @@ -514,7 +514,7 @@ CI подключён и проходит; серверный блок закр - сцена `Boot` + runtime-инициализатор, поэтому клиент стартует и в пустой сцене; - composition root на VContainer: `AppConfig`, `TokenStore`, `ApiClient`, - `AuthService`, `PlayerState`, `AppRootView`; + `AuthService`, `MetaService`, `PlayerState`, `SceneFlow`; - HTTP-клиент на `UnityWebRequest` + Newtonsoft.Json, разбор `ApiError`, таймаут 20 с; - login/register/refresh/me/logout, восстановление сессии по refresh, @@ -534,16 +534,21 @@ CI подключён и проходит; серверный блок закр сдача с подтверждением, результат; - `Vanguard.Shared.dll` (netstandard2.1) и MessagePack 3.1.12 подключены как плагины; `client/README.md` описывает запуск и ограничения; -- EditMode и PlayMode smoke-тесты `Vanguard.Tests.Editor` / - `Vanguard.Tests.PlayMode` собирают все экраны и проверяют запуск - приложения; live-probe (не входит в набор) проверил онбординг, - коллекцию, создание/удаление колоды, а также два WebSocket-подключения, - маллиган, сдачу и `GameFinished` против стенда. +- сцены `Login`, `Lobby`, `Collection`, `DeckBuilder`, `Battle` и + `SceneFlow`; `Boot` — стартовая служебная сцена, `VanguardApp` и сервисы + живут между сценами; +- 3D-фон на каждой сцене: камера, свет, пол и тематические примитивы; + UI пока code-generated uGUI; +- EditMode smoke `Vanguard.Tests.Editor` и `Vanguard.Editor.SceneSmoke` + проверяют запуск Boot → Login и создание экранов/3D-окружения; + live-probe (не входит в набор) проверил онбординг, коллекцию, + создание/удаление колоды, а также два WebSocket-подключения, маллиган, + сдачу и `GameFinished` против стенда. Дальше по клиенту: -1. Перейти к **3D-визуалу**: отдельные сцены **Login**, **Lobby**, - **Collection**, **DeckBuilder**, **Battle**; `Boot` — служебная сцена. +1. Наполнить 3D-сцены артом и перевести Login/Lobby на полноценные + prefab/UI; сейчас это 3D-каркас с code-generated uGUI. 2. Довести боевой UI: арты, зоны, анимации, скип/ускорение. 3. Реконнект на всех шагах и аккуратная обработка таймаутов. 4. Полный декбилдер с фильтрами и счётчиками. diff --git a/docs/client-visual-direction.md b/docs/client-visual-direction.md index f20eba7..b662258 100644 --- a/docs/client-visual-direction.md +++ b/docs/client-visual-direction.md @@ -33,30 +33,30 @@ Сцены отвечают за 3D-презентацию и свой UI. Сервисы не должны зависеть от конкретной сцены. -## План миграции с текущего gray-box +## Статус миграции -Сейчас работает один runtime-Canvas (`AppRootView`) со всеми экранами — -это функциональный каркас. Его сохраняем как основу логики и постепенно -разносим: +Сцены `Login`, `Lobby`, `Collection`, `DeckBuilder`, `Battle` созданы; +`VanguardApp` и общие сервисы персистентны, `SceneFlow` загружает сцены. +Сейчас 3D-окружение собрано из примитивов, UI — code-generated uGUI. +Дальше: арт/модели, prefab-экраны, анимации и наполнение сцен. + +Уже перенесено: - `LoginView` → сцена **Login** (3D-фон/стол, форма поверх); -- `MetaView` → сцена **Lobby** (3D-холл, панель профиля и входы в разделы); -- `CollectionView` → сцена **Collection** (3D-витрина/альбом карт); -- `DecksView` + будущий декбилдер → сцена **DeckBuilder** (3D-стол, - стопка колоды, карты, фильтры); -- `QueueView` → оверлей в **Lobby**; -- `BattleView` → сцена **Battle** (3D-стол, зоны, карты, камера, UI рук и - таймера). +- `MetaView`/`OnboardingView`/`QueueView` → сцена **Lobby**; +- `CollectionView` → сцена **Collection**; +- `DecksView` → сцена **DeckBuilder**; +- `BattleView` → сцена **Battle**. Сетевые и доменные классы (`GameConnection`, `ApiClient`, `MetaService`) -переносятся без изменения контрактов. Сцены подключаются через -`SceneFlow`; `Boot` остаётся загруженной/персистентной. +перенесены без изменения контрактов. `Boot` остаётся стартовой сценой, +`VanguardApp` — персистентным composition root. ## Ограничения и следующие шаги - Пока нет 3D-ассетов: карты в gray-box показываются по `printingId`. Арт и 3D-модели будут подключаться по `cardId` через Addressables. -- Ближайший визуальный шаг — создать пустые сцены Login/Lobby/Collection/ - DeckBuilder/Battle, добавить `SceneFlow` и перенести Login/Lobby. +- Ближайший визуальный шаг — наполнить сцены моделями/артом и перевести + UI на prefab-экраны; логика и `SceneFlow` уже готовы. - Боевые анимации, камера и 3D-карты — после стабилизации сетевого протокола и базового UI.