Move client to 3D scenes with SceneFlow
CI / test (push) Successful in 2m33s Details

This commit is contained in:
MpakobecEx 2026-10-21 17:49:41 +05:00
parent f618b69ae4
commit 6ed0998078
47 changed files with 2686 additions and 307 deletions

View File

@ -234,8 +234,9 @@
- [x] Unity 6 LTS, URP, Addressables, Input System, Localization. - [x] Unity 6 LTS, URP, Addressables, Input System, Localization.
DOTween — следующим шагом (пока UI без внешних твинов). DOTween — следующим шагом (пока UI без внешних твинов).
- [ ] 3D-сцены `Login`, `Lobby`, `Collection`, `DeckBuilder`, `Battle` - [x] 3D-сцены `Login`, `Lobby`, `Collection`, `DeckBuilder`, `Battle`
и `SceneFlow`; `Boot` уже есть как служебный bootstrap. и `SceneFlow`; `Boot` — стартовая служебная сцена. 3D-окружение пока
из примитивов, UI — code-generated uGUI.
- [x] Composition root + DI (VContainer), без синглтон-свалок. - [x] Composition root + DI (VContainer), без синглтон-свалок.
- [x] `ApiClient` (HTTP/JSON), `PlayerState`, таймауты и разбор `ApiError`. - [x] `ApiClient` (HTTP/JSON), `PlayerState`, таймауты и разбор `ApiError`.
- [x] `GameConnection` (WebSocket + MessagePack), snapshot/events, - [x] `GameConnection` (WebSocket + MessagePack), snapshot/events,

View File

@ -19,7 +19,7 @@
| CI (Forgejo Actions) | готово: `ci.yml` проходит на `home-runner` | | CI (Forgejo Actions) | готово: `ci.yml` проходит на `home-runner` |
| EF-миграции | готово (`InitialCreate`) | | EF-миграции | готово (`InitialCreate`) |
| Orleans | готово: silo + `MatchActorGrain`, включается `Orleans:Enabled` | | 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 |
| Лаунчер | не начато | | Лаунчер | не начато |
## Требования ## Требования

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 7fb54fe32f66fc44fac44b13550d9cc9
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -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
{
/// <summary>
/// Создаёт сцены-экраны и прописывает их в Build Settings.
/// Запуск: меню Vanguard → Rebuild Client Scenes или
/// Unity -batchmode -quit -executeMethod Vanguard.Editor.SceneBuilder.BuildAll.
/// </summary>
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<LoginSceneController>("Login");
Create<LobbySceneController>("Lobby");
Create<CollectionSceneController>("Collection");
Create<DeckBuilderSceneController>("DeckBuilder");
Create<BattleSceneController>("Battle");
var scenes = new List<EditorBuildSettingsScene>();
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<T>(string sceneName) where T : MonoBehaviour
{
var scene = EditorSceneManager.NewScene(NewSceneSetup.EmptyScene, NewSceneMode.Single);
var root = new GameObject(sceneName + " Scene");
root.AddComponent<T>();
var cameraGo = new GameObject("Main Camera");
cameraGo.tag = "MainCamera";
var camera = cameraGo.AddComponent<Camera>();
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>();
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<EditorBuildSettingsScene> scenes, string path)
{
if (File.Exists(path))
scenes.Add(new EditorBuildSettingsScene(path, true));
}
}
}

View File

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: c24d38169d69d16429c902bae594a19d

View File

@ -0,0 +1,62 @@
using System;
using UnityEditor;
using UnityEditor.SceneManagement;
using UnityEngine;
using UnityEngine.SceneManagement;
using Vanguard.App;
namespace Vanguard.Editor
{
/// <summary>
/// Быстрый smoke-запуск сцен из командной строки:
/// Unity -batchmode -nographics -executeMethod Vanguard.Editor.SceneSmoke.Run.
/// Открывает Boot, входит в Play Mode, ждёт загрузку Login/Lobby и выходит.
/// </summary>
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);
}
}
}

View File

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: dfcd15474d289f848b7fa616f9b1d4e2

View File

@ -1,19 +1,18 @@
{ {
"name": "Vanguard.Tests.PlayMode", "name": "Vanguard.Editor",
"rootNamespace": "Vanguard.Tests", "rootNamespace": "Vanguard.Editor",
"references": [ "references": [
"Vanguard.Runtime" "Vanguard.Runtime"
], ],
"includePlatforms": [], "includePlatforms": [
"Editor"
],
"excludePlatforms": [], "excludePlatforms": [],
"allowUnsafeCode": false, "allowUnsafeCode": false,
"overrideReferences": false, "overrideReferences": false,
"precompiledReferences": [], "precompiledReferences": [],
"autoReferenced": false, "autoReferenced": true,
"defineConstraints": [], "defineConstraints": [],
"versionDefines": [], "versionDefines": [],
"noEngineReferences": false, "noEngineReferences": false
"optionalUnityReferences": [
"TestAssemblies"
]
} }

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2 fileFormatVersion: 2
guid: 199ad6dea713aef4cb50a4d8d01c9ca4 guid: f65969750402d974c8bc90b95a61ae96
AssemblyDefinitionImporter: AssemblyDefinitionImporter:
externalObjects: {} externalObjects: {}
userData: userData:

View File

@ -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<MetaService>(),
() => _ = Flow.LoadLobbyAsync());
_view.Show(info);
}
private void Update()
{
_view?.Tick();
}
}
}

View File

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 9a62d9e570dfb024d96981ddfffdf2ad

View File

@ -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<MetaService>(),
Resolve<PlayerState>(),
() => _ = Flow.LoadLobbyAsync());
}
}
}

View File

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 8ccb09cec5c89814493fae05cf2d6051

View File

@ -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<MetaService>(),
Resolve<PlayerState>(),
() => _ = Flow.LoadLobbyAsync(),
deck => _ = Flow.OpenLobbyWithQueueAsync(deck));
}
}
}

View File

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: c87789aeb7d84cc438babc89db55d1fc

View File

@ -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<AuthService>();
_meta = Resolve<MetaService>();
_player = Resolve<PlayerState>();
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();
}
}
}

View File

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: a1fe2c339c891e849a96ecc6a5c22748

View File

@ -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<AuthService>();
var config = Resolve<AppConfig>();
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();
}
}
}

View File

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: dc0007ae5cfaa2647a674301f0042159

View File

@ -0,0 +1,31 @@
using UnityEngine;
using VContainer;
using Vanguard.UI;
namespace Vanguard.App
{
/// <summary>База контроллера сцены: доступ к персистентным сервисам и Canvas.</summary>
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<T>() where T : class => Container.Resolve<T>();
}
}

View File

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 861c568d3c51e8a4e9997279e60fee32

View File

@ -0,0 +1,251 @@
using UnityEngine;
namespace Vanguard.App
{
public enum SceneTheme
{
Login,
Lobby,
Collection,
DeckBuilder,
Battle,
}
/// <summary>
/// Простой 3D-фон для экранов: камера, свет, пол и тематические
/// примитивы. Это заготовка под будущие модели и арт; UI остаётся
/// отдельным Canvas-слоем.
/// </summary>
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>();
}
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<Light>();
if (light == null)
{
var go = new GameObject("Directional Light");
light = go.AddComponent<Light>();
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<Renderer>();
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; }
}
}
}

View File

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: d1a7a96d0d591fe458e5ec20dfebeb73

View File

@ -0,0 +1,84 @@
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.SceneManagement;
using Vanguard.Api.Contracts;
using Vanguard.Battle;
namespace Vanguard.App
{
/// <summary>
/// Переходы между сценами-экранами. Boot и VanguardApp остаются
/// персистентными; данные перехода (выбранная колода, тикет) временно
/// лежат здесь и забираются целевой сценой.
/// </summary>
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();
}
}
}

View File

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: c543dd07e75d9c948a29d8a429860c95

View File

@ -1,30 +1,32 @@
using System; using System;
using System.Threading.Tasks;
using UnityEngine; using UnityEngine;
using VContainer; using VContainer;
using Vanguard.Api; using Vanguard.Api;
using Vanguard.Auth; using Vanguard.Auth;
using Vanguard.Meta; using Vanguard.Meta;
using Vanguard.State; using Vanguard.State;
using Vanguard.UI;
namespace Vanguard.App namespace Vanguard.App
{ {
/// <summary> /// <summary>
/// Composition root клиента. Создаётся из runtime-инициализатора, поэтому /// Composition root клиента. Живёт между сценами, хранит DI-контейнер и
/// не зависит от содержимого сцены; сцены появятся позже. /// общие сервисы; сцены отвечают только за 3D-вид и свой UI.
/// </summary> /// </summary>
public sealed class VanguardApp : MonoBehaviour public sealed class VanguardApp : MonoBehaviour
{ {
public static VanguardApp Instance { get; private set; }
public static string LastInitializationError { get; private set; } public static string LastInitializationError { get; private set; }
private IObjectResolver _container; private IObjectResolver _container;
private AppRootView _root;
public IObjectResolver Container => _container;
public SceneFlow Flow { get; private set; }
private void Awake() private void Awake()
{ {
try try
{ {
Instance = this;
DontDestroyOnLoad(gameObject); DontDestroyOnLoad(gameObject);
Application.targetFrameRate = 60; Application.targetFrameRate = 60;
@ -38,13 +40,10 @@ namespace Vanguard.App
builder.Register<ApiClient>(Lifetime.Singleton); builder.Register<ApiClient>(Lifetime.Singleton);
builder.Register<AuthService>(Lifetime.Singleton); builder.Register<AuthService>(Lifetime.Singleton);
builder.Register<MetaService>(Lifetime.Singleton); builder.Register<MetaService>(Lifetime.Singleton);
builder.Register<AppRootView>(Lifetime.Singleton); builder.Register<SceneFlow>(Lifetime.Singleton);
_container = builder.Build(); _container = builder.Build();
_root = _container.Resolve<AppRootView>(); Flow = _container.Resolve<SceneFlow>();
_root.Initialize();
_ = RestoreSessionAsync();
} }
catch (Exception exception) catch (Exception exception)
{ {
@ -53,33 +52,17 @@ namespace Vanguard.App
} }
} }
private async Task RestoreSessionAsync() private void Start()
{ {
var auth = _container.Resolve<AuthService>(); if (Flow != null)
_ = Flow.LoadLoginAsync();
try
{
if (await auth.TryRestoreAsync())
{
_root.ShowAfterLogin();
return;
}
}
catch (Exception exception)
{
Debug.LogException(exception);
}
_root.ShowLogin("Введите данные игрока.");
}
private void Update()
{
_root?.Tick();
} }
private void OnDestroy() private void OnDestroy()
{ {
if (Instance == this)
Instance = null;
if (_container is IDisposable disposable) if (_container is IDisposable disposable)
disposable.Dispose(); disposable.Dispose();
} }

View File

@ -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
{
/// <summary>Владелец Canvas и переключения экранов.</summary>
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("Сессия завершена. Войдите снова.");
}
}
}

View File

@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: ff1fdb94bf828d64099d3458f8e34b12

View File

@ -29,12 +29,12 @@ namespace Vanguard.UI
} }
} }
public static Canvas CreateCanvas(string name) public static Canvas CreateCanvas(string name, bool persistent = false)
{ {
EnsureEventSystem(); EnsureEventSystem();
var go = new GameObject(name, typeof(Canvas), typeof(CanvasScaler), typeof(GraphicRaycaster)); var go = new GameObject(name, typeof(Canvas), typeof(CanvasScaler), typeof(GraphicRaycaster));
if (Application.isPlaying) if (Application.isPlaying && persistent)
Object.DontDestroyOnLoad(go); Object.DontDestroyOnLoad(go);
var canvas = go.GetComponent<Canvas>(); var canvas = go.GetComponent<Canvas>();

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: e59af53696c9cac4499af3e46be58991
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -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}

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 410b134e05d389242af202ca07840dec
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -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}

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: cd8d654fe14bfb0419574bc6d2820591
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -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}

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: b8567d3f2f60dcc4f85794bdbaf95b45
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -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}

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 59a25f3bae0ec7c489d2a139d7eea285
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -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}

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 63d2c59dfa0801c4ab7a27406481f94c
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -14,7 +14,7 @@ namespace Vanguard.Tests
public sealed class ClientSmokeTests public sealed class ClientSmokeTests
{ {
[Test] [Test]
public void AppRootView_Builds_Login_And_Meta_Screens() public void Client_Views_Build()
{ {
var config = new AppConfig(); var config = new AppConfig();
config.Load(); config.Load();
@ -24,26 +24,43 @@ namespace Vanguard.Tests
var player = new PlayerState(); var player = new PlayerState();
var auth = new AuthService(api, tokens, player); var auth = new AuthService(api, tokens, player);
var meta = new MetaService(api, player); var meta = new MetaService(api, player);
var root = new AppRootView(config, auth, player, meta);
root.Initialize(); var canvas = UiKit.CreateCanvas("Test Canvas");
root.ShowLogin("smoke");
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.IsNotNull(GameObject.Find("LoginScreen"));
Assert.IsTrue(Resources.FindObjectsOfTypeAll<GameObject>().Any(go => go.name == "MetaScreen")); Assert.IsTrue(Exists("MetaScreen"));
Assert.IsTrue(Resources.FindObjectsOfTypeAll<GameObject>().Any(go => go.name == "OnboardingScreen")); Assert.IsTrue(Exists("OnboardingScreen"));
Assert.IsTrue(Resources.FindObjectsOfTypeAll<GameObject>().Any(go => go.name == "CollectionScreen")); Assert.IsTrue(Exists("CollectionScreen"));
Assert.IsTrue(Resources.FindObjectsOfTypeAll<GameObject>().Any(go => go.name == "DecksScreen")); Assert.IsTrue(Exists("DecksScreen"));
Assert.IsTrue(Resources.FindObjectsOfTypeAll<GameObject>().Any(go => go.name == "QueueScreen")); Assert.IsTrue(Exists("QueueScreen"));
Assert.IsTrue(Resources.FindObjectsOfTypeAll<GameObject>().Any(go => go.name == "BattleScreen")); Assert.IsTrue(Exists("BattleScreen"));
Cleanup(); Cleanup();
} }
private static bool Exists(string name) =>
Resources.FindObjectsOfTypeAll<GameObject>().Any(go => go.name == name);
private static void Cleanup() private static void Cleanup()
{ {
var canvas = GameObject.Find("Vanguard Canvas"); var canvas = GameObject.Find("Test Canvas");
if (canvas != null) if (canvas != null)
Object.DestroyImmediate(canvas); Object.DestroyImmediate(canvas);

View File

@ -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<VanguardApp>() == null)
{
var go = new GameObject("Test App");
go.AddComponent<VanguardApp>();
}
yield return null;
yield return null;
Assert.IsNotNull(Object.FindAnyObjectByType<VanguardApp>());
Assert.IsNotNull(GameObject.Find("Vanguard Canvas"));
var login = Resources.FindObjectsOfTypeAll<GameObject>()
.FirstOrDefault(go => go.name == "LoginScreen");
var onboarding = Resources.FindObjectsOfTypeAll<GameObject>()
.FirstOrDefault(go => go.name == "OnboardingScreen");
var meta = Resources.FindObjectsOfTypeAll<GameObject>()
.FirstOrDefault(go => go.name == "MetaScreen");
var hierarchy = string.Join(
"\n",
Resources.FindObjectsOfTypeAll<GameObject>()
.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<VanguardApp>();
if (app != null)
Object.Destroy(app.gameObject);
var canvas = GameObject.Find("Vanguard Canvas");
if (canvas != null)
Object.Destroy(canvas);
var eventSystem = Object.FindAnyObjectByType<EventSystem>();
if (eventSystem != null)
Object.Destroy(eventSystem.gameObject);
}
}
}

View File

@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: b8e1375853da4264f80f4fd944176ac4

View File

@ -8,5 +8,20 @@ EditorBuildSettings:
- enabled: 1 - enabled: 1
path: Assets/Scenes/Boot.unity path: Assets/Scenes/Boot.unity
guid: 99c9720ab356a0642a771bea13969a05 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: m_configObjects:
com.unity.input.settings.actions: {fileID: -944628639613478452, guid: 052faaac586de48259a63d0c4782560b, type: 3} com.unity.input.settings.actions: {fileID: -944628639613478452, guid: 052faaac586de48259a63d0c4782560b, type: 3}

View File

@ -44,7 +44,7 @@ http://localhost:5080
- `ClientBootstrap` — запуск без привязки к сцене. - `ClientBootstrap` — запуск без привязки к сцене.
- DI на VContainer: `AppConfig`, `TokenStore`, `ApiClient`, `AuthService`, - DI на VContainer: `AppConfig`, `TokenStore`, `ApiClient`, `AuthService`,
`MetaService`, `PlayerState`, `AppRootView`. `MetaService`, `PlayerState`, `SceneFlow`.
- HTTP-клиент на `UnityWebRequest` + Newtonsoft.Json, разбор `ApiError`. - HTTP-клиент на `UnityWebRequest` + Newtonsoft.Json, разбор `ApiError`.
- Логин, регистрация, refresh, `/me`, выход. - Логин, регистрация, refresh, `/me`, выход.
- Восстановление сессии по refresh-токену при старте. - Восстановление сессии по refresh-токену при старте.
@ -89,9 +89,8 @@ MessagePack-сериализатор и юнион-кадры.
это значение вернуть в «Not allowed». это значение вернуть в «Not allowed».
- Токены лежат в `PlayerPrefs` — только для разработки; для релиза нужно - Токены лежат в `PlayerPrefs` — только для разработки; для релиза нужно
защищённое хранилище. защищённое хранилище.
- Текущий UI собран кодом на uGUI и одном Canvas — это временный gray-box. - Текущий UI собран кодом на uGUI; каждая сцена имеет свой Canvas.
Финальные экраны — отдельные 3D-сцены; UI-слой может быть uGUI или Префабы/UI Toolkit подключим, когда появятся макеты.
UI Toolkit в зависимости от сцены.
- DOTween пока не добавлен; анимации UI — после перехода на сцены. - DOTween пока не добавлен; анимации UI — после перехода на сцены.
- Мета-экраны — заглушки: сеть и авторизация настоящие, разделы следующие. - Мета-экраны — заглушки: сеть и авторизация настоящие, разделы следующие.
- Бой — gray-box: карты показываются по `printingId`, без артов и анимаций; - Бой — gray-box: карты показываются по `printingId`, без артов и анимаций;
@ -111,5 +110,14 @@ EditMode:
-testResults client\TestResults.xml -testResults client\TestResults.xml
``` ```
PlayMode — то же с `-testPlatform PlayMode`. Тесты не ходят в сеть: Smoke сцен (входит в Play Mode, открывает Boot → Login, проверяет 3D-фон
проверяются composition root, создание Canvas и обоих экранов. и экран):
```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-окружения.

View File

@ -514,7 +514,7 @@ CI подключён и проходит; серверный блок закр
- сцена `Boot` + runtime-инициализатор, поэтому клиент стартует и в пустой - сцена `Boot` + runtime-инициализатор, поэтому клиент стартует и в пустой
сцене; сцене;
- composition root на VContainer: `AppConfig`, `TokenStore`, `ApiClient`, - composition root на VContainer: `AppConfig`, `TokenStore`, `ApiClient`,
`AuthService`, `PlayerState`, `AppRootView`; `AuthService`, `MetaService`, `PlayerState`, `SceneFlow`;
- HTTP-клиент на `UnityWebRequest` + Newtonsoft.Json, разбор `ApiError`, - HTTP-клиент на `UnityWebRequest` + Newtonsoft.Json, разбор `ApiError`,
таймаут 20 с; таймаут 20 с;
- login/register/refresh/me/logout, восстановление сессии по refresh, - login/register/refresh/me/logout, восстановление сессии по refresh,
@ -534,16 +534,21 @@ CI подключён и проходит; серверный блок закр
сдача с подтверждением, результат; сдача с подтверждением, результат;
- `Vanguard.Shared.dll` (netstandard2.1) и MessagePack 3.1.12 подключены - `Vanguard.Shared.dll` (netstandard2.1) и MessagePack 3.1.12 подключены
как плагины; `client/README.md` описывает запуск и ограничения; как плагины; `client/README.md` описывает запуск и ограничения;
- EditMode и PlayMode smoke-тесты `Vanguard.Tests.Editor` / - сцены `Login`, `Lobby`, `Collection`, `DeckBuilder`, `Battle` и
`Vanguard.Tests.PlayMode` собирают все экраны и проверяют запуск `SceneFlow`; `Boot` — стартовая служебная сцена, `VanguardApp` и сервисы
приложения; live-probe (не входит в набор) проверил онбординг, живут между сценами;
коллекцию, создание/удаление колоды, а также два WebSocket-подключения, - 3D-фон на каждой сцене: камера, свет, пол и тематические примитивы;
маллиган, сдачу и `GameFinished` против стенда. UI пока code-generated uGUI;
- EditMode smoke `Vanguard.Tests.Editor` и `Vanguard.Editor.SceneSmoke`
проверяют запуск Boot → Login и создание экранов/3D-окружения;
live-probe (не входит в набор) проверил онбординг, коллекцию,
создание/удаление колоды, а также два WebSocket-подключения, маллиган,
сдачу и `GameFinished` против стенда.
Дальше по клиенту: Дальше по клиенту:
1. Перейти к **3D-визуалу**: отдельные сцены **Login**, **Lobby**, 1. Наполнить 3D-сцены артом и перевести Login/Lobby на полноценные
**Collection**, **DeckBuilder**, **Battle**; `Boot` — служебная сцена. prefab/UI; сейчас это 3D-каркас с code-generated uGUI.
2. Довести боевой UI: арты, зоны, анимации, скип/ускорение. 2. Довести боевой UI: арты, зоны, анимации, скип/ускорение.
3. Реконнект на всех шагах и аккуратная обработка таймаутов. 3. Реконнект на всех шагах и аккуратная обработка таймаутов.
4. Полный декбилдер с фильтрами и счётчиками. 4. Полный декбилдер с фильтрами и счётчиками.

View File

@ -33,30 +33,30 @@
Сцены отвечают за 3D-презентацию и свой UI. Сервисы не должны зависеть от Сцены отвечают за 3D-презентацию и свой UI. Сервисы не должны зависеть от
конкретной сцены. конкретной сцены.
## План миграции с текущего gray-box ## Статус миграции
Сейчас работает один runtime-Canvas (`AppRootView`) со всеми экранами — Сцены `Login`, `Lobby`, `Collection`, `DeckBuilder`, `Battle` созданы;
это функциональный каркас. Его сохраняем как основу логики и постепенно `VanguardApp` и общие сервисы персистентны, `SceneFlow` загружает сцены.
разносим: Сейчас 3D-окружение собрано из примитивов, UI — code-generated uGUI.
Дальше: арт/модели, prefab-экраны, анимации и наполнение сцен.
Уже перенесено:
- `LoginView` → сцена **Login** (3D-фон/стол, форма поверх); - `LoginView` → сцена **Login** (3D-фон/стол, форма поверх);
- `MetaView` → сцена **Lobby** (3D-холл, панель профиля и входы в разделы); - `MetaView`/`OnboardingView`/`QueueView` → сцена **Lobby**;
- `CollectionView` → сцена **Collection** (3D-витрина/альбом карт); - `CollectionView` → сцена **Collection**;
- `DecksView` + будущий декбилдер → сцена **DeckBuilder** (3D-стол, - `DecksView` → сцена **DeckBuilder**;
стопка колоды, карты, фильтры); - `BattleView` → сцена **Battle**.
- `QueueView` → оверлей в **Lobby**;
- `BattleView` → сцена **Battle** (3D-стол, зоны, карты, камера, UI рук и
таймера).
Сетевые и доменные классы (`GameConnection`, `ApiClient`, `MetaService`) Сетевые и доменные классы (`GameConnection`, `ApiClient`, `MetaService`)
переносятся без изменения контрактов. Сцены подключаются через перенесены без изменения контрактов. `Boot` остаётся стартовой сценой,
`SceneFlow`; `Boot` остаётся загруженной/персистентной. `VanguardApp` — персистентным composition root.
## Ограничения и следующие шаги ## Ограничения и следующие шаги
- Пока нет 3D-ассетов: карты в gray-box показываются по `printingId`. - Пока нет 3D-ассетов: карты в gray-box показываются по `printingId`.
Арт и 3D-модели будут подключаться по `cardId` через Addressables. Арт и 3D-модели будут подключаться по `cardId` через Addressables.
- Ближайший визуальный шаг — создать пустые сцены Login/Lobby/Collection/ - Ближайший визуальный шаг — наполнить сцены моделями/артом и перевести
DeckBuilder/Battle, добавить `SceneFlow` и перенести Login/Lobby. UI на prefab-экраны; логика и `SceneFlow` уже готовы.
- Боевые анимации, камера и 3D-карты — после стабилизации сетевого - Боевые анимации, камера и 3D-карты — после стабилизации сетевого
протокола и базового UI. протокола и базового UI.