diff --git a/Assembly-CSharp.csproj b/Assembly-CSharp.csproj index ba1b199..9cde786 100644 --- a/Assembly-CSharp.csproj +++ b/Assembly-CSharp.csproj @@ -58,9 +58,7 @@ - - @@ -71,7 +69,6 @@ - @@ -85,7 +82,6 @@ - @@ -119,7 +115,6 @@ - @@ -130,6 +125,7 @@ + diff --git a/Assets/DefaultNetworkPrefabs.asset b/Assets/DefaultNetworkPrefabs.asset index 43d0f17..efdbbed 100644 --- a/Assets/DefaultNetworkPrefabs.asset +++ b/Assets/DefaultNetworkPrefabs.asset @@ -214,3 +214,8 @@ MonoBehaviour: SourcePrefabToOverride: {fileID: 0} SourceHashToOverride: 0 OverridingTargetPrefab: {fileID: 0} + - Override: 0 + Prefab: {fileID: 4054730026397922910, guid: 2a0bac19258f9514691bd9aff479dfea, type: 3} + SourcePrefabToOverride: {fileID: 0} + SourceHashToOverride: 0 + OverridingTargetPrefab: {fileID: 0} diff --git a/Assets/NorthboundPrototype/Editor/PrototypePlayModeSmoke.cs b/Assets/NorthboundPrototype/Editor/PrototypePlayModeSmoke.cs index 6c677d1..e8b1a33 100644 --- a/Assets/NorthboundPrototype/Editor/PrototypePlayModeSmoke.cs +++ b/Assets/NorthboundPrototype/Editor/PrototypePlayModeSmoke.cs @@ -5,8 +5,13 @@ namespace Northbound.Prototype.Editor { public static class PrototypePlayModeSmoke { + public const string SessionKey = "Northbound.Prototype.InteractiveSmoke"; + + [MenuItem("Northbound/Run Gameplay Prototype Smoke Test")] public static void Start() { + bool commandLineSmoke = System.Array.Exists(System.Environment.GetCommandLineArgs(), argument => argument == "-prototypeSmoke"); + if (!commandLineSmoke) SessionState.SetBool(SessionKey, true); EditorSceneManager.OpenScene("Assets/NorthboundPrototype/Scenes/NorthboundGameplayPrototype.unity"); EditorApplication.isPlaying = true; } diff --git a/Assets/NorthboundPrototype/Editor/PrototypeSceneBuilder.cs b/Assets/NorthboundPrototype/Editor/PrototypeSceneBuilder.cs index 8dd1091..7d6d707 100644 --- a/Assets/NorthboundPrototype/Editor/PrototypeSceneBuilder.cs +++ b/Assets/NorthboundPrototype/Editor/PrototypeSceneBuilder.cs @@ -1,12 +1,13 @@ using System; using System.Collections.Generic; using System.IO; +using Unity.AI.Navigation; using Unity.Netcode; -using Unity.Netcode.Components; using Unity.Netcode.Transports.UTP; using UnityEditor; using UnityEditor.SceneManagement; using UnityEngine; +using UnityEngine.AI; using UnityEngine.SceneManagement; namespace Northbound.Prototype.Editor @@ -24,72 +25,81 @@ namespace Northbound.Prototype.Editor public static void Build() { EnsureFolders(); + CleanupObsoletePrototypeAssets(); var palette = CreatePalette(); - GameObject playerPrefab = CreatePlayerPrefab(palette["Player"]); - var enemyPrefabs = new[] + GameObject playerPrefab = CreatePlayerVariant(); + GameObject[] enemyPrefabs = LoadPrefabs(new[] { - CreateEnemyPrefab("Enemy_Grunt", EnemyRole.Grunt, 55f, 8f, 2.4f, palette["Enemy"]), - CreateEnemyPrefab("Enemy_Raider", EnemyRole.Raider, 48f, 7f, 2.9f, palette["Raider"]), - CreateEnemyPrefab("Enemy_Digger", EnemyRole.Digger, 75f, 10f, 2f, palette["Digger"]), - CreateEnemyPrefab("Enemy_Elite", EnemyRole.Elite, 150f, 18f, 1.8f, palette["Elite"]) - }; - GameObject towerPrefab = CreateTowerPrefab(palette["Allied"]); + "Assets/Prefabs/Monster/Monster101.prefab", "Assets/Prefabs/Monster/Monster102.prefab", + "Assets/Prefabs/Monster/Monster103.prefab", "Assets/Prefabs/Monster/Monster104.prefab", + "Assets/Prefabs/Monster/Monster105.prefab" + }); + GameObject towerPrefab = LoadRequired("Assets/Prefabs/Tower/Tower1.prefab"); + GameObject corePrefab = LoadRequired("Assets/Prefabs/Core.prefab"); Scene scene = EditorSceneManager.NewScene(NewSceneSetup.EmptyScene, NewSceneMode.Single); scene.name = "NorthboundGameplayPrototype"; CreateEnvironment(palette); + CreateSpawnPoints(); var networkRoot = new GameObject("Network Runtime"); var manager = networkRoot.AddComponent(); var transport = networkRoot.AddComponent(); + networkRoot.AddComponent(); var launcher = networkRoot.AddComponent(); networkRoot.AddComponent(); manager.NetworkConfig.NetworkTransport = transport; manager.NetworkConfig.PlayerPrefab = playerPrefab; + manager.NetworkConfig.ConnectionApproval = true; var spawnables = new List(enemyPrefabs) { towerPrefab }; ConfigureNetworkPrefabs(manager, playerPrefab, spawnables); launcher.EditorConfigure(playerPrefab, spawnables); - var state = CreateNetworkSceneObject("Game State", Vector3.zero); + CreateNetworkSceneObject("Game State", Vector3.zero); + var timer = CreateNetworkSceneObject("Global Wave Timer", Vector3.zero); + timer.cycleLength = 90f; timer.exceptionalFirstCycleLength = 15f; timer.autoStart = true; var wave = CreateNetworkSceneObject("Wave Manager", Vector3.zero); - var enemyComponents = Array.ConvertAll(enemyPrefabs, item => item.GetComponent()); - wave.EditorConfigure(enemyComponents); + wave.EditorConfigure(timer, enemyPrefabs); - CreateCore(palette["Core"]); + CreateCore(corePrefab); PortalSite[] portals = CreatePortals(palette); var crystals = CreateCrystals(palette["Crystal"]); - CreateDefenseSlots(crystals, towerPrefab.GetComponent(), palette["Slot"]); + CreateDefenseSlots(crystals, towerPrefab, palette["Slot"]); CreateCameraAndHud(launcher, wave); EditorSceneManager.MarkSceneDirty(scene); EditorSceneManager.SaveScene(scene, ScenePath); + BuildNavigation(); + EditorSceneManager.SaveScene(scene, ScenePath); AddToBuildSettings(ScenePath); AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); - Validate(playerPrefab, enemyPrefabs, towerPrefab, portals, crystals); - Debug.Log($"[Northbound Prototype] Built successfully: {ScenePath}"); + Debug.Log($"[Northbound Prototype] Built from reusable project systems: {ScenePath}"); } private static void EnsureFolders() { - Directory.CreateDirectory(Root + "/Scenes"); - Directory.CreateDirectory(Prefabs); - Directory.CreateDirectory(Materials); + Directory.CreateDirectory(Root + "/Scenes"); Directory.CreateDirectory(Prefabs); Directory.CreateDirectory(Materials); AssetDatabase.Refresh(); } + private static void CleanupObsoletePrototypeAssets() + { + string[] obsolete = { "BasicTower.prefab", "Enemy_Grunt.prefab", "Enemy_Raider.prefab", "Enemy_Digger.prefab", "Enemy_Elite.prefab" }; + foreach (string file in obsolete) AssetDatabase.DeleteAsset($"{Prefabs}/{file}"); + string[] obsoleteMaterials = { "Core.mat", "Digger.mat", "Elite.mat", "Enemy.mat", "Player.mat", "Raider.mat", "Ruined.mat" }; + foreach (string file in obsoleteMaterials) AssetDatabase.DeleteAsset($"{Materials}/{file}"); + } + private static Dictionary CreatePalette() { var colors = new Dictionary { ["Ground"] = new(0.08f, 0.11f, 0.14f), ["Road"] = new(0.16f, 0.2f, 0.23f), - ["Wall"] = new(0.08f, 0.3f, 0.34f), ["Player"] = new(0.15f, 0.85f, 1f), - ["Enemy"] = new(0.85f, 0.16f, 0.24f), ["Raider"] = new(1f, 0.42f, 0.12f), - ["Digger"] = new(0.65f, 0.28f, 0.13f), ["Elite"] = new(0.85f, 0.1f, 0.75f), - ["Allied"] = new(0.1f, 0.72f, 1f), ["PortalEnemy"] = new(0.8f, 0.1f, 0.65f), - ["Ruined"] = new(0.25f, 0.25f, 0.28f), ["Core"] = new(0.15f, 0.95f, 0.65f), - ["Crystal"] = new(0.4f, 0.25f, 0.9f), ["Slot"] = new(0.25f, 0.38f, 0.42f) + ["Wall"] = new(0.08f, 0.3f, 0.34f), ["Allied"] = new(0.1f, 0.72f, 1f), + ["PortalEnemy"] = new(0.8f, 0.1f, 0.65f), ["Crystal"] = new(0.4f, 0.25f, 0.9f), + ["Slot"] = new(0.25f, 0.38f, 0.42f) }; var result = new Dictionary(); Shader shader = Shader.Find("Universal Render Pipeline/Lit") ?? Shader.Find("Standard"); @@ -98,78 +108,70 @@ namespace Northbound.Prototype.Editor string path = $"{Materials}/{pair.Key}.mat"; var material = AssetDatabase.LoadAssetAtPath(path); if (material == null) { material = new Material(shader); AssetDatabase.CreateAsset(material, path); } - material.color = pair.Value; - EditorUtility.SetDirty(material); - result[pair.Key] = material; + material.color = pair.Value; EditorUtility.SetDirty(material); result[pair.Key] = material; } return result; } - private static GameObject CreatePlayerPrefab(Material material) + private static GameObject CreatePlayerVariant() { string path = Prefabs + "/Player.prefab"; - var root = new GameObject("Prototype Player"); - root.AddComponent(); - root.AddComponent(); - root.AddComponent(); - root.AddComponent(); - var body = CreatePrimitive("Body", PrimitiveType.Capsule, root.transform, Vector3.zero, new Vector3(0.8f, 0.8f, 0.8f), material, false); - CreatePrimitive("Facing", PrimitiveType.Cube, root.transform, new Vector3(0f, 0.15f, 0.75f), new Vector3(0.25f, 0.25f, 0.75f), material, false); - var prefab = PrefabUtility.SaveAsPrefabAsset(root, path); - UnityEngine.Object.DestroyImmediate(root); + GameObject source = LoadRequired("Assets/Prefabs/Player/Player.prefab"); + AssetDatabase.DeleteAsset(path); + var instance = (GameObject)PrefabUtility.InstantiatePrefab(source); + instance.name = "Prototype Player (Player Variant)"; + var controller = instance.GetComponent(); controller.ConfigurePrototypeMode(); + var attack = instance.GetComponent(); + attack.useFacingArc = true; attack.minimumFacingDot = 0.2f; attack.useAnimationEvents = false; + attack.blockDuringAnimation = false; attack.useEquipment = false; attack.attackAnimationTrigger = string.Empty; + var special = instance.AddComponent(); + var actions = instance.GetComponent(); + actions.actionComponents.Clear(); actions.actionComponents.Add(attack); actions.actionComponents.Add(special); + actions.secondaryActionName = "SpecialAttack"; actions.playAnimations = false; + var interaction = instance.GetComponent(); + interaction.playAnimations = false; interaction.useAnimationEvents = false; interaction.useEquipment = false; + interaction.blockDuringAnimation = false; interaction.showDebugRay = false; + Disable(instance); Disable(instance); + Disable(instance); Disable(instance); + var prefab = PrefabUtility.SaveAsPrefabAsset(instance, path); + UnityEngine.Object.DestroyImmediate(instance); return prefab; } - private static GameObject CreateEnemyPrefab(string name, EnemyRole role, float health, float damage, float speed, Material material) + private static void Disable(GameObject gameObject) where T : Behaviour { - string path = $"{Prefabs}/{name}.prefab"; - var root = new GameObject(name); - root.AddComponent(); - root.AddComponent(); - var collider = root.AddComponent(); collider.height = 1.4f; collider.radius = 0.45f; - var enemy = root.AddComponent(); enemy.EditorConfigure(role, health, damage, speed); - float scale = role == EnemyRole.Elite ? 1.35f : 0.75f; - CreatePrimitive("Body", PrimitiveType.Capsule, root.transform, Vector3.zero, Vector3.one * scale, material, false); - var prefab = PrefabUtility.SaveAsPrefabAsset(root, path); - UnityEngine.Object.DestroyImmediate(root); - return prefab; - } - - private static GameObject CreateTowerPrefab(Material material) - { - string path = Prefabs + "/BasicTower.prefab"; - var root = new GameObject("Basic Tower"); - root.AddComponent(); - root.AddComponent(); - root.AddComponent(); - CreatePrimitive("Base", PrimitiveType.Cylinder, root.transform, Vector3.zero, new Vector3(0.8f, 0.6f, 0.8f), material, false); - CreatePrimitive("Head", PrimitiveType.Cube, root.transform, new Vector3(0f, 1f, 0f), new Vector3(0.55f, 0.35f, 0.8f), material, false); - var prefab = PrefabUtility.SaveAsPrefabAsset(root, path); - UnityEngine.Object.DestroyImmediate(root); - return prefab; + var component = gameObject.GetComponent(); if (component != null) component.enabled = false; } private static void CreateEnvironment(Dictionary palette) { CreatePrimitive("Ground", PrimitiveType.Cube, null, new Vector3(0f, -0.55f, 3f), new Vector3(34f, 1f, 180f), palette["Ground"]); - CreatePrimitive("Northbound Road", PrimitiveType.Cube, null, new Vector3(0f, 0f, 3f), new Vector3(13f, 0.12f, 180f), palette["Road"]); + CreatePrimitive("Northbound Road", PrimitiveType.Cube, null, new Vector3(0f, -0.02f, 3f), new Vector3(13f, 0.08f, 180f), palette["Road"]); CreatePrimitive("West Boundary", PrimitiveType.Cube, null, new Vector3(-17f, 1f, 3f), new Vector3(1f, 3f, 180f), palette["Wall"]); CreatePrimitive("East Boundary", PrimitiveType.Cube, null, new Vector3(17f, 1f, 3f), new Vector3(1f, 3f, 180f), palette["Wall"]); - float[] bandZ = { -62f, -20f, 25f, 70f }; - string[] names = { "본진", "첫 확장", "포탈 전초", "최종 코어" }; - for (int i = 0; i < bandZ.Length; i++) - CreatePrimitive(names[i], PrimitiveType.Cube, null, new Vector3(0f, 0.08f, bandZ[i]), new Vector3(32f, 0.08f, 1f), palette["Wall"]); - + float[] bands = { -62f, -20f, 25f, 70f }; + foreach (float z in bands) CreatePrimitive("Operation Band", PrimitiveType.Cube, null, new Vector3(0f, 0.04f, z), new Vector3(32f, 0.05f, 0.5f), palette["Wall"], false); var lightObject = new GameObject("Directional Light"); var light = lightObject.AddComponent(); light.type = LightType.Directional; light.intensity = 1.3f; lightObject.transform.rotation = Quaternion.Euler(55f, -30f, 0f); } - private static void CreateCore(Material material) + private static void CreateSpawnPoints() { - var core = CreateNetworkSceneObject("South Core", new Vector3(0f, 1.5f, -78f)); - var collider = core.gameObject.AddComponent(); collider.size = new Vector3(5f, 3f, 3f); - CreatePrimitive("Core Visual", PrimitiveType.Cube, core.transform, Vector3.zero, new Vector3(5f, 3f, 3f), material, false); + for (int i = 0; i < 4; i++) + { + var point = new GameObject($"Player Spawn {i + 1}"); + point.transform.position = new Vector3((i - 1.5f) * 2f, 0.1f, -74f); + point.transform.forward = Vector3.forward; + point.AddComponent().spawnIndex = i; + } + } + + private static void CreateCore(GameObject corePrefab) + { + var instance = (GameObject)PrefabUtility.InstantiatePrefab(corePrefab); + instance.name = "South Core (Reused)"; instance.transform.position = new Vector3(0f, 0f, -78f); + var core = instance.GetComponent(); core.maxHealth = 500; core.unlimitedStorage = true; } private static PortalSite[] CreatePortals(Dictionary palette) @@ -179,19 +181,27 @@ namespace Northbound.Prototype.Editor var portals = new PortalSite[z.Length]; for (int i = 0; i < z.Length; i++) { - portals[i] = CreateNetworkSceneObject($"P{i} Portal Site", new Vector3(0f, 0.5f, z[i])); - var trigger = portals[i].gameObject.AddComponent(); - trigger.size = new Vector3(4.5f, 2f, 2.5f); - trigger.isTrigger = true; - var visual = CreatePrimitive("Portal Ring", PrimitiveType.Cylinder, portals[i].transform, Vector3.zero, - new Vector3(2.2f, 0.25f, 2.2f), states[i] == PortalState.Allied ? palette["Allied"] : palette["PortalEnemy"], false); - portals[i].EditorConfigure(i, i == z.Length - 1, states[i], null, null, visual.GetComponent()); + var root = new GameObject($"P{i} Portal Site"); root.transform.position = new Vector3(0f, 0.4f, z[i]); + root.AddComponent(); root.AddComponent(); root.AddComponent(); + portals[i] = root.AddComponent(); + var detection = root.AddComponent(); detection.radius = 2.3f; detection.isTrigger = true; + var southTrigger = root.AddComponent(); southTrigger.center = new Vector3(0f, 0f, -1.35f); southTrigger.size = new Vector3(4.5f, 2f, 0.8f); southTrigger.isTrigger = true; + var northTrigger = root.AddComponent(); northTrigger.center = new Vector3(0f, 0f, 1.35f); northTrigger.size = new Vector3(4.5f, 2f, 0.8f); northTrigger.isTrigger = true; + Transform southArrival = CreateMarker("South Arrival", root.transform, new Vector3(0f, 0.4f, -3f)); + Transform northArrival = CreateMarker("North Arrival", root.transform, new Vector3(0f, 0.4f, 3f)); + var visual = CreatePrimitive("Portal Ring", PrimitiveType.Cylinder, root.transform, Vector3.zero, new Vector3(2.2f, 0.25f, 2.2f), + states[i] == PortalState.Allied ? palette["Allied"] : palette["PortalEnemy"], false); + portals[i].EditorConfigure(i, i == z.Length - 1, states[i], null, null, visual.GetComponent(), southTrigger, northTrigger, southArrival, northArrival); } - for (int i = 0; i < portals.Length; i++) - portals[i].EditorSetNeighbors(i > 0 ? portals[i - 1] : null, i + 1 < portals.Length ? portals[i + 1] : null); + for (int i = 0; i < portals.Length; i++) portals[i].EditorSetNeighbors(i > 0 ? portals[i - 1] : null, i + 1 < portals.Length ? portals[i + 1] : null); return portals; } + private static Transform CreateMarker(string name, Transform parent, Vector3 position) + { + var marker = new GameObject(name); marker.transform.SetParent(parent, false); marker.transform.localPosition = position; return marker.transform; + } + private static PrototypeCrystalOutpost[] CreateCrystals(Material material) { Vector3[] positions = { new(-8f, 0.8f, -43f), new(8f, 0.8f, 2f), new(-8f, 0.8f, 48f) }; @@ -201,87 +211,80 @@ namespace Northbound.Prototype.Editor result[i] = CreateNetworkSceneObject($"Crystal Outpost {i + 1}", positions[i]); var collider = result[i].gameObject.AddComponent(); collider.radius = 1.2f; var visual = CreatePrimitive("Crystal", PrimitiveType.Cube, result[i].transform, Vector3.zero, new Vector3(1.2f, 1.8f, 1.2f), material, false); - visual.transform.rotation = Quaternion.Euler(0f, 45f, 45f); - result[i].EditorConfigure(visual.GetComponent()); + visual.transform.rotation = Quaternion.Euler(0f, 45f, 45f); result[i].EditorConfigure(visual.GetComponent()); } return result; } - private static void CreateDefenseSlots(PrototypeCrystalOutpost[] crystals, PrototypeTower towerPrefab, Material material) + private static void CreateDefenseSlots(PrototypeCrystalOutpost[] crystals, GameObject towerPrefab, Material material) { for (int i = 0; i < crystals.Length; i++) { var visual = CreatePrimitive($"Defense Slot {i + 1}", PrimitiveType.Cylinder, null, crystals[i].transform.position + new Vector3(3.2f, -0.55f, 0f), new Vector3(1.25f, 0.12f, 1.25f), material); - var slot = visual.AddComponent(); - slot.EditorConfigure(crystals[i], towerPrefab); + visual.AddComponent(); + visual.AddComponent().EditorConfigure(crystals[i], towerPrefab); } } private static void CreateCameraAndHud(PrototypeNetworkLauncher launcher, PrototypeWaveManager wave) { - var cameraObject = new GameObject("Main Camera"); - cameraObject.tag = "MainCamera"; + var cameraObject = new GameObject("Main Camera"); cameraObject.tag = "MainCamera"; var camera = cameraObject.AddComponent(); camera.orthographic = true; camera.orthographicSize = 16f; - cameraObject.transform.position = new Vector3(0f, 30f, -62f); - cameraObject.transform.rotation = Quaternion.Euler(90f, 0f, 0f); - cameraObject.AddComponent(); - var hud = cameraObject.AddComponent(); hud.EditorConfigure(launcher, wave); - cameraObject.AddComponent(); + cameraObject.transform.position = new Vector3(0f, 30f, -62f); cameraObject.transform.rotation = Quaternion.Euler(90f, 0f, 0f); + cameraObject.AddComponent().Configure(30f, 6f, 8f); + cameraObject.AddComponent().EditorConfigure(launcher, wave); cameraObject.AddComponent(); + } + + private static void BuildNavigation() + { + var navigation = new GameObject("Navigation (Reused EnemyAI)"); + var surface = navigation.AddComponent(); surface.useGeometry = NavMeshCollectGeometry.PhysicsColliders; + surface.BuildNavMesh(); } private static T CreateNetworkSceneObject(string name, Vector3 position) where T : Component { - var gameObject = new GameObject(name); gameObject.transform.position = position; - gameObject.AddComponent(); - return gameObject.AddComponent(); + var gameObject = new GameObject(name); gameObject.transform.position = position; gameObject.AddComponent(); return gameObject.AddComponent(); } private static GameObject CreatePrimitive(string name, PrimitiveType type, Transform parent, Vector3 position, Vector3 scale, Material material, bool collider = true) { var gameObject = GameObject.CreatePrimitive(type); gameObject.name = name; - if (!collider) - { - var primitiveCollider = gameObject.GetComponent(); - if (primitiveCollider != null) UnityEngine.Object.DestroyImmediate(primitiveCollider); - } - if (parent != null) { gameObject.transform.SetParent(parent, false); gameObject.transform.localPosition = position; } - else gameObject.transform.position = position; - gameObject.transform.localScale = scale; - gameObject.GetComponent().sharedMaterial = material; - return gameObject; + if (!collider) { var primitiveCollider = gameObject.GetComponent(); if (primitiveCollider != null) UnityEngine.Object.DestroyImmediate(primitiveCollider); } + if (parent != null) { gameObject.transform.SetParent(parent, false); gameObject.transform.localPosition = position; } else gameObject.transform.position = position; + gameObject.transform.localScale = scale; gameObject.GetComponent().sharedMaterial = material; return gameObject; + } + + private static T LoadRequired(string path) where T : UnityEngine.Object + { + var asset = AssetDatabase.LoadAssetAtPath(path); if (asset == null) throw new InvalidOperationException($"Required reusable asset is missing: {path}"); return asset; + } + + private static GameObject[] LoadPrefabs(string[] paths) + { + var result = new GameObject[paths.Length]; for (int i = 0; i < paths.Length; i++) result[i] = LoadRequired(paths[i]); return result; } private static void AddToBuildSettings(string path) { var scenes = new List(EditorBuildSettings.scenes); - if (scenes.Exists(item => item.path == path)) return; - scenes.Add(new EditorBuildSettingsScene(path, true)); + if (!scenes.Exists(item => item.path == path)) scenes.Add(new EditorBuildSettingsScene(path, true)); EditorBuildSettings.scenes = scenes.ToArray(); } private static void ConfigureNetworkPrefabs(NetworkManager manager, GameObject player, List spawnables) { var prefabList = AssetDatabase.LoadAssetAtPath(PrefabListPath); - if (prefabList == null) - { - prefabList = ScriptableObject.CreateInstance(); - AssetDatabase.CreateAsset(prefabList, PrefabListPath); - } - var desired = new List { player }; - desired.AddRange(spawnables); - var existing = new List(prefabList.PrefabList); - foreach (var entry in existing) prefabList.Remove(entry); + if (prefabList == null) { prefabList = ScriptableObject.CreateInstance(); AssetDatabase.CreateAsset(prefabList, PrefabListPath); } + var desired = new List { player }; desired.AddRange(spawnables); + foreach (var entry in new List(prefabList.PrefabList)) prefabList.Remove(entry); foreach (var prefab in desired) prefabList.Add(new NetworkPrefab { Override = NetworkPrefabOverride.None, Prefab = prefab }); - - manager.NetworkConfig.Prefabs.NetworkPrefabsLists.Clear(); - manager.NetworkConfig.Prefabs.NetworkPrefabsLists.Add(prefabList); - + manager.NetworkConfig.Prefabs.NetworkPrefabsLists.Clear(); manager.NetworkConfig.Prefabs.NetworkPrefabsLists.Add(prefabList); var defaultList = AssetDatabase.LoadAssetAtPath("Assets/DefaultNetworkPrefabs.asset"); if (defaultList != null) { - foreach (var entry in new List(defaultList.PrefabList)) - if (desired.Contains(entry.Prefab)) defaultList.Remove(entry); + foreach (var entry in new List(defaultList.PrefabList)) if (desired.Contains(entry.Prefab)) defaultList.Remove(entry); EditorUtility.SetDirty(defaultList); } EditorUtility.SetDirty(prefabList); @@ -289,15 +292,13 @@ namespace Northbound.Prototype.Editor private static void Validate(GameObject player, GameObject[] enemies, GameObject tower, PortalSite[] portals, PrototypeCrystalOutpost[] crystals) { - if (player.GetComponent() == null || player.GetComponent() == null) - throw new InvalidOperationException("Player prefab is incomplete."); + if (player.GetComponent() == null || player.GetComponent() == null || player.GetComponent() == null) + throw new InvalidOperationException("Reusable player variant is incomplete."); foreach (var enemy in enemies) - if (enemy.GetComponent() == null || enemy.GetComponent() == null) - throw new InvalidOperationException($"Enemy prefab is incomplete: {enemy.name}"); - if (tower.GetComponent() == null || portals.Length != 4 || crystals.Length != 3) - throw new InvalidOperationException("Prototype scope validation failed."); - for (int i = 0; i < portals.Length; i++) - if (portals[i].SiteIndex != i) throw new InvalidOperationException("Portal chain ordering is invalid."); + if (enemy.GetComponent() == null || enemy.GetComponent() == null || enemy.GetComponent() == null) + throw new InvalidOperationException($"Reusable enemy prefab is incomplete: {enemy.name}"); + if (tower.GetComponent() == null || portals.Length != 4 || crystals.Length != 3 || UnityEngine.Object.FindAnyObjectByType() == null) + throw new InvalidOperationException("Reusable prototype scope validation failed."); } } } diff --git a/Assets/NorthboundPrototype/Generated/Materials/Core.mat b/Assets/NorthboundPrototype/Generated/Materials/Core.mat deleted file mode 100644 index 66f4605..0000000 --- a/Assets/NorthboundPrototype/Generated/Materials/Core.mat +++ /dev/null @@ -1,137 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!114 &-8592509938752659209 -MonoBehaviour: - m_ObjectHideFlags: 11 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Editor::UnityEditor.Rendering.Universal.AssetVersion - version: 10 ---- !u!21 &2100000 -Material: - serializedVersion: 8 - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: Core - m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3} - m_Parent: {fileID: 0} - m_ModifiedSerializedProperties: 0 - m_ValidKeywords: [] - m_InvalidKeywords: [] - m_LightmapFlags: 4 - m_EnableInstancingVariants: 0 - m_DoubleSidedGI: 0 - m_CustomRenderQueue: -1 - stringTagMap: - RenderType: Opaque - disabledShaderPasses: - - MOTIONVECTORS - m_LockedProperties: - m_SavedProperties: - serializedVersion: 3 - m_TexEnvs: - - _BaseMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _BumpMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailAlbedoMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailMask: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailNormalMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _EmissionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MainTex: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MetallicGlossMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _OcclusionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _ParallaxMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _SpecGlossMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - unity_Lightmaps: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - unity_LightmapsInd: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - unity_ShadowMasks: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - m_Ints: [] - m_Floats: - - _AddPrecomputedVelocity: 0 - - _AlphaClip: 0 - - _AlphaToMask: 0 - - _Blend: 0 - - _BlendModePreserveSpecular: 1 - - _BumpScale: 1 - - _ClearCoatMask: 0 - - _ClearCoatSmoothness: 0 - - _Cull: 2 - - _Cutoff: 0.5 - - _DetailAlbedoMapScale: 1 - - _DetailNormalMapScale: 1 - - _DstBlend: 0 - - _DstBlendAlpha: 0 - - _EnvironmentReflections: 1 - - _GlossMapScale: 0 - - _Glossiness: 0 - - _GlossyReflections: 0 - - _Metallic: 0 - - _OcclusionStrength: 1 - - _Parallax: 0.005 - - _QueueOffset: 0 - - _ReceiveShadows: 1 - - _Smoothness: 0.5 - - _SmoothnessTextureChannel: 0 - - _SpecularHighlights: 1 - - _SrcBlend: 1 - - _SrcBlendAlpha: 1 - - _Surface: 0 - - _WorkflowMode: 1 - - _XRMotionVectorsPass: 1 - - _ZWrite: 1 - m_Colors: - - _BaseColor: {r: 0.15, g: 0.95, b: 0.65, a: 1} - - _Color: {r: 0.14999998, g: 0.95, b: 0.65, a: 1} - - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} - - _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1} - m_BuildTextureStacks: [] - m_AllowLocking: 1 diff --git a/Assets/NorthboundPrototype/Generated/Materials/Core.mat.meta b/Assets/NorthboundPrototype/Generated/Materials/Core.mat.meta deleted file mode 100644 index d559368..0000000 --- a/Assets/NorthboundPrototype/Generated/Materials/Core.mat.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: bce46cc4fcdf4964db22a043d147b739 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 2100000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/NorthboundPrototype/Generated/Materials/Digger.mat b/Assets/NorthboundPrototype/Generated/Materials/Digger.mat deleted file mode 100644 index 53dd718..0000000 --- a/Assets/NorthboundPrototype/Generated/Materials/Digger.mat +++ /dev/null @@ -1,137 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!21 &2100000 -Material: - serializedVersion: 8 - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: Digger - m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3} - m_Parent: {fileID: 0} - m_ModifiedSerializedProperties: 0 - m_ValidKeywords: [] - m_InvalidKeywords: [] - m_LightmapFlags: 4 - m_EnableInstancingVariants: 0 - m_DoubleSidedGI: 0 - m_CustomRenderQueue: -1 - stringTagMap: - RenderType: Opaque - disabledShaderPasses: - - MOTIONVECTORS - m_LockedProperties: - m_SavedProperties: - serializedVersion: 3 - m_TexEnvs: - - _BaseMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _BumpMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailAlbedoMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailMask: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailNormalMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _EmissionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MainTex: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MetallicGlossMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _OcclusionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _ParallaxMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _SpecGlossMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - unity_Lightmaps: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - unity_LightmapsInd: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - unity_ShadowMasks: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - m_Ints: [] - m_Floats: - - _AddPrecomputedVelocity: 0 - - _AlphaClip: 0 - - _AlphaToMask: 0 - - _Blend: 0 - - _BlendModePreserveSpecular: 1 - - _BumpScale: 1 - - _ClearCoatMask: 0 - - _ClearCoatSmoothness: 0 - - _Cull: 2 - - _Cutoff: 0.5 - - _DetailAlbedoMapScale: 1 - - _DetailNormalMapScale: 1 - - _DstBlend: 0 - - _DstBlendAlpha: 0 - - _EnvironmentReflections: 1 - - _GlossMapScale: 0 - - _Glossiness: 0 - - _GlossyReflections: 0 - - _Metallic: 0 - - _OcclusionStrength: 1 - - _Parallax: 0.005 - - _QueueOffset: 0 - - _ReceiveShadows: 1 - - _Smoothness: 0.5 - - _SmoothnessTextureChannel: 0 - - _SpecularHighlights: 1 - - _SrcBlend: 1 - - _SrcBlendAlpha: 1 - - _Surface: 0 - - _WorkflowMode: 1 - - _XRMotionVectorsPass: 1 - - _ZWrite: 1 - m_Colors: - - _BaseColor: {r: 0.65, g: 0.28, b: 0.13, a: 1} - - _Color: {r: 0.65, g: 0.27999997, b: 0.12999997, a: 1} - - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} - - _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1} - m_BuildTextureStacks: [] - m_AllowLocking: 1 ---- !u!114 &2428008234010919257 -MonoBehaviour: - m_ObjectHideFlags: 11 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Editor::UnityEditor.Rendering.Universal.AssetVersion - version: 10 diff --git a/Assets/NorthboundPrototype/Generated/Materials/Digger.mat.meta b/Assets/NorthboundPrototype/Generated/Materials/Digger.mat.meta deleted file mode 100644 index aca9091..0000000 --- a/Assets/NorthboundPrototype/Generated/Materials/Digger.mat.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 0a698bf6bb63d87478cac34b0f68c142 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 2100000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/NorthboundPrototype/Generated/Materials/Elite.mat b/Assets/NorthboundPrototype/Generated/Materials/Elite.mat deleted file mode 100644 index ed13cdd..0000000 --- a/Assets/NorthboundPrototype/Generated/Materials/Elite.mat +++ /dev/null @@ -1,137 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!21 &2100000 -Material: - serializedVersion: 8 - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: Elite - m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3} - m_Parent: {fileID: 0} - m_ModifiedSerializedProperties: 0 - m_ValidKeywords: [] - m_InvalidKeywords: [] - m_LightmapFlags: 4 - m_EnableInstancingVariants: 0 - m_DoubleSidedGI: 0 - m_CustomRenderQueue: -1 - stringTagMap: - RenderType: Opaque - disabledShaderPasses: - - MOTIONVECTORS - m_LockedProperties: - m_SavedProperties: - serializedVersion: 3 - m_TexEnvs: - - _BaseMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _BumpMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailAlbedoMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailMask: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailNormalMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _EmissionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MainTex: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MetallicGlossMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _OcclusionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _ParallaxMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _SpecGlossMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - unity_Lightmaps: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - unity_LightmapsInd: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - unity_ShadowMasks: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - m_Ints: [] - m_Floats: - - _AddPrecomputedVelocity: 0 - - _AlphaClip: 0 - - _AlphaToMask: 0 - - _Blend: 0 - - _BlendModePreserveSpecular: 1 - - _BumpScale: 1 - - _ClearCoatMask: 0 - - _ClearCoatSmoothness: 0 - - _Cull: 2 - - _Cutoff: 0.5 - - _DetailAlbedoMapScale: 1 - - _DetailNormalMapScale: 1 - - _DstBlend: 0 - - _DstBlendAlpha: 0 - - _EnvironmentReflections: 1 - - _GlossMapScale: 0 - - _Glossiness: 0 - - _GlossyReflections: 0 - - _Metallic: 0 - - _OcclusionStrength: 1 - - _Parallax: 0.005 - - _QueueOffset: 0 - - _ReceiveShadows: 1 - - _Smoothness: 0.5 - - _SmoothnessTextureChannel: 0 - - _SpecularHighlights: 1 - - _SrcBlend: 1 - - _SrcBlendAlpha: 1 - - _Surface: 0 - - _WorkflowMode: 1 - - _XRMotionVectorsPass: 1 - - _ZWrite: 1 - m_Colors: - - _BaseColor: {r: 0.85, g: 0.1, b: 0.75, a: 1} - - _Color: {r: 0.85, g: 0.09999997, b: 0.75, a: 1} - - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} - - _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1} - m_BuildTextureStacks: [] - m_AllowLocking: 1 ---- !u!114 &2328575930398375868 -MonoBehaviour: - m_ObjectHideFlags: 11 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Editor::UnityEditor.Rendering.Universal.AssetVersion - version: 10 diff --git a/Assets/NorthboundPrototype/Generated/Materials/Elite.mat.meta b/Assets/NorthboundPrototype/Generated/Materials/Elite.mat.meta deleted file mode 100644 index ca4ae88..0000000 --- a/Assets/NorthboundPrototype/Generated/Materials/Elite.mat.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 102393053b60ece44b904614372d6870 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 2100000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/NorthboundPrototype/Generated/Materials/Enemy.mat b/Assets/NorthboundPrototype/Generated/Materials/Enemy.mat deleted file mode 100644 index 25b68d1..0000000 --- a/Assets/NorthboundPrototype/Generated/Materials/Enemy.mat +++ /dev/null @@ -1,137 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!21 &2100000 -Material: - serializedVersion: 8 - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: Enemy - m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3} - m_Parent: {fileID: 0} - m_ModifiedSerializedProperties: 0 - m_ValidKeywords: [] - m_InvalidKeywords: [] - m_LightmapFlags: 4 - m_EnableInstancingVariants: 0 - m_DoubleSidedGI: 0 - m_CustomRenderQueue: -1 - stringTagMap: - RenderType: Opaque - disabledShaderPasses: - - MOTIONVECTORS - m_LockedProperties: - m_SavedProperties: - serializedVersion: 3 - m_TexEnvs: - - _BaseMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _BumpMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailAlbedoMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailMask: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailNormalMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _EmissionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MainTex: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MetallicGlossMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _OcclusionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _ParallaxMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _SpecGlossMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - unity_Lightmaps: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - unity_LightmapsInd: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - unity_ShadowMasks: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - m_Ints: [] - m_Floats: - - _AddPrecomputedVelocity: 0 - - _AlphaClip: 0 - - _AlphaToMask: 0 - - _Blend: 0 - - _BlendModePreserveSpecular: 1 - - _BumpScale: 1 - - _ClearCoatMask: 0 - - _ClearCoatSmoothness: 0 - - _Cull: 2 - - _Cutoff: 0.5 - - _DetailAlbedoMapScale: 1 - - _DetailNormalMapScale: 1 - - _DstBlend: 0 - - _DstBlendAlpha: 0 - - _EnvironmentReflections: 1 - - _GlossMapScale: 0 - - _Glossiness: 0 - - _GlossyReflections: 0 - - _Metallic: 0 - - _OcclusionStrength: 1 - - _Parallax: 0.005 - - _QueueOffset: 0 - - _ReceiveShadows: 1 - - _Smoothness: 0.5 - - _SmoothnessTextureChannel: 0 - - _SpecularHighlights: 1 - - _SrcBlend: 1 - - _SrcBlendAlpha: 1 - - _Surface: 0 - - _WorkflowMode: 1 - - _XRMotionVectorsPass: 1 - - _ZWrite: 1 - m_Colors: - - _BaseColor: {r: 0.85, g: 0.16, b: 0.24, a: 1} - - _Color: {r: 0.85, g: 0.15999997, b: 0.23999995, a: 1} - - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} - - _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1} - m_BuildTextureStacks: [] - m_AllowLocking: 1 ---- !u!114 &6827877772939304228 -MonoBehaviour: - m_ObjectHideFlags: 11 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Editor::UnityEditor.Rendering.Universal.AssetVersion - version: 10 diff --git a/Assets/NorthboundPrototype/Generated/Materials/Enemy.mat.meta b/Assets/NorthboundPrototype/Generated/Materials/Enemy.mat.meta deleted file mode 100644 index 09ad2f0..0000000 --- a/Assets/NorthboundPrototype/Generated/Materials/Enemy.mat.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: a89357393ee87964fa2f7116f9d159de -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 2100000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/NorthboundPrototype/Generated/Materials/Player.mat b/Assets/NorthboundPrototype/Generated/Materials/Player.mat deleted file mode 100644 index 6503c85..0000000 --- a/Assets/NorthboundPrototype/Generated/Materials/Player.mat +++ /dev/null @@ -1,137 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!21 &2100000 -Material: - serializedVersion: 8 - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: Player - m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3} - m_Parent: {fileID: 0} - m_ModifiedSerializedProperties: 0 - m_ValidKeywords: [] - m_InvalidKeywords: [] - m_LightmapFlags: 4 - m_EnableInstancingVariants: 0 - m_DoubleSidedGI: 0 - m_CustomRenderQueue: -1 - stringTagMap: - RenderType: Opaque - disabledShaderPasses: - - MOTIONVECTORS - m_LockedProperties: - m_SavedProperties: - serializedVersion: 3 - m_TexEnvs: - - _BaseMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _BumpMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailAlbedoMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailMask: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailNormalMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _EmissionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MainTex: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MetallicGlossMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _OcclusionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _ParallaxMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _SpecGlossMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - unity_Lightmaps: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - unity_LightmapsInd: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - unity_ShadowMasks: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - m_Ints: [] - m_Floats: - - _AddPrecomputedVelocity: 0 - - _AlphaClip: 0 - - _AlphaToMask: 0 - - _Blend: 0 - - _BlendModePreserveSpecular: 1 - - _BumpScale: 1 - - _ClearCoatMask: 0 - - _ClearCoatSmoothness: 0 - - _Cull: 2 - - _Cutoff: 0.5 - - _DetailAlbedoMapScale: 1 - - _DetailNormalMapScale: 1 - - _DstBlend: 0 - - _DstBlendAlpha: 0 - - _EnvironmentReflections: 1 - - _GlossMapScale: 0 - - _Glossiness: 0 - - _GlossyReflections: 0 - - _Metallic: 0 - - _OcclusionStrength: 1 - - _Parallax: 0.005 - - _QueueOffset: 0 - - _ReceiveShadows: 1 - - _Smoothness: 0.5 - - _SmoothnessTextureChannel: 0 - - _SpecularHighlights: 1 - - _SrcBlend: 1 - - _SrcBlendAlpha: 1 - - _Surface: 0 - - _WorkflowMode: 1 - - _XRMotionVectorsPass: 1 - - _ZWrite: 1 - m_Colors: - - _BaseColor: {r: 0.15, g: 0.85, b: 1, a: 1} - - _Color: {r: 0.14999998, g: 0.85, b: 1, a: 1} - - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} - - _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1} - m_BuildTextureStacks: [] - m_AllowLocking: 1 ---- !u!114 &9142823389044075409 -MonoBehaviour: - m_ObjectHideFlags: 11 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Editor::UnityEditor.Rendering.Universal.AssetVersion - version: 10 diff --git a/Assets/NorthboundPrototype/Generated/Materials/Player.mat.meta b/Assets/NorthboundPrototype/Generated/Materials/Player.mat.meta deleted file mode 100644 index a964da0..0000000 --- a/Assets/NorthboundPrototype/Generated/Materials/Player.mat.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 7731605e2e21ed94fa6f9f66ecad2912 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 2100000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/NorthboundPrototype/Generated/Materials/Raider.mat b/Assets/NorthboundPrototype/Generated/Materials/Raider.mat deleted file mode 100644 index 55881ef..0000000 --- a/Assets/NorthboundPrototype/Generated/Materials/Raider.mat +++ /dev/null @@ -1,137 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!114 &-3609749111221157630 -MonoBehaviour: - m_ObjectHideFlags: 11 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Editor::UnityEditor.Rendering.Universal.AssetVersion - version: 10 ---- !u!21 &2100000 -Material: - serializedVersion: 8 - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: Raider - m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3} - m_Parent: {fileID: 0} - m_ModifiedSerializedProperties: 0 - m_ValidKeywords: [] - m_InvalidKeywords: [] - m_LightmapFlags: 4 - m_EnableInstancingVariants: 0 - m_DoubleSidedGI: 0 - m_CustomRenderQueue: -1 - stringTagMap: - RenderType: Opaque - disabledShaderPasses: - - MOTIONVECTORS - m_LockedProperties: - m_SavedProperties: - serializedVersion: 3 - m_TexEnvs: - - _BaseMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _BumpMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailAlbedoMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailMask: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailNormalMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _EmissionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MainTex: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MetallicGlossMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _OcclusionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _ParallaxMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _SpecGlossMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - unity_Lightmaps: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - unity_LightmapsInd: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - unity_ShadowMasks: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - m_Ints: [] - m_Floats: - - _AddPrecomputedVelocity: 0 - - _AlphaClip: 0 - - _AlphaToMask: 0 - - _Blend: 0 - - _BlendModePreserveSpecular: 1 - - _BumpScale: 1 - - _ClearCoatMask: 0 - - _ClearCoatSmoothness: 0 - - _Cull: 2 - - _Cutoff: 0.5 - - _DetailAlbedoMapScale: 1 - - _DetailNormalMapScale: 1 - - _DstBlend: 0 - - _DstBlendAlpha: 0 - - _EnvironmentReflections: 1 - - _GlossMapScale: 0 - - _Glossiness: 0 - - _GlossyReflections: 0 - - _Metallic: 0 - - _OcclusionStrength: 1 - - _Parallax: 0.005 - - _QueueOffset: 0 - - _ReceiveShadows: 1 - - _Smoothness: 0.5 - - _SmoothnessTextureChannel: 0 - - _SpecularHighlights: 1 - - _SrcBlend: 1 - - _SrcBlendAlpha: 1 - - _Surface: 0 - - _WorkflowMode: 1 - - _XRMotionVectorsPass: 1 - - _ZWrite: 1 - m_Colors: - - _BaseColor: {r: 1, g: 0.42, b: 0.12, a: 1} - - _Color: {r: 1, g: 0.41999996, b: 0.11999995, a: 1} - - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} - - _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1} - m_BuildTextureStacks: [] - m_AllowLocking: 1 diff --git a/Assets/NorthboundPrototype/Generated/Materials/Raider.mat.meta b/Assets/NorthboundPrototype/Generated/Materials/Raider.mat.meta deleted file mode 100644 index aa3c8e1..0000000 --- a/Assets/NorthboundPrototype/Generated/Materials/Raider.mat.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 5ea9b08c6c96a5841858a20ccc70924a -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 2100000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/NorthboundPrototype/Generated/Materials/Ruined.mat b/Assets/NorthboundPrototype/Generated/Materials/Ruined.mat deleted file mode 100644 index d6b8648..0000000 --- a/Assets/NorthboundPrototype/Generated/Materials/Ruined.mat +++ /dev/null @@ -1,137 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!21 &2100000 -Material: - serializedVersion: 8 - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: Ruined - m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3} - m_Parent: {fileID: 0} - m_ModifiedSerializedProperties: 0 - m_ValidKeywords: [] - m_InvalidKeywords: [] - m_LightmapFlags: 4 - m_EnableInstancingVariants: 0 - m_DoubleSidedGI: 0 - m_CustomRenderQueue: -1 - stringTagMap: - RenderType: Opaque - disabledShaderPasses: - - MOTIONVECTORS - m_LockedProperties: - m_SavedProperties: - serializedVersion: 3 - m_TexEnvs: - - _BaseMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _BumpMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailAlbedoMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailMask: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailNormalMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _EmissionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MainTex: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MetallicGlossMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _OcclusionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _ParallaxMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _SpecGlossMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - unity_Lightmaps: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - unity_LightmapsInd: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - unity_ShadowMasks: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - m_Ints: [] - m_Floats: - - _AddPrecomputedVelocity: 0 - - _AlphaClip: 0 - - _AlphaToMask: 0 - - _Blend: 0 - - _BlendModePreserveSpecular: 1 - - _BumpScale: 1 - - _ClearCoatMask: 0 - - _ClearCoatSmoothness: 0 - - _Cull: 2 - - _Cutoff: 0.5 - - _DetailAlbedoMapScale: 1 - - _DetailNormalMapScale: 1 - - _DstBlend: 0 - - _DstBlendAlpha: 0 - - _EnvironmentReflections: 1 - - _GlossMapScale: 0 - - _Glossiness: 0 - - _GlossyReflections: 0 - - _Metallic: 0 - - _OcclusionStrength: 1 - - _Parallax: 0.005 - - _QueueOffset: 0 - - _ReceiveShadows: 1 - - _Smoothness: 0.5 - - _SmoothnessTextureChannel: 0 - - _SpecularHighlights: 1 - - _SrcBlend: 1 - - _SrcBlendAlpha: 1 - - _Surface: 0 - - _WorkflowMode: 1 - - _XRMotionVectorsPass: 1 - - _ZWrite: 1 - m_Colors: - - _BaseColor: {r: 0.25, g: 0.25, b: 0.28, a: 1} - - _Color: {r: 0.24999997, g: 0.24999997, b: 0.27999997, a: 1} - - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} - - _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1} - m_BuildTextureStacks: [] - m_AllowLocking: 1 ---- !u!114 &3866783289780477995 -MonoBehaviour: - m_ObjectHideFlags: 11 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Editor::UnityEditor.Rendering.Universal.AssetVersion - version: 10 diff --git a/Assets/NorthboundPrototype/Generated/Materials/Ruined.mat.meta b/Assets/NorthboundPrototype/Generated/Materials/Ruined.mat.meta deleted file mode 100644 index 45c2442..0000000 --- a/Assets/NorthboundPrototype/Generated/Materials/Ruined.mat.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 92f8ac4e67debf8479c82def6f3836b4 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 2100000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/NorthboundPrototype/Generated/Prefabs/BasicTower.prefab b/Assets/NorthboundPrototype/Generated/Prefabs/BasicTower.prefab deleted file mode 100644 index bc8c6b5..0000000 --- a/Assets/NorthboundPrototype/Generated/Prefabs/BasicTower.prefab +++ /dev/null @@ -1,306 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &768884422563280646 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1075458732215366247} - - component: {fileID: 1096513232555807006} - - component: {fileID: 6801956297213770839} - m_Layer: 0 - m_Name: Head - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1075458732215366247 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 768884422563280646} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 1, z: 0} - m_LocalScale: {x: 0.55, y: 0.35, z: 0.8} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 3624323390632565247} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!33 &1096513232555807006 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 768884422563280646} - m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} ---- !u!23 &6801956297213770839 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 768884422563280646} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RayTracingAccelStructBuildFlagsOverride: 0 - m_RayTracingAccelStructBuildFlags: 1 - m_SmallMeshCulling: 1 - m_ForceMeshLod: -1 - m_MeshLodSelectionBias: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: 71c34f710814318499d2d5e7cea2a646, type: 2} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 1 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_GlobalIlluminationMeshLod: 0 - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_MaskInteraction: 0 - m_AdditionalVertexStreams: {fileID: 0} ---- !u!1 &1298522748923679250 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 3624323390632565247} - - component: {fileID: 7046449473698420447} - - component: {fileID: 4350502199133332513} - - component: {fileID: 1516902282747798504} - m_Layer: 0 - m_Name: BasicTower - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &3624323390632565247 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1298522748923679250} - 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: - - {fileID: 7944159800952945334} - - {fileID: 1075458732215366247} - m_Father: {fileID: 0} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &7046449473698420447 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1298522748923679250} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.NetworkObject - GlobalObjectIdHash: 0 - InScenePlacedSourceGlobalObjectIdHash: 0 - DeferredDespawnTick: 0 - Ownership: 1 - AlwaysReplicateAsRoot: 0 - SynchronizeTransform: 1 - m_InScenePlaced: 0 - ActiveSceneSynchronization: 0 - SceneMigrationSynchronization: 1 - SpawnWithObservers: 1 - DontDestroyWithOwner: 0 - AutoObjectParentSync: 1 - SyncOwnerTransformWhenParented: 1 - AllowOwnerToParent: 0 ---- !u!114 &4350502199133332513 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1298522748923679250} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: e96cb6065543e43c4a752faaa1468eb1, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.Components.NetworkTransform - ShowTopMostFoldoutHeaderGroup: 1 - NetworkTransformExpanded: 0 - AutoOwnerAuthorityTickOffset: 1 - PositionInterpolationType: 0 - RotationInterpolationType: 0 - ScaleInterpolationType: 0 - PositionLerpSmoothing: 1 - PositionMaxInterpolationTime: 0.1 - RotationLerpSmoothing: 1 - RotationMaxInterpolationTime: 0.1 - ScaleLerpSmoothing: 1 - ScaleMaxInterpolationTime: 0.1 - AuthorityMode: 0 - TickSyncChildren: 0 - UseUnreliableDeltas: 0 - SyncPositionX: 1 - SyncPositionY: 1 - SyncPositionZ: 1 - SyncRotAngleX: 1 - SyncRotAngleY: 1 - SyncRotAngleZ: 1 - SyncScaleX: 1 - SyncScaleY: 1 - SyncScaleZ: 1 - PositionThreshold: 0.001 - RotAngleThreshold: 0.01 - ScaleThreshold: 0.01 - UseQuaternionSynchronization: 0 - UseQuaternionCompression: 0 - UseHalfFloatPrecision: 0 - InLocalSpace: 0 - SwitchTransformSpaceWhenParented: 0 - Interpolate: 1 - SlerpPosition: 0 ---- !u!114 &1516902282747798504 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1298522748923679250} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4f17758c8b6cecf4d8246570583e22dd, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::Northbound.Prototype.PrototypeTower - ShowTopMostFoldoutHeaderGroup: 1 - range: 7 - damage: 10 - interval: 1.1 ---- !u!1 &2145807653229648836 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 7944159800952945334} - - component: {fileID: 1790276681686249612} - - component: {fileID: 693834352212102242} - m_Layer: 0 - m_Name: Base - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &7944159800952945334 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2145807653229648836} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0.8, y: 0.6, z: 0.8} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 3624323390632565247} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!33 &1790276681686249612 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2145807653229648836} - m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0} ---- !u!23 &693834352212102242 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2145807653229648836} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RayTracingAccelStructBuildFlagsOverride: 0 - m_RayTracingAccelStructBuildFlags: 1 - m_SmallMeshCulling: 1 - m_ForceMeshLod: -1 - m_MeshLodSelectionBias: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: 71c34f710814318499d2d5e7cea2a646, type: 2} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 1 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_GlobalIlluminationMeshLod: 0 - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_MaskInteraction: 0 - m_AdditionalVertexStreams: {fileID: 0} diff --git a/Assets/NorthboundPrototype/Generated/Prefabs/BasicTower.prefab.meta b/Assets/NorthboundPrototype/Generated/Prefabs/BasicTower.prefab.meta deleted file mode 100644 index 4a72300..0000000 --- a/Assets/NorthboundPrototype/Generated/Prefabs/BasicTower.prefab.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: ff6c084700aabbc489c6c0e56506cf06 -PrefabImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/NorthboundPrototype/Generated/Prefabs/Enemy_Digger.prefab b/Assets/NorthboundPrototype/Generated/Prefabs/Enemy_Digger.prefab deleted file mode 100644 index 20c0e5f..0000000 --- a/Assets/NorthboundPrototype/Generated/Prefabs/Enemy_Digger.prefab +++ /dev/null @@ -1,242 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &546703575891773344 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 4298135991364965670} - - component: {fileID: 6071643205634787452} - - component: {fileID: 1239652695402831595} - - component: {fileID: 4047942926649971892} - - component: {fileID: 2742339966002404743} - m_Layer: 0 - m_Name: Enemy_Digger - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &4298135991364965670 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 546703575891773344} - 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: - - {fileID: 4919206663897003855} - m_Father: {fileID: 0} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &6071643205634787452 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 546703575891773344} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.NetworkObject - GlobalObjectIdHash: 0 - InScenePlacedSourceGlobalObjectIdHash: 0 - DeferredDespawnTick: 0 - Ownership: 1 - AlwaysReplicateAsRoot: 0 - SynchronizeTransform: 1 - m_InScenePlaced: 0 - ActiveSceneSynchronization: 0 - SceneMigrationSynchronization: 1 - SpawnWithObservers: 1 - DontDestroyWithOwner: 0 - AutoObjectParentSync: 1 - SyncOwnerTransformWhenParented: 1 - AllowOwnerToParent: 0 ---- !u!114 &1239652695402831595 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 546703575891773344} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: e96cb6065543e43c4a752faaa1468eb1, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.Components.NetworkTransform - ShowTopMostFoldoutHeaderGroup: 1 - NetworkTransformExpanded: 0 - AutoOwnerAuthorityTickOffset: 1 - PositionInterpolationType: 0 - RotationInterpolationType: 0 - ScaleInterpolationType: 0 - PositionLerpSmoothing: 1 - PositionMaxInterpolationTime: 0.1 - RotationLerpSmoothing: 1 - RotationMaxInterpolationTime: 0.1 - ScaleLerpSmoothing: 1 - ScaleMaxInterpolationTime: 0.1 - AuthorityMode: 0 - TickSyncChildren: 0 - UseUnreliableDeltas: 0 - SyncPositionX: 1 - SyncPositionY: 1 - SyncPositionZ: 1 - SyncRotAngleX: 1 - SyncRotAngleY: 1 - SyncRotAngleZ: 1 - SyncScaleX: 1 - SyncScaleY: 1 - SyncScaleZ: 1 - PositionThreshold: 0.001 - RotAngleThreshold: 0.01 - ScaleThreshold: 0.01 - UseQuaternionSynchronization: 0 - UseQuaternionCompression: 0 - UseHalfFloatPrecision: 0 - InLocalSpace: 0 - SwitchTransformSpaceWhenParented: 0 - Interpolate: 1 - SlerpPosition: 0 ---- !u!136 &4047942926649971892 -CapsuleCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 546703575891773344} - m_Material: {fileID: 0} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_LayerOverridePriority: 0 - m_IsTrigger: 0 - m_ProvidesContacts: 0 - m_Enabled: 1 - serializedVersion: 2 - m_Radius: 0.45 - m_Height: 1.4 - m_Direction: 1 - m_Center: {x: 0, y: 0, z: 0} ---- !u!114 &2742339966002404743 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 546703575891773344} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 9a43da78fc3aae144a68b43728a90ca5, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::Northbound.Prototype.PrototypeEnemy - ShowTopMostFoldoutHeaderGroup: 1 - role: 2 - baseHealth: 75 - baseDamage: 10 - moveSpeed: 2 - attackRange: 1.7 - attackInterval: 1.2 ---- !u!1 &3992247528101023445 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 4919206663897003855} - - component: {fileID: 6900977511851920752} - - component: {fileID: 865596204157637417} - m_Layer: 0 - m_Name: Body - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &4919206663897003855 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3992247528101023445} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0.75, y: 0.75, z: 0.75} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 4298135991364965670} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!33 &6900977511851920752 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3992247528101023445} - m_Mesh: {fileID: 10208, guid: 0000000000000000e000000000000000, type: 0} ---- !u!23 &865596204157637417 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3992247528101023445} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RayTracingAccelStructBuildFlagsOverride: 0 - m_RayTracingAccelStructBuildFlags: 1 - m_SmallMeshCulling: 1 - m_ForceMeshLod: -1 - m_MeshLodSelectionBias: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: 0a698bf6bb63d87478cac34b0f68c142, type: 2} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 1 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_GlobalIlluminationMeshLod: 0 - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_MaskInteraction: 0 - m_AdditionalVertexStreams: {fileID: 0} diff --git a/Assets/NorthboundPrototype/Generated/Prefabs/Enemy_Digger.prefab.meta b/Assets/NorthboundPrototype/Generated/Prefabs/Enemy_Digger.prefab.meta deleted file mode 100644 index 0626f84..0000000 --- a/Assets/NorthboundPrototype/Generated/Prefabs/Enemy_Digger.prefab.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 6283a318d09055c4f87992c5c47ea18f -PrefabImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/NorthboundPrototype/Generated/Prefabs/Enemy_Elite.prefab b/Assets/NorthboundPrototype/Generated/Prefabs/Enemy_Elite.prefab deleted file mode 100644 index 9bdedeb..0000000 --- a/Assets/NorthboundPrototype/Generated/Prefabs/Enemy_Elite.prefab +++ /dev/null @@ -1,242 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &1795128131771378134 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 3679712303891192401} - - component: {fileID: 8768589662197385903} - - component: {fileID: 5251907241342160272} - m_Layer: 0 - m_Name: Body - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &3679712303891192401 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1795128131771378134} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1.35, y: 1.35, z: 1.35} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 8103940472562161808} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!33 &8768589662197385903 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1795128131771378134} - m_Mesh: {fileID: 10208, guid: 0000000000000000e000000000000000, type: 0} ---- !u!23 &5251907241342160272 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1795128131771378134} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RayTracingAccelStructBuildFlagsOverride: 0 - m_RayTracingAccelStructBuildFlags: 1 - m_SmallMeshCulling: 1 - m_ForceMeshLod: -1 - m_MeshLodSelectionBias: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: 102393053b60ece44b904614372d6870, type: 2} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 1 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_GlobalIlluminationMeshLod: 0 - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_MaskInteraction: 0 - m_AdditionalVertexStreams: {fileID: 0} ---- !u!1 &3287245990848439041 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 8103940472562161808} - - component: {fileID: 259792593174859173} - - component: {fileID: 7534842398197684391} - - component: {fileID: 3697779272654266178} - - component: {fileID: 5023017987581908238} - m_Layer: 0 - m_Name: Enemy_Elite - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &8103940472562161808 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3287245990848439041} - 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: - - {fileID: 3679712303891192401} - m_Father: {fileID: 0} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &259792593174859173 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3287245990848439041} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.NetworkObject - GlobalObjectIdHash: 0 - InScenePlacedSourceGlobalObjectIdHash: 0 - DeferredDespawnTick: 0 - Ownership: 1 - AlwaysReplicateAsRoot: 0 - SynchronizeTransform: 1 - m_InScenePlaced: 0 - ActiveSceneSynchronization: 0 - SceneMigrationSynchronization: 1 - SpawnWithObservers: 1 - DontDestroyWithOwner: 0 - AutoObjectParentSync: 1 - SyncOwnerTransformWhenParented: 1 - AllowOwnerToParent: 0 ---- !u!114 &7534842398197684391 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3287245990848439041} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: e96cb6065543e43c4a752faaa1468eb1, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.Components.NetworkTransform - ShowTopMostFoldoutHeaderGroup: 1 - NetworkTransformExpanded: 0 - AutoOwnerAuthorityTickOffset: 1 - PositionInterpolationType: 0 - RotationInterpolationType: 0 - ScaleInterpolationType: 0 - PositionLerpSmoothing: 1 - PositionMaxInterpolationTime: 0.1 - RotationLerpSmoothing: 1 - RotationMaxInterpolationTime: 0.1 - ScaleLerpSmoothing: 1 - ScaleMaxInterpolationTime: 0.1 - AuthorityMode: 0 - TickSyncChildren: 0 - UseUnreliableDeltas: 0 - SyncPositionX: 1 - SyncPositionY: 1 - SyncPositionZ: 1 - SyncRotAngleX: 1 - SyncRotAngleY: 1 - SyncRotAngleZ: 1 - SyncScaleX: 1 - SyncScaleY: 1 - SyncScaleZ: 1 - PositionThreshold: 0.001 - RotAngleThreshold: 0.01 - ScaleThreshold: 0.01 - UseQuaternionSynchronization: 0 - UseQuaternionCompression: 0 - UseHalfFloatPrecision: 0 - InLocalSpace: 0 - SwitchTransformSpaceWhenParented: 0 - Interpolate: 1 - SlerpPosition: 0 ---- !u!136 &3697779272654266178 -CapsuleCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3287245990848439041} - m_Material: {fileID: 0} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_LayerOverridePriority: 0 - m_IsTrigger: 0 - m_ProvidesContacts: 0 - m_Enabled: 1 - serializedVersion: 2 - m_Radius: 0.45 - m_Height: 1.4 - m_Direction: 1 - m_Center: {x: 0, y: 0, z: 0} ---- !u!114 &5023017987581908238 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3287245990848439041} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 9a43da78fc3aae144a68b43728a90ca5, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::Northbound.Prototype.PrototypeEnemy - ShowTopMostFoldoutHeaderGroup: 1 - role: 3 - baseHealth: 150 - baseDamage: 18 - moveSpeed: 1.8 - attackRange: 1.7 - attackInterval: 1.2 diff --git a/Assets/NorthboundPrototype/Generated/Prefabs/Enemy_Elite.prefab.meta b/Assets/NorthboundPrototype/Generated/Prefabs/Enemy_Elite.prefab.meta deleted file mode 100644 index b01b89c..0000000 --- a/Assets/NorthboundPrototype/Generated/Prefabs/Enemy_Elite.prefab.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 9d32d65f4d76dcb4ebd0debe3c504625 -PrefabImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/NorthboundPrototype/Generated/Prefabs/Enemy_Grunt.prefab b/Assets/NorthboundPrototype/Generated/Prefabs/Enemy_Grunt.prefab deleted file mode 100644 index a3ca26d..0000000 --- a/Assets/NorthboundPrototype/Generated/Prefabs/Enemy_Grunt.prefab +++ /dev/null @@ -1,242 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &1975996375694978275 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 3435552826784425708} - - component: {fileID: 951565621441737621} - - component: {fileID: 6711740459413015917} - m_Layer: 0 - m_Name: Body - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &3435552826784425708 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1975996375694978275} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0.75, y: 0.75, z: 0.75} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 310875575452679582} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!33 &951565621441737621 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1975996375694978275} - m_Mesh: {fileID: 10208, guid: 0000000000000000e000000000000000, type: 0} ---- !u!23 &6711740459413015917 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1975996375694978275} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RayTracingAccelStructBuildFlagsOverride: 0 - m_RayTracingAccelStructBuildFlags: 1 - m_SmallMeshCulling: 1 - m_ForceMeshLod: -1 - m_MeshLodSelectionBias: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: a89357393ee87964fa2f7116f9d159de, type: 2} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 1 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_GlobalIlluminationMeshLod: 0 - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_MaskInteraction: 0 - m_AdditionalVertexStreams: {fileID: 0} ---- !u!1 &4493379191484186568 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 310875575452679582} - - component: {fileID: 4003507315934272567} - - component: {fileID: 4231877088810639438} - - component: {fileID: 4533994881265421980} - - component: {fileID: 7545991508697308226} - m_Layer: 0 - m_Name: Enemy_Grunt - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &310875575452679582 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4493379191484186568} - 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: - - {fileID: 3435552826784425708} - m_Father: {fileID: 0} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &4003507315934272567 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4493379191484186568} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.NetworkObject - GlobalObjectIdHash: 0 - InScenePlacedSourceGlobalObjectIdHash: 0 - DeferredDespawnTick: 0 - Ownership: 1 - AlwaysReplicateAsRoot: 0 - SynchronizeTransform: 1 - m_InScenePlaced: 0 - ActiveSceneSynchronization: 0 - SceneMigrationSynchronization: 1 - SpawnWithObservers: 1 - DontDestroyWithOwner: 0 - AutoObjectParentSync: 1 - SyncOwnerTransformWhenParented: 1 - AllowOwnerToParent: 0 ---- !u!114 &4231877088810639438 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4493379191484186568} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: e96cb6065543e43c4a752faaa1468eb1, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.Components.NetworkTransform - ShowTopMostFoldoutHeaderGroup: 1 - NetworkTransformExpanded: 0 - AutoOwnerAuthorityTickOffset: 1 - PositionInterpolationType: 0 - RotationInterpolationType: 0 - ScaleInterpolationType: 0 - PositionLerpSmoothing: 1 - PositionMaxInterpolationTime: 0.1 - RotationLerpSmoothing: 1 - RotationMaxInterpolationTime: 0.1 - ScaleLerpSmoothing: 1 - ScaleMaxInterpolationTime: 0.1 - AuthorityMode: 0 - TickSyncChildren: 0 - UseUnreliableDeltas: 0 - SyncPositionX: 1 - SyncPositionY: 1 - SyncPositionZ: 1 - SyncRotAngleX: 1 - SyncRotAngleY: 1 - SyncRotAngleZ: 1 - SyncScaleX: 1 - SyncScaleY: 1 - SyncScaleZ: 1 - PositionThreshold: 0.001 - RotAngleThreshold: 0.01 - ScaleThreshold: 0.01 - UseQuaternionSynchronization: 0 - UseQuaternionCompression: 0 - UseHalfFloatPrecision: 0 - InLocalSpace: 0 - SwitchTransformSpaceWhenParented: 0 - Interpolate: 1 - SlerpPosition: 0 ---- !u!136 &4533994881265421980 -CapsuleCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4493379191484186568} - m_Material: {fileID: 0} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_LayerOverridePriority: 0 - m_IsTrigger: 0 - m_ProvidesContacts: 0 - m_Enabled: 1 - serializedVersion: 2 - m_Radius: 0.45 - m_Height: 1.4 - m_Direction: 1 - m_Center: {x: 0, y: 0, z: 0} ---- !u!114 &7545991508697308226 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4493379191484186568} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 9a43da78fc3aae144a68b43728a90ca5, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::Northbound.Prototype.PrototypeEnemy - ShowTopMostFoldoutHeaderGroup: 1 - role: 0 - baseHealth: 55 - baseDamage: 8 - moveSpeed: 2.4 - attackRange: 1.7 - attackInterval: 1.2 diff --git a/Assets/NorthboundPrototype/Generated/Prefabs/Enemy_Grunt.prefab.meta b/Assets/NorthboundPrototype/Generated/Prefabs/Enemy_Grunt.prefab.meta deleted file mode 100644 index 8fa49f7..0000000 --- a/Assets/NorthboundPrototype/Generated/Prefabs/Enemy_Grunt.prefab.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 6a48fd333dbaeba41a27f5c3ad884627 -PrefabImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/NorthboundPrototype/Generated/Prefabs/Enemy_Raider.prefab b/Assets/NorthboundPrototype/Generated/Prefabs/Enemy_Raider.prefab deleted file mode 100644 index 34a25aa..0000000 --- a/Assets/NorthboundPrototype/Generated/Prefabs/Enemy_Raider.prefab +++ /dev/null @@ -1,242 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &1976415545473119508 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 7926858731802272204} - - component: {fileID: 6577323741198816241} - - component: {fileID: 5685526065556658820} - - component: {fileID: 4275190733162635858} - - component: {fileID: 6015820101618283219} - m_Layer: 0 - m_Name: Enemy_Raider - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &7926858731802272204 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1976415545473119508} - 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: - - {fileID: 5501974571960031690} - m_Father: {fileID: 0} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &6577323741198816241 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1976415545473119508} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.NetworkObject - GlobalObjectIdHash: 0 - InScenePlacedSourceGlobalObjectIdHash: 0 - DeferredDespawnTick: 0 - Ownership: 1 - AlwaysReplicateAsRoot: 0 - SynchronizeTransform: 1 - m_InScenePlaced: 0 - ActiveSceneSynchronization: 0 - SceneMigrationSynchronization: 1 - SpawnWithObservers: 1 - DontDestroyWithOwner: 0 - AutoObjectParentSync: 1 - SyncOwnerTransformWhenParented: 1 - AllowOwnerToParent: 0 ---- !u!114 &5685526065556658820 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1976415545473119508} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: e96cb6065543e43c4a752faaa1468eb1, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.Components.NetworkTransform - ShowTopMostFoldoutHeaderGroup: 1 - NetworkTransformExpanded: 0 - AutoOwnerAuthorityTickOffset: 1 - PositionInterpolationType: 0 - RotationInterpolationType: 0 - ScaleInterpolationType: 0 - PositionLerpSmoothing: 1 - PositionMaxInterpolationTime: 0.1 - RotationLerpSmoothing: 1 - RotationMaxInterpolationTime: 0.1 - ScaleLerpSmoothing: 1 - ScaleMaxInterpolationTime: 0.1 - AuthorityMode: 0 - TickSyncChildren: 0 - UseUnreliableDeltas: 0 - SyncPositionX: 1 - SyncPositionY: 1 - SyncPositionZ: 1 - SyncRotAngleX: 1 - SyncRotAngleY: 1 - SyncRotAngleZ: 1 - SyncScaleX: 1 - SyncScaleY: 1 - SyncScaleZ: 1 - PositionThreshold: 0.001 - RotAngleThreshold: 0.01 - ScaleThreshold: 0.01 - UseQuaternionSynchronization: 0 - UseQuaternionCompression: 0 - UseHalfFloatPrecision: 0 - InLocalSpace: 0 - SwitchTransformSpaceWhenParented: 0 - Interpolate: 1 - SlerpPosition: 0 ---- !u!136 &4275190733162635858 -CapsuleCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1976415545473119508} - m_Material: {fileID: 0} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_LayerOverridePriority: 0 - m_IsTrigger: 0 - m_ProvidesContacts: 0 - m_Enabled: 1 - serializedVersion: 2 - m_Radius: 0.45 - m_Height: 1.4 - m_Direction: 1 - m_Center: {x: 0, y: 0, z: 0} ---- !u!114 &6015820101618283219 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1976415545473119508} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 9a43da78fc3aae144a68b43728a90ca5, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::Northbound.Prototype.PrototypeEnemy - ShowTopMostFoldoutHeaderGroup: 1 - role: 1 - baseHealth: 48 - baseDamage: 7 - moveSpeed: 2.9 - attackRange: 1.7 - attackInterval: 1.2 ---- !u!1 &4786693246207265736 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 5501974571960031690} - - component: {fileID: 6352401606136868636} - - component: {fileID: 3399186486778199231} - m_Layer: 0 - m_Name: Body - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &5501974571960031690 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4786693246207265736} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0.75, y: 0.75, z: 0.75} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 7926858731802272204} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!33 &6352401606136868636 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4786693246207265736} - m_Mesh: {fileID: 10208, guid: 0000000000000000e000000000000000, type: 0} ---- !u!23 &3399186486778199231 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4786693246207265736} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RayTracingAccelStructBuildFlagsOverride: 0 - m_RayTracingAccelStructBuildFlags: 1 - m_SmallMeshCulling: 1 - m_ForceMeshLod: -1 - m_MeshLodSelectionBias: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: 5ea9b08c6c96a5841858a20ccc70924a, type: 2} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 1 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_GlobalIlluminationMeshLod: 0 - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_MaskInteraction: 0 - m_AdditionalVertexStreams: {fileID: 0} diff --git a/Assets/NorthboundPrototype/Generated/Prefabs/Enemy_Raider.prefab.meta b/Assets/NorthboundPrototype/Generated/Prefabs/Enemy_Raider.prefab.meta deleted file mode 100644 index 6ebf3a5..0000000 --- a/Assets/NorthboundPrototype/Generated/Prefabs/Enemy_Raider.prefab.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 2f53defa3aa7c474994f1e59a903be4f -PrefabImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/NorthboundPrototype/Generated/Prefabs/Player.prefab b/Assets/NorthboundPrototype/Generated/Prefabs/Player.prefab index 7ae5f97..ed5e7a2 100644 --- a/Assets/NorthboundPrototype/Generated/Prefabs/Player.prefab +++ b/Assets/NorthboundPrototype/Generated/Prefabs/Player.prefab @@ -1,337 +1,174 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: ---- !u!1 &1469678369176762886 -GameObject: +--- !u!1001 &3319709612200465506 +PrefabInstance: m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 516432810655764773} - - component: {fileID: 855754173299961746} - - component: {fileID: 2883844877114008318} - m_Layer: 0 - m_Name: Body - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &516432810655764773 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1469678369176762886} serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0.8, y: 0.8, z: 0.8} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 6373439727280873961} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!33 &855754173299961746 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1469678369176762886} - m_Mesh: {fileID: 10208, guid: 0000000000000000e000000000000000, type: 0} ---- !u!23 &2883844877114008318 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1469678369176762886} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RayTracingAccelStructBuildFlagsOverride: 0 - m_RayTracingAccelStructBuildFlags: 1 - m_SmallMeshCulling: 1 - m_ForceMeshLod: -1 - m_MeshLodSelectionBias: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: 7731605e2e21ed94fa6f9f66ecad2912, type: 2} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 1 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_GlobalIlluminationMeshLod: 0 - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_MaskInteraction: 0 - m_AdditionalVertexStreams: {fileID: 0} ---- !u!1 &3305664295896478561 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 1314983689436087486, guid: 6c700f44a7d74e141a002e9484d2057c, type: 3} + propertyPath: m_Name + value: Player + objectReference: {fileID: 0} + - target: {fileID: 1883169379180791275, guid: 6c700f44a7d74e141a002e9484d2057c, type: 3} + propertyPath: m_Enabled + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2148255267416253297, guid: 6c700f44a7d74e141a002e9484d2057c, type: 3} + propertyPath: m_Enabled + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2443072964133329520, guid: 6c700f44a7d74e141a002e9484d2057c, type: 3} + propertyPath: m_Enabled + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3792365921352178844, guid: 6c700f44a7d74e141a002e9484d2057c, type: 3} + propertyPath: respawnDelay + value: 3 + objectReference: {fileID: 0} + - target: {fileID: 3792365921352178844, guid: 6c700f44a7d74e141a002e9484d2057c, type: 3} + propertyPath: dropResourcesOnDeath + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3792365921352178844, guid: 6c700f44a7d74e141a002e9484d2057c, type: 3} + propertyPath: blockMovementDuringAttack + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5217638038410020423, guid: 6c700f44a7d74e141a002e9484d2057c, type: 3} + propertyPath: playAnimations + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5217638038410020423, guid: 6c700f44a7d74e141a002e9484d2057c, type: 3} + propertyPath: secondaryActionName + value: SpecialAttack + objectReference: {fileID: 0} + - target: {fileID: 5217638038410020423, guid: 6c700f44a7d74e141a002e9484d2057c, type: 3} + propertyPath: actionComponents.Array.size + value: 2 + objectReference: {fileID: 0} + - target: {fileID: 5217638038410020423, guid: 6c700f44a7d74e141a002e9484d2057c, type: 3} + propertyPath: 'actionComponents.Array.data[1]' + value: + objectReference: {fileID: 1026917702892562607} + - target: {fileID: 5887522270574905679, guid: 6c700f44a7d74e141a002e9484d2057c, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5887522270574905679, guid: 6c700f44a7d74e141a002e9484d2057c, type: 3} + propertyPath: m_LocalPosition.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 5887522270574905679, guid: 6c700f44a7d74e141a002e9484d2057c, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5887522270574905679, guid: 6c700f44a7d74e141a002e9484d2057c, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 5887522270574905679, guid: 6c700f44a7d74e141a002e9484d2057c, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5887522270574905679, guid: 6c700f44a7d74e141a002e9484d2057c, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5887522270574905679, guid: 6c700f44a7d74e141a002e9484d2057c, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5887522270574905679, guid: 6c700f44a7d74e141a002e9484d2057c, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5887522270574905679, guid: 6c700f44a7d74e141a002e9484d2057c, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5887522270574905679, guid: 6c700f44a7d74e141a002e9484d2057c, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8704851935123448388, guid: 6c700f44a7d74e141a002e9484d2057c, type: 3} + propertyPath: m_Enabled + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8729870597719024730, guid: 6c700f44a7d74e141a002e9484d2057c, type: 3} + propertyPath: showDebugRay + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8729870597719024730, guid: 6c700f44a7d74e141a002e9484d2057c, type: 3} + propertyPath: useEquipment + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8729870597719024730, guid: 6c700f44a7d74e141a002e9484d2057c, type: 3} + propertyPath: playAnimations + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8729870597719024730, guid: 6c700f44a7d74e141a002e9484d2057c, type: 3} + propertyPath: useAnimationEvents + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8729870597719024730, guid: 6c700f44a7d74e141a002e9484d2057c, type: 3} + propertyPath: blockDuringAnimation + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 9062880697264624749, guid: 6c700f44a7d74e141a002e9484d2057c, type: 3} + propertyPath: useEquipment + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 9062880697264624749, guid: 6c700f44a7d74e141a002e9484d2057c, type: 3} + propertyPath: useFacingArc + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 9062880697264624749, guid: 6c700f44a7d74e141a002e9484d2057c, type: 3} + propertyPath: minimumFacingDot + value: 0.2 + objectReference: {fileID: 0} + - target: {fileID: 9062880697264624749, guid: 6c700f44a7d74e141a002e9484d2057c, type: 3} + propertyPath: useAnimationEvents + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 9062880697264624749, guid: 6c700f44a7d74e141a002e9484d2057c, type: 3} + propertyPath: blockDuringAnimation + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 9062880697264624749, guid: 6c700f44a7d74e141a002e9484d2057c, type: 3} + propertyPath: attackAnimationTrigger + value: + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: + - targetCorrespondingSourceObject: {fileID: 1314983689436087486, guid: 6c700f44a7d74e141a002e9484d2057c, type: 3} + insertIndex: -1 + addedObject: {fileID: 1026917702892562607} + m_SourcePrefab: {fileID: 100100000, guid: 6c700f44a7d74e141a002e9484d2057c, type: 3} +--- !u!1 &4336466159322648796 stripped GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 1314983689436087486, guid: 6c700f44a7d74e141a002e9484d2057c, type: 3} + m_PrefabInstance: {fileID: 3319709612200465506} m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 6373439727280873961} - - component: {fileID: 5772597820739981499} - - component: {fileID: 7554966871982303628} - - component: {fileID: 2733417887935013464} - - component: {fileID: 1510805080327023404} - m_Layer: 0 - m_Name: Player - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &6373439727280873961 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3305664295896478561} - 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: - - {fileID: 516432810655764773} - - {fileID: 5595214951552948994} - m_Father: {fileID: 0} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &5772597820739981499 +--- !u!114 &1026917702892562607 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3305664295896478561} + m_GameObject: {fileID: 4336466159322648796} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} + m_Script: {fileID: 11500000, guid: c645a5457e4901d4199afde290b51961, type: 3} m_Name: - m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.NetworkObject - GlobalObjectIdHash: 0 - InScenePlacedSourceGlobalObjectIdHash: 0 - DeferredDespawnTick: 0 - Ownership: 1 - AlwaysReplicateAsRoot: 0 - SynchronizeTransform: 1 - m_InScenePlaced: 0 - ActiveSceneSynchronization: 0 - SceneMigrationSynchronization: 1 - SpawnWithObservers: 1 - DontDestroyWithOwner: 0 - AutoObjectParentSync: 1 - SyncOwnerTransformWhenParented: 1 - AllowOwnerToParent: 0 ---- !u!114 &7554966871982303628 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3305664295896478561} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: e96cb6065543e43c4a752faaa1468eb1, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.Components.NetworkTransform + m_EditorClassIdentifier: Assembly-CSharp::Northbound.Prototype.PrototypeSpecialAttack ShowTopMostFoldoutHeaderGroup: 1 - NetworkTransformExpanded: 0 - AutoOwnerAuthorityTickOffset: 1 - PositionInterpolationType: 0 - RotationInterpolationType: 0 - ScaleInterpolationType: 0 - PositionLerpSmoothing: 1 - PositionMaxInterpolationTime: 0.1 - RotationLerpSmoothing: 1 - RotationMaxInterpolationTime: 0.1 - ScaleLerpSmoothing: 1 - ScaleMaxInterpolationTime: 0.1 - AuthorityMode: 0 - TickSyncChildren: 0 - UseUnreliableDeltas: 0 - SyncPositionX: 1 - SyncPositionY: 1 - SyncPositionZ: 1 - SyncRotAngleX: 1 - SyncRotAngleY: 1 - SyncRotAngleZ: 1 - SyncScaleX: 1 - SyncScaleY: 1 - SyncScaleZ: 1 - PositionThreshold: 0.001 - RotAngleThreshold: 0.01 - ScaleThreshold: 0.01 - UseQuaternionSynchronization: 0 - UseQuaternionCompression: 0 - UseHalfFloatPrecision: 0 - InLocalSpace: 0 - SwitchTransformSpaceWhenParented: 0 - Interpolate: 1 - SlerpPosition: 0 ---- !u!136 &2733417887935013464 -CapsuleCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3305664295896478561} - m_Material: {fileID: 0} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_LayerOverridePriority: 0 - m_IsTrigger: 0 - m_ProvidesContacts: 0 - m_Enabled: 1 - serializedVersion: 2 - m_Radius: 0.5 - m_Height: 1 - m_Direction: 1 - m_Center: {x: 0, y: 0, z: 0} ---- !u!114 &1510805080327023404 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3305664295896478561} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 47e38d0512a8abd4c83eda8608e3ef9f, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::Northbound.Prototype.PrototypePlayer - ShowTopMostFoldoutHeaderGroup: 1 - moveSpeed: 8 - xBounds: {x: -15, y: 15} - zBounds: {x: -82, y: 88} - maxHealth: 100 - normalDamage: 24 - normalRange: 3.2 - specialDamage: 58 - specialRange: 6 - specialManaCost: 25 - specialCooldown: 4 ---- !u!1 &7287052643425163852 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 5595214951552948994} - - component: {fileID: 7960450478991797233} - - component: {fileID: 3507218640918885721} - m_Layer: 0 - m_Name: Facing - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &5595214951552948994 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7287052643425163852} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0.15, z: 0.75} - m_LocalScale: {x: 0.25, y: 0.25, z: 0.75} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 6373439727280873961} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!33 &7960450478991797233 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7287052643425163852} - m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} ---- !u!23 &3507218640918885721 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7287052643425163852} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RayTracingAccelStructBuildFlagsOverride: 0 - m_RayTracingAccelStructBuildFlags: 1 - m_SmallMeshCulling: 1 - m_ForceMeshLod: -1 - m_MeshLodSelectionBias: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: 7731605e2e21ed94fa6f9f66ecad2912, type: 2} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 1 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_GlobalIlluminationMeshLod: 0 - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_MaskInteraction: 0 - m_AdditionalVertexStreams: {fileID: 0} + cooldown: 4 + manaCost: 25 + range: 6 + radius: 3.5 + damageMultiplier: 3 + minimumFacingDot: 0.05 diff --git a/Assets/NorthboundPrototype/Generated/PrototypeNetworkPrefabs.asset b/Assets/NorthboundPrototype/Generated/PrototypeNetworkPrefabs.asset index 16c7c27..91ca5f5 100644 --- a/Assets/NorthboundPrototype/Generated/PrototypeNetworkPrefabs.asset +++ b/Assets/NorthboundPrototype/Generated/PrototypeNetworkPrefabs.asset @@ -15,32 +15,37 @@ MonoBehaviour: IsDefault: 0 List: - Override: 0 - Prefab: {fileID: 3305664295896478561, guid: 2a0bac19258f9514691bd9aff479dfea, type: 3} + Prefab: {fileID: 4336466159322648796, guid: 2a0bac19258f9514691bd9aff479dfea, type: 3} SourcePrefabToOverride: {fileID: 0} SourceHashToOverride: 0 OverridingTargetPrefab: {fileID: 0} - Override: 0 - Prefab: {fileID: 4493379191484186568, guid: 6a48fd333dbaeba41a27f5c3ad884627, type: 3} + Prefab: {fileID: 7146441246397375875, guid: eccdace7a7b21a446891da5739b1549f, type: 3} SourcePrefabToOverride: {fileID: 0} SourceHashToOverride: 0 OverridingTargetPrefab: {fileID: 0} - Override: 0 - Prefab: {fileID: 1976415545473119508, guid: 2f53defa3aa7c474994f1e59a903be4f, type: 3} + Prefab: {fileID: 9065146123892903723, guid: 4ee9b364dfe9d0949a23374e660d3e13, type: 3} SourcePrefabToOverride: {fileID: 0} SourceHashToOverride: 0 OverridingTargetPrefab: {fileID: 0} - Override: 0 - Prefab: {fileID: 546703575891773344, guid: 6283a318d09055c4f87992c5c47ea18f, type: 3} + Prefab: {fileID: 2347008446492047424, guid: 9cac250ebe8d420469bd4da3ab8cfd86, type: 3} SourcePrefabToOverride: {fileID: 0} SourceHashToOverride: 0 OverridingTargetPrefab: {fileID: 0} - Override: 0 - Prefab: {fileID: 3287245990848439041, guid: 9d32d65f4d76dcb4ebd0debe3c504625, type: 3} + Prefab: {fileID: 4973514444862586119, guid: ff2924ffa397a8e44925625790831d25, type: 3} SourcePrefabToOverride: {fileID: 0} SourceHashToOverride: 0 OverridingTargetPrefab: {fileID: 0} - Override: 0 - Prefab: {fileID: 1298522748923679250, guid: ff6c084700aabbc489c6c0e56506cf06, type: 3} + Prefab: {fileID: 5710477988932221578, guid: e8d09b814275ad745a427433c28dd53f, type: 3} + SourcePrefabToOverride: {fileID: 0} + SourceHashToOverride: 0 + OverridingTargetPrefab: {fileID: 0} + - Override: 0 + Prefab: {fileID: 8512676738329978770, guid: 3f7838db2c2fc424d9bd9a0d243b43be, type: 3} SourcePrefabToOverride: {fileID: 0} SourceHashToOverride: 0 OverridingTargetPrefab: {fileID: 0} diff --git a/Assets/NorthboundPrototype/Scenes/NorthboundGameplayPrototype.unity b/Assets/NorthboundPrototype/Scenes/NorthboundGameplayPrototype.unity index eebf80b..65998d8 100644 Binary files a/Assets/NorthboundPrototype/Scenes/NorthboundGameplayPrototype.unity and b/Assets/NorthboundPrototype/Scenes/NorthboundGameplayPrototype.unity differ diff --git a/Assets/NorthboundPrototype/Scripts/PortalSite.cs b/Assets/NorthboundPrototype/Scripts/PortalSite.cs index 18e2399..f29b51a 100644 --- a/Assets/NorthboundPrototype/Scripts/PortalSite.cs +++ b/Assets/NorthboundPrototype/Scripts/PortalSite.cs @@ -4,104 +4,114 @@ using UnityEngine; namespace Northbound.Prototype { - [RequireComponent(typeof(NetworkObject))] - public sealed class PortalSite : NetworkBehaviour, IPrototypeDamageable + [RequireComponent(typeof(NetworkObject), typeof(EnemyPortal), typeof(TeamGate))] + public sealed class PortalSite : NetworkBehaviour, IInteractable { public static readonly List All = new(); - [SerializeField] private int siteIndex; [SerializeField] private bool finalPortal; [SerializeField] private PortalState initialState = PortalState.Enemy; [SerializeField] private PortalSite southNeighbor; [SerializeField] private PortalSite northNeighbor; - [SerializeField] private float maxHealth = 260f; [SerializeField] private float rebuildCost = 60f; [SerializeField] private Renderer stateRenderer; + [SerializeField] private BoxCollider southEntry; + [SerializeField] private BoxCollider northEntry; + [SerializeField] private Transform southArrival; + [SerializeField] private Transform northArrival; public readonly NetworkVariable State = new(); - public readonly NetworkVariable Health = new(); - private readonly Dictionary teleportCooldown = new(); - + private EnemyPortal portal; + private TeamGate gate; public int SiteIndex => siteIndex; public bool IsFinal => finalPortal; - public bool IsAlive => State.Value != PortalState.Ruined && Health.Value > 0f; public Vector3 Position => transform.position; - private void OnEnable() => All.Add(this); + private void Awake() { portal = GetComponent(); gate = GetComponent(); } + private void OnEnable() { if (!All.Contains(this)) All.Add(this); } private void OnDisable() => All.Remove(this); public override void OnNetworkSpawn() { State.OnValueChanged += OnStateChanged; + portal.OnPortalDestroyed += OnDestroyed; if (IsServer) { State.Value = initialState; - Health.Value = initialState == PortalState.Ruined ? 0f : maxHealth; + if (initialState == PortalState.Ruined) portal.SetDormant(); + else portal.RestorePortal(initialState == PortalState.Allied ? TeamType.Player : TeamType.Hostile); } - RefreshVisual(); + RefreshVisualAndGate(); } - public override void OnNetworkDespawn() => State.OnValueChanged -= OnStateChanged; - private void OnStateChanged(PortalState previous, PortalState current) => RefreshVisual(); - - private void RefreshVisual() + public override void OnNetworkDespawn() { - if (stateRenderer == null) return; - stateRenderer.material.color = State.Value switch - { - PortalState.Enemy => new Color(0.8f, 0.1f, 0.65f), - PortalState.Allied => new Color(0.1f, 0.75f, 1f), - _ => new Color(0.25f, 0.25f, 0.28f) - }; + State.OnValueChanged -= OnStateChanged; + portal.OnPortalDestroyed -= OnDestroyed; } - public void TakeDamage(float amount, bool fromEnemy) + private void OnDestroyed(ulong attackerId) { - if (!IsServer || !IsAlive) return; - if (fromEnemy != (State.Value == PortalState.Allied)) return; - Health.Value = Mathf.Max(0f, Health.Value - amount); - if (Health.Value > 0f) return; - - if (State.Value == PortalState.Enemy && finalPortal) - PrototypeGameState.Instance.SetPhase(PrototypeGamePhase.Victory); + if (!IsServer) return; + bool won = State.Value == PortalState.Enemy && finalPortal; State.Value = PortalState.Ruined; + portal.SetDormant(); + if (won) PrototypeGameState.Instance.SetPhase(PrototypeGamePhase.Victory); + RefreshAllGates(); } - public static void TryInteractNearest(PrototypePlayer player) + private void OnStateChanged(PortalState previous, PortalState current) { RefreshVisualAndGate(); RefreshAllGates(); } + private static void RefreshAllGates() { foreach (var site in All) if (site != null) site.RefreshVisualAndGate(); } + + private void RefreshVisualAndGate() { - PortalSite nearest = null; - float best = 3.2f; - foreach (var portal in All) + if (stateRenderer != null) + stateRenderer.material.color = State.Value switch + { + PortalState.Enemy => new Color(0.8f, 0.1f, 0.65f), + PortalState.Allied => new Color(0.1f, 0.75f, 1f), + _ => new Color(0.25f, 0.25f, 0.28f) + }; + bool allied = State.Value == PortalState.Allied; + bool canSouth = allied && southNeighbor != null && southNeighbor.State.Value == PortalState.Allied; + bool canNorth = allied && northNeighbor != null && northNeighbor.State.Value == PortalState.Allied; + if (southEntry != null) southEntry.enabled = canNorth; + if (northEntry != null) northEntry.enabled = canSouth; + if (gate != null) { - float distance = Vector3.Distance(player.Position, portal.Position); - if (distance < best) { best = distance; nearest = portal; } + gate.enabled = canSouth || canNorth; + gate.frontTrigger = southEntry; gate.backTrigger = northEntry; + gate.frontExitPoint = canNorth ? northNeighbor.northArrival : northArrival; + gate.backExitPoint = canSouth ? southNeighbor.southArrival : southArrival; } - if (nearest == null || nearest.State.Value != PortalState.Ruined) return; - if (!PrototypeGameState.Instance.TrySpend(nearest.rebuildCost)) return; - nearest.State.Value = PortalState.Allied; - nearest.Health.Value = nearest.maxHealth; } - private void OnTriggerEnter(Collider other) + public bool CanInteract(ulong playerId) => State.Value == PortalState.Ruined && PrototypeGameState.Instance != null && + PrototypeGameState.Instance.SharedMana.Value >= rebuildCost; + public void Interact(ulong playerId) { if (CanInteract(playerId)) RebuildRpc(); } + [Rpc(SendTo.Server, InvokePermission = RpcInvokePermission.Everyone)] + private void RebuildRpc() { - if (!IsServer || State.Value != PortalState.Allied) return; - var player = other.GetComponentInParent(); - if (player == null || teleportCooldown.TryGetValue(player.OwnerClientId, out float until) && Time.time < until) return; - - Vector3 localVelocityDirection = player.LastMoveDirection.z >= 0f ? Vector3.forward : Vector3.back; - PortalSite target = localVelocityDirection.z > 0f ? northNeighbor : southNeighbor; - if (target == null || target.State.Value != PortalState.Allied) return; - - teleportCooldown[player.OwnerClientId] = Time.time + 1f; - target.teleportCooldown[player.OwnerClientId] = Time.time + 1f; - player.transform.position = target.transform.position + localVelocityDirection * 2.8f + Vector3.up * 0.8f; + if (State.Value != PortalState.Ruined || !PrototypeGameState.Instance.TrySpend(rebuildCost)) return; + portal.RestorePortal(TeamType.Player); + State.Value = PortalState.Allied; } + public string GetInteractionPrompt() => State.Value == PortalState.Ruined ? $"[E] 포탈 재건 ({rebuildCost:0} 마나)" : string.Empty; + public string GetInteractionAnimation() => string.Empty; + public EquipmentData GetEquipmentData() => null; + public Transform GetTransform() => transform; #if UNITY_EDITOR - public void EditorConfigure(int index, bool isFinal, PortalState state, PortalSite south, PortalSite north, Renderer renderer) + public void EditorConfigure(int index, bool isFinal, PortalState state, PortalSite south, PortalSite north, Renderer renderer, + BoxCollider southTrigger, BoxCollider northTrigger, Transform southExit, Transform northExit) { - siteIndex = index; finalPortal = isFinal; initialState = state; - southNeighbor = south; northNeighbor = north; stateRenderer = renderer; + siteIndex = index; finalPortal = isFinal; initialState = state; southNeighbor = south; northNeighbor = north; + stateRenderer = renderer; southEntry = southTrigger; northEntry = northTrigger; southArrival = southExit; northArrival = northExit; + portal = GetComponent(); gate = GetComponent(); + portal.ConfigureLifecycle(false, false); + gate.allowedTeam = TeamType.Player; gate.allowAllTeams = false; + gate.frontTrigger = southTrigger; gate.backTrigger = northTrigger; + gate.frontExitPoint = northExit; gate.backExitPoint = southExit; } public void EditorSetNeighbors(PortalSite south, PortalSite north) { southNeighbor = south; northNeighbor = north; } #endif diff --git a/Assets/NorthboundPrototype/Scripts/PrototypeCameraRig.cs b/Assets/NorthboundPrototype/Scripts/PrototypeCameraRig.cs deleted file mode 100644 index 92a9718..0000000 --- a/Assets/NorthboundPrototype/Scripts/PrototypeCameraRig.cs +++ /dev/null @@ -1,19 +0,0 @@ -using UnityEngine; - -namespace Northbound.Prototype -{ - public sealed class PrototypeCameraRig : MonoBehaviour - { - [SerializeField] private float forwardOffset = 6f; - [SerializeField] private Vector2 zLimits = new(-68f, 75f); - private void LateUpdate() - { - PrototypePlayer local = null; - foreach (var player in PrototypePlayer.All) - if (player != null && player.IsOwner) { local = player; break; } - if (local == null) return; - float z = Mathf.Clamp(local.transform.position.z + forwardOffset, zLimits.x, zLimits.y); - transform.position = new Vector3(0f, transform.position.y, z - 0.01f); - } - } -} diff --git a/Assets/NorthboundPrototype/Scripts/PrototypeCameraRig.cs.meta b/Assets/NorthboundPrototype/Scripts/PrototypeCameraRig.cs.meta deleted file mode 100644 index bf5ec01..0000000 --- a/Assets/NorthboundPrototype/Scripts/PrototypeCameraRig.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: aadf8f3e54a5c63428969e2d8151f4a6 \ No newline at end of file diff --git a/Assets/NorthboundPrototype/Scripts/PrototypeCore.cs b/Assets/NorthboundPrototype/Scripts/PrototypeCore.cs deleted file mode 100644 index 1c5471b..0000000 --- a/Assets/NorthboundPrototype/Scripts/PrototypeCore.cs +++ /dev/null @@ -1,23 +0,0 @@ -using Unity.Netcode; -using UnityEngine; - -namespace Northbound.Prototype -{ - [RequireComponent(typeof(NetworkObject))] - public sealed class PrototypeCore : NetworkBehaviour, IPrototypeDamageable - { - public static PrototypeCore Instance { get; private set; } - [SerializeField] private float maxHealth = 500f; - public readonly NetworkVariable Health = new(); - public bool IsAlive => Health.Value > 0f; - public Vector3 Position => transform.position; - private void Awake() => Instance = this; - public override void OnNetworkSpawn() { if (IsServer) Health.Value = maxHealth; } - public void TakeDamage(float amount, bool fromEnemy) - { - if (!IsServer || !fromEnemy || !IsAlive) return; - Health.Value = Mathf.Max(0f, Health.Value - amount); - if (Health.Value <= 0f) PrototypeGameState.Instance.SetPhase(PrototypeGamePhase.Defeat); - } - } -} diff --git a/Assets/NorthboundPrototype/Scripts/PrototypeCore.cs.meta b/Assets/NorthboundPrototype/Scripts/PrototypeCore.cs.meta deleted file mode 100644 index 471970d..0000000 --- a/Assets/NorthboundPrototype/Scripts/PrototypeCore.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: b33daae417e65af48a958114a2390cf8 \ No newline at end of file diff --git a/Assets/NorthboundPrototype/Scripts/PrototypeCrystalOutpost.cs b/Assets/NorthboundPrototype/Scripts/PrototypeCrystalOutpost.cs index 4ddec04..3817b94 100644 --- a/Assets/NorthboundPrototype/Scripts/PrototypeCrystalOutpost.cs +++ b/Assets/NorthboundPrototype/Scripts/PrototypeCrystalOutpost.cs @@ -5,47 +5,64 @@ using UnityEngine; namespace Northbound.Prototype { [RequireComponent(typeof(NetworkObject))] - public sealed class PrototypeCrystalOutpost : NetworkBehaviour, IPrototypeDamageable + public sealed class PrototypeCrystalOutpost : NetworkBehaviour, IDamageable, ITeamMember, IHealthProvider, IInteractable { public static readonly List All = new(); - [SerializeField] private float maxHealth = 180f; + [SerializeField] private int maxHealth = 180; [SerializeField] private float manaPerSecond = 0.75f; [SerializeField] private Renderer stateRenderer; public readonly NetworkVariable IsCaptured = new(); - public readonly NetworkVariable Health = new(); + private readonly NetworkVariable health = new(); + private readonly NetworkVariable team = new(TeamType.Neutral); public float ManaPerSecond => manaPerSecond; - bool IPrototypeDamageable.IsAlive => IsAlive; - public bool IsAlive => IsCaptured.Value && Health.Value > 0f; + public bool IsAlive => IsCaptured.Value && health.Value > 0; public Vector3 Position => transform.position; + private void OnEnable() { if (!All.Contains(this)) All.Add(this); } private void OnDisable() => All.Remove(this); public override void OnNetworkSpawn() { - IsCaptured.OnValueChanged += (_, _) => Refresh(); - if (IsServer) { IsCaptured.Value = false; Health.Value = maxHealth; } + IsCaptured.OnValueChanged += OnCapturedChanged; + if (IsServer) { IsCaptured.Value = false; health.Value = maxHealth; team.Value = TeamType.Neutral; } Refresh(); } + public override void OnNetworkDespawn() => IsCaptured.OnValueChanged -= OnCapturedChanged; + private void OnCapturedChanged(bool previous, bool current) => Refresh(); private void Refresh() { if (stateRenderer != null) stateRenderer.material.color = IsCaptured.Value ? new Color(0.2f, 0.8f, 1f) : new Color(0.45f, 0.3f, 0.65f); } - public static void TryInteractNearest(PrototypePlayer player) + + public bool CanInteract(ulong playerId) { - PrototypeCrystalOutpost nearest = null; float best = 3f; - foreach (var crystal in All) - { - float distance = Vector3.Distance(player.Position, crystal.Position); - if (distance < best) { best = distance; nearest = crystal; } - } - if (nearest == null || nearest.IsCaptured.Value) return; - foreach (var enemy in PrototypeEnemy.All) - if (Vector3.Distance(enemy.Position, nearest.Position) < 6f) return; - nearest.IsCaptured.Value = true; - nearest.Health.Value = nearest.maxHealth; + if (IsCaptured.Value) return false; + foreach (var enemy in FindObjectsByType()) + if (!enemy.IsDead() && Vector3.Distance(enemy.transform.position, transform.position) < 6f) return false; + return true; } - public void TakeDamage(float amount, bool fromEnemy) + public void Interact(ulong playerId) { if (CanInteract(playerId)) CaptureRpc(); } + [Rpc(SendTo.Server, InvokePermission = RpcInvokePermission.Everyone)] + private void CaptureRpc() { - if (!IsServer || !fromEnemy || !IsAlive) return; - Health.Value = Mathf.Max(0f, Health.Value - amount); - if (Health.Value <= 0f) IsCaptured.Value = false; + if (IsCaptured.Value) return; + foreach (var enemy in FindObjectsByType()) + if (!enemy.IsDead() && Vector3.Distance(enemy.transform.position, transform.position) < 6f) return; + IsCaptured.Value = true; health.Value = maxHealth; team.Value = TeamType.Player; } + + public void TakeDamage(int damage, ulong attackerId) + { + if (!IsServer || !IsAlive) return; + health.Value = Mathf.Max(0, health.Value - damage); + if (health.Value <= 0) { IsCaptured.Value = false; team.Value = TeamType.Neutral; } + } + public bool IsDead() => !IsAlive; + public TeamType GetTeam() => team.Value; + public void SetTeam(TeamType value) { if (IsServer) team.Value = value; } + public int GetCurrentHealth() => health.Value; + public int GetMaxHealth() => maxHealth; + public float GetHealthPercentage() => maxHealth > 0 ? (float)health.Value / maxHealth : 0f; + public string GetInteractionPrompt() => IsCaptured.Value ? string.Empty : "[E] 크리스탈 거점 확보"; + public string GetInteractionAnimation() => string.Empty; + public EquipmentData GetEquipmentData() => null; + public Transform GetTransform() => transform; #if UNITY_EDITOR public void EditorConfigure(Renderer renderer) => stateRenderer = renderer; #endif diff --git a/Assets/NorthboundPrototype/Scripts/PrototypeDefenseSlot.cs b/Assets/NorthboundPrototype/Scripts/PrototypeDefenseSlot.cs index 46c0a5d..554aa75 100644 --- a/Assets/NorthboundPrototype/Scripts/PrototypeDefenseSlot.cs +++ b/Assets/NorthboundPrototype/Scripts/PrototypeDefenseSlot.cs @@ -1,32 +1,37 @@ using System.Collections.Generic; +using Unity.Netcode; using UnityEngine; namespace Northbound.Prototype { - public sealed class PrototypeDefenseSlot : MonoBehaviour + [RequireComponent(typeof(NetworkObject))] + public sealed class PrototypeDefenseSlot : NetworkBehaviour, IInteractable { public static readonly List All = new(); [SerializeField] private PrototypeCrystalOutpost requiredOutpost; - [SerializeField] private PrototypeTower towerPrefab; + [SerializeField] private GameObject towerPrefab; [SerializeField] private float buildCost = 45f; - private PrototypeTower builtTower; + public readonly NetworkVariable IsBuilt = new(); private void OnEnable() { if (!All.Contains(this)) All.Add(this); } private void OnDisable() => All.Remove(this); - public static void TryInteractNearest(PrototypePlayer player) + public bool CanInteract(ulong playerId) => !IsBuilt.Value && requiredOutpost != null && requiredOutpost.IsCaptured.Value && + PrototypeGameState.Instance != null && PrototypeGameState.Instance.SharedMana.Value >= buildCost; + public void Interact(ulong playerId) { if (CanInteract(playerId)) BuildRpc(); } + [Rpc(SendTo.Server, InvokePermission = RpcInvokePermission.Everyone)] + private void BuildRpc() { - PrototypeDefenseSlot nearest = null; float best = 2.5f; - foreach (var slot in All) - { - float distance = Vector3.Distance(player.Position, slot.transform.position); - if (distance < best) { best = distance; nearest = slot; } - } - if (nearest == null || nearest.builtTower != null || nearest.requiredOutpost == null || !nearest.requiredOutpost.IsCaptured.Value) return; - if (!PrototypeGameState.Instance.TrySpend(nearest.buildCost)) return; - nearest.builtTower = Instantiate(nearest.towerPrefab, nearest.transform.position + Vector3.up * 0.7f, Quaternion.identity); - nearest.builtTower.NetworkObject.Spawn(); + if (IsBuilt.Value || requiredOutpost == null || !requiredOutpost.IsCaptured.Value || + !PrototypeGameState.Instance.TrySpend(buildCost)) return; + GameObject tower = Instantiate(towerPrefab, transform.position + Vector3.up * 0.7f, Quaternion.identity); + tower.GetComponent().Spawn(); + IsBuilt.Value = true; } + public string GetInteractionPrompt() => CanInteract(0) ? $"[E] 기본 타워 건설 ({buildCost:0} 마나)" : string.Empty; + public string GetInteractionAnimation() => string.Empty; + public EquipmentData GetEquipmentData() => null; + public Transform GetTransform() => transform; #if UNITY_EDITOR - public void EditorConfigure(PrototypeCrystalOutpost outpost, PrototypeTower prefab) { requiredOutpost = outpost; towerPrefab = prefab; } + public void EditorConfigure(PrototypeCrystalOutpost outpost, GameObject prefab) { requiredOutpost = outpost; towerPrefab = prefab; } #endif } } diff --git a/Assets/NorthboundPrototype/Scripts/PrototypeEnemy.cs b/Assets/NorthboundPrototype/Scripts/PrototypeEnemy.cs deleted file mode 100644 index 4d742e1..0000000 --- a/Assets/NorthboundPrototype/Scripts/PrototypeEnemy.cs +++ /dev/null @@ -1,105 +0,0 @@ -using System.Collections.Generic; -using Unity.Netcode; -using UnityEngine; - -namespace Northbound.Prototype -{ - [RequireComponent(typeof(NetworkObject))] - public sealed class PrototypeEnemy : NetworkBehaviour, IPrototypeDamageable - { - public static readonly List All = new(); - - [SerializeField] private EnemyRole role; - [SerializeField] private float baseHealth = 55f; - [SerializeField] private float baseDamage = 8f; - [SerializeField] private float moveSpeed = 2.4f; - [SerializeField] private float attackRange = 1.7f; - [SerializeField] private float attackInterval = 1.2f; - - public readonly NetworkVariable Health = new(); - private float damage; - private float nextAttack; - private float pendingHealthMultiplier = 1f; - private float pendingDamageMultiplier = 1f; - - public bool IsAlive => Health.Value > 0f; - public Vector3 Position => transform.position; - - private void OnEnable() => All.Add(this); - private void OnDisable() => All.Remove(this); - - public void ApplyWaveStats(float healthMultiplier, float damageMultiplier) - { - pendingHealthMultiplier = healthMultiplier; - pendingDamageMultiplier = damageMultiplier; - } - - public override void OnNetworkSpawn() - { - if (IsServer && Health.Value <= 0f) Health.Value = baseHealth * pendingHealthMultiplier; - if (IsServer && damage <= 0f) damage = baseDamage * pendingDamageMultiplier; - } - - private void Update() - { - if (!IsServer || !IsAlive || PrototypeGameState.Instance.Phase.Value != PrototypeGamePhase.Playing) return; - IPrototypeDamageable target = SelectTarget(); - if (target == null || !target.IsAlive) return; - Vector3 direction = target.Position - transform.position; - direction.y = 0f; - if (direction.magnitude > attackRange) - { - transform.position += direction.normalized * moveSpeed * Time.deltaTime; - transform.forward = direction.normalized; - } - else if (Time.time >= nextAttack) - { - nextAttack = Time.time + attackInterval; - target.TakeDamage(damage, true); - } - } - - private IPrototypeDamageable SelectTarget() - { - IPrototypeDamageable target = PrototypeCore.Instance; - float best = target != null ? Vector3.Distance(Position, target.Position) : float.MaxValue; - - foreach (var player in PrototypePlayer.All) - { - if (!player.IsAlive) continue; - float distance = Vector3.Distance(Position, player.Position); - if (distance < 7f && distance < best) { best = distance; target = player; } - } - - if (role == EnemyRole.Raider) - { - foreach (var crystal in PrototypeCrystalOutpost.All) - { - if (!crystal.IsCaptured.Value || !crystal.IsAlive) continue; - float distance = Vector3.Distance(Position, crystal.Position); - if (distance < best) { best = distance; target = crystal; } - } - } - - foreach (var portal in PortalSite.All) - { - if (portal.State.Value != PortalState.Allied || !portal.IsAlive) continue; - float distance = Vector3.Distance(Position, portal.Position); - if (distance < 5f && distance < best) { best = distance; target = portal; } - } - return target; - } - - public void TakeDamage(float amount, bool fromEnemy) - { - if (!IsServer || fromEnemy || !IsAlive) return; - Health.Value = Mathf.Max(0f, Health.Value - amount); - if (Health.Value <= 0f) NetworkObject.Despawn(true); - } - -#if UNITY_EDITOR - public void EditorConfigure(EnemyRole enemyRole, float health, float attack, float speed) - { role = enemyRole; baseHealth = health; baseDamage = attack; moveSpeed = speed; } -#endif - } -} diff --git a/Assets/NorthboundPrototype/Scripts/PrototypeEnemy.cs.meta b/Assets/NorthboundPrototype/Scripts/PrototypeEnemy.cs.meta deleted file mode 100644 index b0371ca..0000000 --- a/Assets/NorthboundPrototype/Scripts/PrototypeEnemy.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 9a43da78fc3aae144a68b43728a90ca5 \ No newline at end of file diff --git a/Assets/NorthboundPrototype/Scripts/PrototypeGameState.cs b/Assets/NorthboundPrototype/Scripts/PrototypeGameState.cs index 3b0c62d..27f217a 100644 --- a/Assets/NorthboundPrototype/Scripts/PrototypeGameState.cs +++ b/Assets/NorthboundPrototype/Scripts/PrototypeGameState.cs @@ -29,6 +29,12 @@ namespace Northbound.Prototype private void Update() { if (!IsServer || Phase.Value != PrototypeGamePhase.Playing) return; + var core = FindAnyObjectByType(); + if (core != null && core.IsDead()) + { + SetPhase(PrototypeGamePhase.Defeat); + return; + } float income = baseManaPerSecond; foreach (var crystal in PrototypeCrystalOutpost.All) if (crystal != null && crystal.IsCaptured.Value) income += crystal.ManaPerSecond; diff --git a/Assets/NorthboundPrototype/Scripts/PrototypeHud.cs b/Assets/NorthboundPrototype/Scripts/PrototypeHud.cs index cb5158d..a2ea995 100644 --- a/Assets/NorthboundPrototype/Scripts/PrototypeHud.cs +++ b/Assets/NorthboundPrototype/Scripts/PrototypeHud.cs @@ -1,5 +1,4 @@ using UnityEngine; -using UnityEngine.InputSystem; namespace Northbound.Prototype { @@ -7,12 +6,6 @@ namespace Northbound.Prototype { [SerializeField] private PrototypeNetworkLauncher launcher; [SerializeField] private PrototypeWaveManager waveManager; - private void Update() - { - if (Keyboard.current == null || !Keyboard.current.eKey.wasPressedThisFrame) return; - foreach (var player in PrototypePlayer.All) - if (player != null && player.IsOwner) { player.InteractRpc(); break; } - } private void OnGUI() { GUI.skin.label.fontSize = 17; GUI.skin.button.fontSize = 17; @@ -30,7 +23,8 @@ namespace Northbound.Prototype GUI.Box(new Rect(18, 18, 390, 142), "작전 현황"); string wave = waveManager == null ? "-" : $"{waveManager.WaveNumber.Value} (다음 {waveManager.NextWaveIn.Value:0}초)"; string resonance = waveManager == null ? "-" : waveManager.ResonanceSnapshot.Value.ToString(); - string health = PrototypeCore.Instance == null ? "-" : PrototypeCore.Instance.Health.Value.ToString("0"); + var core = FindAnyObjectByType(); + string health = core == null ? "-" : core.CurrentHealth.ToString(); GUI.Label(new Rect(35, 52, 350, 105), $"공용 마나 {state.SharedMana.Value:0}\n본진 체력 {health}\n웨이브 {wave}\n포탈 공명 {resonance} / 3"); GUI.Box(new Rect(Screen.width - 370, 18, 350, 155), "목표와 조작"); GUI.Label(new Rect(Screen.width - 350, 52, 320, 110), "북진해 적 포탈을 파괴하고 E로 재건\n크리스탈 주변 적 제거 후 E로 확보\n고정 슬롯에서 E로 기본 타워 건설\n좌/우클릭 공격 · 회피/방어 없음"); diff --git a/Assets/NorthboundPrototype/Scripts/PrototypeNetworkLauncher.cs b/Assets/NorthboundPrototype/Scripts/PrototypeNetworkLauncher.cs index 35d48b1..be3aa7e 100644 --- a/Assets/NorthboundPrototype/Scripts/PrototypeNetworkLauncher.cs +++ b/Assets/NorthboundPrototype/Scripts/PrototypeNetworkLauncher.cs @@ -25,6 +25,9 @@ namespace Northbound.Prototype { foreach (string argument in System.Environment.GetCommandLineArgs()) if (argument == "-prototypeSmoke") { StartHost(); break; } +#if UNITY_EDITOR + if (UnityEditor.SessionState.GetBool("Northbound.Prototype.InteractiveSmoke", false)) StartHost(); +#endif } public void StartHost() { if (!manager.IsListening) manager.StartHost(); } public void StartClient() { if (!manager.IsListening) manager.StartClient(); } diff --git a/Assets/NorthboundPrototype/Scripts/PrototypePlayer.cs b/Assets/NorthboundPrototype/Scripts/PrototypePlayer.cs deleted file mode 100644 index 6f723ca..0000000 --- a/Assets/NorthboundPrototype/Scripts/PrototypePlayer.cs +++ /dev/null @@ -1,135 +0,0 @@ -using System.Collections.Generic; -using Unity.Netcode; -using UnityEngine; -using UnityEngine.InputSystem; - -namespace Northbound.Prototype -{ - [RequireComponent(typeof(NetworkObject))] - public sealed class PrototypePlayer : NetworkBehaviour, IPrototypeDamageable - { - public static readonly List All = new(); - - [Header("Movement")] - [SerializeField] private float moveSpeed = 8f; - [SerializeField] private Vector2 xBounds = new(-15f, 15f); - [SerializeField] private Vector2 zBounds = new(-82f, 88f); - [Header("Combat")] - [SerializeField] private float maxHealth = 100f; - [SerializeField] private float normalDamage = 24f; - [SerializeField] private float normalRange = 3.2f; - [SerializeField] private float specialDamage = 58f; - [SerializeField] private float specialRange = 6f; - [SerializeField] private float specialManaCost = 25f; - [SerializeField] private float specialCooldown = 4f; - - public readonly NetworkVariable Health = new(); - private float nextSpecialTime; - private float nextNormalTime; - private Camera mainCamera; - public Vector3 LastMoveDirection { get; private set; } = Vector3.forward; - - public bool IsAlive => Health.Value > 0f; - public Vector3 Position => transform.position; - - private void OnEnable() => All.Add(this); - private void OnDisable() => All.Remove(this); - - public override void OnNetworkSpawn() - { - if (IsServer) - { - Health.Value = maxHealth; - transform.position = new Vector3((OwnerClientId % 4 - 1.5f) * 2f, 0.8f, -74f); - } - if (IsOwner) mainCamera = Camera.main; - } - - private void Update() - { - if (!IsOwner || !IsSpawned || !IsAlive || PrototypeGameState.Instance == null || - PrototypeGameState.Instance.Phase.Value != PrototypeGamePhase.Playing) return; - - var keyboard = Keyboard.current; - var mouse = Mouse.current; - if (keyboard == null || mouse == null) return; - var movement = new Vector2( - (keyboard.dKey.isPressed ? 1f : 0f) - (keyboard.aKey.isPressed ? 1f : 0f), - (keyboard.wKey.isPressed ? 1f : 0f) - (keyboard.sKey.isPressed ? 1f : 0f)); - Vector3 aim = transform.forward; - if (mainCamera == null) mainCamera = Camera.main; - if (mainCamera != null) - { - Ray ray = mainCamera.ScreenPointToRay(mouse.position.ReadValue()); - var plane = new Plane(Vector3.up, Vector3.zero); - if (plane.Raycast(ray, out float distance)) aim = ray.GetPoint(distance) - transform.position; - } - aim.y = 0f; - if (aim.sqrMagnitude < 0.01f) aim = Vector3.forward; - - bool normal = mouse.leftButton.wasPressedThisFrame; - bool special = mouse.rightButton.wasPressedThisFrame; - SubmitInputRpc(movement, aim.normalized, normal, special); - } - - [Rpc(SendTo.Server)] - private void SubmitInputRpc(Vector2 movement, Vector3 aim, bool normal, bool special) - { - if (!IsAlive) return; - Vector3 delta = new Vector3(movement.x, 0f, movement.y); - if (delta.sqrMagnitude > 1f) delta.Normalize(); - if (delta.sqrMagnitude > 0.01f) LastMoveDirection = delta.normalized; - transform.position += delta * moveSpeed * Time.deltaTime; - transform.position = new Vector3( - Mathf.Clamp(transform.position.x, xBounds.x, xBounds.y), 0.8f, - Mathf.Clamp(transform.position.z, zBounds.x, zBounds.y)); - transform.forward = aim; - - if (normal && Time.time >= nextNormalTime) - { - nextNormalTime = Time.time + 0.35f; - PerformAttack(normalRange, normalDamage, 0.35f); - } - if (special && Time.time >= nextSpecialTime && PrototypeGameState.Instance.TrySpend(specialManaCost)) - { - nextSpecialTime = Time.time + specialCooldown; - PerformAttack(specialRange, specialDamage, 0.1f); - } - } - - private void PerformAttack(float range, float damage, float facingThreshold) - { - var hits = Physics.OverlapSphere(transform.position + transform.forward * range * 0.5f, range * 0.65f); - var damaged = new HashSet(); - foreach (var hit in hits) - { - var target = hit.GetComponentInParent(); - if (target == null || ReferenceEquals(target, this) || !target.IsAlive || damaged.Contains(target)) continue; - Vector3 direction = (target.Position - transform.position).normalized; - if (Vector3.Dot(transform.forward, direction) < facingThreshold) continue; - target.TakeDamage(damage, false); - damaged.Add(target); - } - } - - public void TakeDamage(float amount, bool fromEnemy) - { - if (!IsServer || !fromEnemy || !IsAlive) return; - Health.Value = Mathf.Max(0f, Health.Value - amount); - if (Health.Value <= 0f) - { - Health.Value = maxHealth; - transform.position = new Vector3(0f, 0.8f, -74f); - } - } - - [Rpc(SendTo.Server)] - public void InteractRpc() - { - if (!IsAlive) return; - PortalSite.TryInteractNearest(this); - PrototypeCrystalOutpost.TryInteractNearest(this); - PrototypeDefenseSlot.TryInteractNearest(this); - } - } -} diff --git a/Assets/NorthboundPrototype/Scripts/PrototypePlayer.cs.meta b/Assets/NorthboundPrototype/Scripts/PrototypePlayer.cs.meta deleted file mode 100644 index 7bb27d8..0000000 --- a/Assets/NorthboundPrototype/Scripts/PrototypePlayer.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 47e38d0512a8abd4c83eda8608e3ef9f \ No newline at end of file diff --git a/Assets/NorthboundPrototype/Scripts/PrototypeSmokeRunner.cs b/Assets/NorthboundPrototype/Scripts/PrototypeSmokeRunner.cs index 3463f3b..cb307e0 100644 --- a/Assets/NorthboundPrototype/Scripts/PrototypeSmokeRunner.cs +++ b/Assets/NorthboundPrototype/Scripts/PrototypeSmokeRunner.cs @@ -5,43 +5,58 @@ namespace Northbound.Prototype { public sealed class PrototypeSmokeRunner : MonoBehaviour { - private bool enabledForCommandLine; + private bool smokeEnabled; private float startedAt; private void Start() { foreach (string argument in System.Environment.GetCommandLineArgs()) - if (argument == "-prototypeSmoke") enabledForCommandLine = true; + if (argument == "-prototypeSmoke") smokeEnabled = true; +#if UNITY_EDITOR + smokeEnabled |= UnityEditor.SessionState.GetBool("Northbound.Prototype.InteractiveSmoke", false); +#endif startedAt = Time.realtimeSinceStartup; } private void Update() { - if (!enabledForCommandLine || Time.realtimeSinceStartup - startedAt < 18f) return; + if (!smokeEnabled || Time.realtimeSinceStartup - startedAt < 18f) return; bool valid = NetworkManager.Singleton != null && NetworkManager.Singleton.IsHost && - PrototypeGameState.Instance != null && PrototypeCore.Instance != null && - PrototypePlayer.All.Count == 1 && PortalSite.All.Count == 4 && - PrototypeCrystalOutpost.All.Count == 3 && PrototypeEnemy.All.Count > 0 && - FindFirstObjectByType().WaveNumber.Value == 1; + PrototypeGameState.Instance != null && FindAnyObjectByType() != null && + FindObjectsByType().Length == 1 && PortalSite.All.Count == 4 && + PrototypeCrystalOutpost.All.Count == 3 && FindObjectsByType().Length > 0 && + FindAnyObjectByType().WaveNumber.Value == 1; if (valid) { - Debug.Log($"[Northbound Prototype Smoke] PASS: host, player, core, 4 portals, 3 crystals, and wave enemies ({PrototypeEnemy.All.Count}) are active."); + int enemyCount = FindObjectsByType().Length; + Debug.Log($"[Northbound Prototype Smoke] PASS: reused player/core, 4 portals, 3 crystals, and reused wave enemies ({enemyCount}) are active."); Quit(0); } else { - Debug.LogError($"[Northbound Prototype Smoke] FAIL: host={NetworkManager.Singleton?.IsHost}, players={PrototypePlayer.All.Count}, portals={PortalSite.All.Count}, crystals={PrototypeCrystalOutpost.All.Count}"); - foreach (var crystal in FindObjectsByType(FindObjectsSortMode.None)) + int playerCount = FindObjectsByType().Length; + Debug.LogError($"[Northbound Prototype Smoke] FAIL: host={NetworkManager.Singleton?.IsHost}, players={playerCount}, portals={PortalSite.All.Count}, crystals={PrototypeCrystalOutpost.All.Count}"); + foreach (var crystal in FindObjectsByType()) Debug.LogError($"[Northbound Prototype Smoke] Crystal object: {crystal.name}, active={crystal.isActiveAndEnabled}, spawned={crystal.IsSpawned}"); Quit(2); } - enabledForCommandLine = false; + smokeEnabled = false; } private static void Quit(int code) { #if UNITY_EDITOR - UnityEditor.EditorApplication.Exit(code); + if (NetworkManager.Singleton != null && NetworkManager.Singleton.IsListening) + NetworkManager.Singleton.Shutdown(); + if (UnityEditor.SessionState.GetBool("Northbound.Prototype.InteractiveSmoke", false)) + { + UnityEditor.SessionState.EraseBool("Northbound.Prototype.InteractiveSmoke"); + UnityEditor.EditorApplication.isPlaying = false; + } + else + { + UnityEditor.EditorApplication.Exit(code); + } #else Application.Quit(code); #endif diff --git a/Assets/NorthboundPrototype/Scripts/PrototypeSpecialAttack.cs b/Assets/NorthboundPrototype/Scripts/PrototypeSpecialAttack.cs new file mode 100644 index 0000000..fed2797 --- /dev/null +++ b/Assets/NorthboundPrototype/Scripts/PrototypeSpecialAttack.cs @@ -0,0 +1,55 @@ +using System.Collections.Generic; +using Unity.Netcode; +using UnityEngine; + +namespace Northbound.Prototype +{ + [RequireComponent(typeof(NetworkObject), typeof(NetworkPlayerController))] + public sealed class PrototypeSpecialAttack : NetworkBehaviour, IAction + { + [SerializeField] private float cooldown = 4f; + [SerializeField] private float manaCost = 25f; + [SerializeField] private float range = 6f; + [SerializeField] private float radius = 3.5f; + [SerializeField] private int damageMultiplier = 3; + [SerializeField, Range(-1f, 1f)] private float minimumFacingDot = 0.05f; + private float localNextUse; + private float serverNextUse; + private PlayerStats stats; + private ITeamMember teamMember; + + private void Awake() { stats = GetComponent(); teamMember = GetComponent(); } + public bool CanExecute(ulong playerId) => Time.time >= localNextUse && PrototypeGameState.Instance != null && + PrototypeGameState.Instance.SharedMana.Value >= manaCost; + public void Execute(ulong playerId) + { + if (!CanExecute(playerId)) return; + localNextUse = Time.time + cooldown; + ExecuteSpecialRpc(); + } + [Rpc(SendTo.Server, InvokePermission = RpcInvokePermission.Everyone)] + private void ExecuteSpecialRpc() + { + if (Time.time < serverNextUse || PrototypeGameState.Instance == null || !PrototypeGameState.Instance.TrySpend(manaCost)) return; + serverNextUse = Time.time + cooldown; + int damage = (stats != null ? stats.GetDamage() : 10) * damageMultiplier; + Vector3 center = transform.position + transform.forward * range * 0.5f; + var damaged = new HashSet(); + foreach (var hit in Physics.OverlapSphere(center, radius)) + { + if (hit.transform.root == transform.root) continue; + var target = hit.GetComponentInParent(); + if (target == null || target.IsDead() || damaged.Contains(target)) continue; + var targetTeam = hit.GetComponentInParent(); + if (teamMember != null && targetTeam != null && !TeamManager.CanAttack(teamMember, targetTeam)) continue; + Vector3 direction = hit.bounds.center - transform.position; direction.y = 0f; + if (direction.sqrMagnitude > 0.01f && Vector3.Dot(transform.forward, direction.normalized) < minimumFacingDot) continue; + target.TakeDamage(damage, NetworkObjectId); + damaged.Add(target); + } + } + public string GetActionName() => "SpecialAttack"; + public string GetActionAnimation() => string.Empty; + public EquipmentData GetEquipmentData() => null; + } +} diff --git a/Assets/NorthboundPrototype/Scripts/PrototypeSpecialAttack.cs.meta b/Assets/NorthboundPrototype/Scripts/PrototypeSpecialAttack.cs.meta new file mode 100644 index 0000000..3569c67 --- /dev/null +++ b/Assets/NorthboundPrototype/Scripts/PrototypeSpecialAttack.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: c645a5457e4901d4199afde290b51961 \ No newline at end of file diff --git a/Assets/NorthboundPrototype/Scripts/PrototypeTower.cs b/Assets/NorthboundPrototype/Scripts/PrototypeTower.cs deleted file mode 100644 index 8bc4d9b..0000000 --- a/Assets/NorthboundPrototype/Scripts/PrototypeTower.cs +++ /dev/null @@ -1,27 +0,0 @@ -using Unity.Netcode; -using UnityEngine; - -namespace Northbound.Prototype -{ - [RequireComponent(typeof(NetworkObject))] - public sealed class PrototypeTower : NetworkBehaviour - { - [SerializeField] private float range = 7f; - [SerializeField] private float damage = 10f; - [SerializeField] private float interval = 1.1f; - private float nextAttack; - private void Update() - { - if (!IsServer || Time.time < nextAttack) return; - PrototypeEnemy nearest = null; float best = range; - foreach (var enemy in PrototypeEnemy.All) - { - float distance = Vector3.Distance(transform.position, enemy.Position); - if (enemy.IsAlive && distance < best) { best = distance; nearest = enemy; } - } - if (nearest == null) return; - nextAttack = Time.time + interval; - nearest.TakeDamage(damage, false); - } - } -} diff --git a/Assets/NorthboundPrototype/Scripts/PrototypeTower.cs.meta b/Assets/NorthboundPrototype/Scripts/PrototypeTower.cs.meta deleted file mode 100644 index e903340..0000000 --- a/Assets/NorthboundPrototype/Scripts/PrototypeTower.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 4f17758c8b6cecf4d8246570583e22dd \ No newline at end of file diff --git a/Assets/NorthboundPrototype/Scripts/PrototypeTypes.cs b/Assets/NorthboundPrototype/Scripts/PrototypeTypes.cs index f63d8c9..422cd89 100644 --- a/Assets/NorthboundPrototype/Scripts/PrototypeTypes.cs +++ b/Assets/NorthboundPrototype/Scripts/PrototypeTypes.cs @@ -1,15 +1,6 @@ -using UnityEngine; - namespace Northbound.Prototype { public enum PrototypeGamePhase : byte { Playing, Victory, Defeat } public enum PortalState : byte { Enemy, Ruined, Allied } public enum EnemyRole : byte { Grunt, Raider, Digger, Elite } - - public interface IPrototypeDamageable - { - bool IsAlive { get; } - Vector3 Position { get; } - void TakeDamage(float amount, bool fromEnemy); - } } diff --git a/Assets/NorthboundPrototype/Scripts/PrototypeWaveManager.cs b/Assets/NorthboundPrototype/Scripts/PrototypeWaveManager.cs index 7db9656..09e0d49 100644 --- a/Assets/NorthboundPrototype/Scripts/PrototypeWaveManager.cs +++ b/Assets/NorthboundPrototype/Scripts/PrototypeWaveManager.cs @@ -1,4 +1,3 @@ -using System.Collections; using System.Collections.Generic; using Unity.Netcode; using UnityEngine; @@ -8,74 +7,81 @@ namespace Northbound.Prototype [RequireComponent(typeof(NetworkObject))] public sealed class PrototypeWaveManager : NetworkBehaviour { - [SerializeField] private PrototypeEnemy[] enemyPrefabs; - [SerializeField] private float firstWaveDelay = 15f; - [SerializeField] private float waveInterval = 90f; + [SerializeField] private GlobalTimer globalTimer; + [SerializeField] private GameObject[] enemyPrefabs; [SerializeField] private int resonanceCap = 3; [SerializeField] private float healthPerPortal = 0.10f; [SerializeField] private float damagePerPortal = 0.06f; - public readonly NetworkVariable WaveNumber = new(); public readonly NetworkVariable ResonanceSnapshot = new(); public readonly NetworkVariable NextWaveIn = new(); public override void OnNetworkSpawn() { - if (IsServer) StartCoroutine(WaveLoop()); + if (globalTimer == null) globalTimer = GlobalTimer.Instance; + if (IsServer && globalTimer != null) globalTimer.OnCycleComplete += SpawnWave; } - - private IEnumerator WaveLoop() + public override void OnNetworkDespawn() { - float delay = firstWaveDelay; - while (PrototypeGameState.Instance.Phase.Value == PrototypeGamePhase.Playing) - { - for (float left = delay; left > 0f; left -= 1f) - { - NextWaveIn.Value = left; - yield return new WaitForSeconds(1f); - } - SpawnWave(); - delay = waveInterval; - } + if (IsServer && globalTimer != null) globalTimer.OnCycleComplete -= SpawnWave; } + private void Update() { if (IsServer && globalTimer != null) NextWaveIn.Value = globalTimer.GetCurrentTime(); } private void SpawnWave() { + if (!IsServer || PrototypeGameState.Instance.Phase.Value != PrototypeGamePhase.Playing) return; var activePortals = new List(); - foreach (var portal in PortalSite.All) - if (portal != null && portal.State.Value == PortalState.Enemy) activePortals.Add(portal); - + foreach (var portal in PortalSite.All) if (portal != null && portal.State.Value == PortalState.Enemy) activePortals.Add(portal); if (activePortals.Count == 0) return; WaveNumber.Value++; ResonanceSnapshot.Value = Mathf.Min(activePortals.Count, resonanceCap); - int budget = 5 + WaveNumber.Value * 2; - float hpMultiplier = 1f + ResonanceSnapshot.Value * healthPerPortal; - float damageMultiplier = 1f + ResonanceSnapshot.Value * damagePerPortal; - - for (int i = 0; i < budget; i++) + int remainingBudget = 18 + WaveNumber.Value * 3; + int spawnIndex = 0; + while (remainingBudget > 0) { - PortalSite portal = activePortals[i % activePortals.Count]; - int prefabIndex = ChooseEnemyIndex(i, WaveNumber.Value); - var prefab = enemyPrefabs[Mathf.Clamp(prefabIndex, 0, enemyPrefabs.Length - 1)]; - float xOffset = prefabIndex == 2 ? (i % 2 == 0 ? -11f : 11f) : Random.Range(-2f, 2f); - float zOffset = prefabIndex == 2 ? -7f : -2.5f; - var enemy = Instantiate(prefab, portal.Position + new Vector3(xOffset, 0.7f, zOffset), Quaternion.identity); - enemy.ApplyWaveStats(hpMultiplier, damageMultiplier); - enemy.NetworkObject.Spawn(); + GameObject prefab = SelectAffordablePrefab(remainingBudget); + if (prefab == null) break; + var data = prefab.GetComponent()?.monsterData; + int cost = data != null ? Mathf.Max(1, data.cost) : 3; + PortalSite portal = activePortals[spawnIndex % activePortals.Count]; + float x = spawnIndex % 5 == 4 ? (spawnIndex % 2 == 0 ? -11f : 11f) : Random.Range(-2f, 2f); + GameObject enemy = Instantiate(prefab, portal.Position + new Vector3(x, 0.3f, -3f), Quaternion.identity); + ApplyResonance(enemy); + enemy.GetComponent().Spawn(); + remainingBudget -= cost; spawnIndex++; } } - private int ChooseEnemyIndex(int spawnIndex, int wave) + private GameObject SelectAffordablePrefab(int budget) { - if (enemyPrefabs.Length <= 1) return 0; - if (wave >= 3 && spawnIndex % 7 == 0) return Mathf.Min(3, enemyPrefabs.Length - 1); - if (spawnIndex % 5 == 0) return Mathf.Min(1, enemyPrefabs.Length - 1); - if (wave >= 2 && spawnIndex % 4 == 0) return Mathf.Min(2, enemyPrefabs.Length - 1); - return 0; + var eligible = new List(); float totalWeight = 0f; + foreach (var prefab in enemyPrefabs) + { + if (prefab == null) continue; + var data = prefab.GetComponent()?.monsterData; + if (data == null || data.cost > budget || WaveNumber.Value < data.waveMin || (data.waveMax > 0 && WaveNumber.Value > data.waveMax)) continue; + eligible.Add(prefab); totalWeight += Mathf.Max(0.01f, data.weight); + } + if (eligible.Count == 0) return null; + float roll = Random.Range(0f, totalWeight); + foreach (var prefab in eligible) + { + roll -= Mathf.Max(0.01f, prefab.GetComponent().monsterData.weight); + if (roll <= 0f) return prefab; + } + return eligible[0]; } + private void ApplyResonance(GameObject enemy) + { + int resonance = ResonanceSnapshot.Value; + var unit = enemy.GetComponent(); + var ai = enemy.GetComponent(); + if (unit != null) unit.maxHealth = Mathf.RoundToInt(unit.maxHealth * (1f + resonance * healthPerPortal)); + if (ai != null) ai.attackDamage = Mathf.RoundToInt(ai.attackDamage * (1f + resonance * damagePerPortal)); + } #if UNITY_EDITOR - public void EditorConfigure(PrototypeEnemy[] prefabs) => enemyPrefabs = prefabs; + public void EditorConfigure(GlobalTimer timer, GameObject[] prefabs) { globalTimer = timer; enemyPrefabs = prefabs; } #endif } } diff --git a/Assets/Scripts/AttackAction.cs b/Assets/Scripts/AttackAction.cs index 15ce99d..a59ac5f 100644 --- a/Assets/Scripts/AttackAction.cs +++ b/Assets/Scripts/AttackAction.cs @@ -11,6 +11,8 @@ namespace Northbound [Header("Attack Settings")] public float attackCooldown = 0.5f; public LayerMask attackableLayer = ~0; + public bool useFacingArc = false; + [Range(-1f, 1f)] public float minimumFacingDot = 0.25f; [Header("Animation")] public string attackAnimationTrigger = "Attack"; @@ -72,7 +74,7 @@ namespace Northbound PlayAttackAnimation(); // 애니메이션이 없으면 즉시 공격 실행 - if (_animator == null || string.IsNullOrEmpty(attackAnimationTrigger)) + if (!useAnimationEvents || _animator == null || string.IsNullOrEmpty(attackAnimationTrigger)) { PerformAttack(); _isAttacking = false; @@ -89,6 +91,14 @@ namespace Northbound if (hit.transform.root == transform.root) continue; + if (useFacingArc) + { + Vector3 targetDirection = hit.bounds.center - transform.position; + targetDirection.y = 0f; + if (targetDirection.sqrMagnitude > 0.01f && Vector3.Dot(transform.forward, targetDirection.normalized) < minimumFacingDot) + continue; + } + var targetDamageable = hit.GetComponent(); var targetTeamMember = hit.GetComponent(); diff --git a/Assets/Scripts/EnemyPortal.cs b/Assets/Scripts/EnemyPortal.cs index 876f064..a416d04 100644 --- a/Assets/Scripts/EnemyPortal.cs +++ b/Assets/Scripts/EnemyPortal.cs @@ -9,6 +9,10 @@ using UnityEngine; [Header("Team Settings")] [Tooltip("포털의 팀 (Hostile 또는 Monster)")] [SerializeField] private TeamType portalTeam = TeamType.Hostile; + [Header("Lifecycle")] + [SerializeField] private bool spawnFromGlobalTimer = true; + [SerializeField] private bool despawnWhenDestroyed = true; + public event System.Action OnPortalDestroyed; [Header("Health Settings")] [Tooltip("최대 체력")] @@ -67,12 +71,18 @@ using UnityEngine; } } - GlobalTimer.Instance.OnCycleStart += OnCycleStart; + if (spawnFromGlobalTimer && GlobalTimer.Instance != null) + { + GlobalTimer.Instance.OnCycleStart += OnCycleStart; + } } public override void OnNetworkDespawn() { - GlobalTimer.Instance.OnCycleStart -= OnCycleStart; + if (spawnFromGlobalTimer && GlobalTimer.Instance != null) + { + GlobalTimer.Instance.OnCycleStart -= OnCycleStart; + } // 체력 변경 이벤트 정리 (나중에 추가할 경우 대비) @@ -249,7 +259,7 @@ using UnityEngine; } } - private void DestroyPortal(ulong attackerId) + private void DestroyPortal(ulong attackerId) { if (!IsServer) return; @@ -257,10 +267,40 @@ using UnityEngine; ShowDestroyEffectClientRpc(); // 몬스터 스폰 중지 (이벤트 구독 해제) - GlobalTimer.Instance.OnCycleStart -= OnCycleStart; + if (spawnFromGlobalTimer && GlobalTimer.Instance != null) + { + GlobalTimer.Instance.OnCycleStart -= OnCycleStart; + } - // 네트워크 오브젝트 파괴 (약간의 딜레이) - Invoke(nameof(DespawnPortal), 1.0f); + OnPortalDestroyed?.Invoke(attackerId); + + if (despawnWhenDestroyed) + { + Invoke(nameof(DespawnPortal), 1.0f); + } + } + + public int CurrentHealth => _currentHealth.Value; + public int MaxHealth => maxHealth; + + public void ConfigureLifecycle(bool useGlobalTimerSpawning, bool shouldDespawn) + { + spawnFromGlobalTimer = useGlobalTimerSpawning; + despawnWhenDestroyed = shouldDespawn; + } + + public void RestorePortal(TeamType team) + { + if (!IsServer) return; + _team.Value = team; + _currentHealth.Value = maxHealth; + } + + public void SetDormant() + { + if (!IsServer) return; + _team.Value = TeamType.Neutral; + _currentHealth.Value = 0; } private void DespawnPortal() diff --git a/Assets/Scripts/NetworkConnectionHandler.cs b/Assets/Scripts/NetworkConnectionHandler.cs index 2fdeb16..5d6e0c4 100644 --- a/Assets/Scripts/NetworkConnectionHandler.cs +++ b/Assets/Scripts/NetworkConnectionHandler.cs @@ -17,6 +17,8 @@ namespace Northbound private Dictionary _clientSpawnIndices = new Dictionary(); private int _nextSpawnIndex = 0; + private NetworkManager _networkManager; + private bool _callbacksRegistered; // ⭐ Awake에서 스폰 포인트 먼저 찾고, 콜백 등록 private void Awake() @@ -28,15 +30,25 @@ namespace Northbound } // 2️⃣ 그 다음 콜백 등록 - if (NetworkManager.Singleton != null) - { - NetworkManager.Singleton.ConnectionApprovalCallback = ApprovalCheck; - NetworkManager.Singleton.OnServerStarted += OnServerStarted; - NetworkManager.Singleton.OnClientConnectedCallback += OnClientConnected; - } - else - { - } + RegisterCallbacks(); + } + + private void Start() + { + RegisterCallbacks(); + } + + private void RegisterCallbacks() + { + if (_callbacksRegistered) return; + _networkManager = GetComponent(); + if (_networkManager == null) _networkManager = NetworkManager.Singleton; + if (_networkManager == null) return; + + _networkManager.ConnectionApprovalCallback = ApprovalCheck; + _networkManager.OnServerStarted += OnServerStarted; + _networkManager.OnClientConnectedCallback += OnClientConnected; + _callbacksRegistered = true; } private void FindSpawnPoints() @@ -192,11 +204,11 @@ namespace Northbound private void OnDestroy() { - if (NetworkManager.Singleton != null) + if (_callbacksRegistered && _networkManager != null) { - NetworkManager.Singleton.ConnectionApprovalCallback = null; - NetworkManager.Singleton.OnServerStarted -= OnServerStarted; - NetworkManager.Singleton.OnClientConnectedCallback -= OnClientConnected; + _networkManager.ConnectionApprovalCallback = null; + _networkManager.OnServerStarted -= OnServerStarted; + _networkManager.OnClientConnectedCallback -= OnClientConnected; } } } diff --git a/Assets/Scripts/NetworkPlayerController.cs b/Assets/Scripts/NetworkPlayerController.cs index d2163be..e6430c9 100644 --- a/Assets/Scripts/NetworkPlayerController.cs +++ b/Assets/Scripts/NetworkPlayerController.cs @@ -10,6 +10,8 @@ public class NetworkPlayerController : NetworkBehaviour, ITeamMember, IDamageabl { [Header("Movement Settings")] public float rotationSpeed = 10f; + [Tooltip("공격 애니메이션 중 이동을 막을지 여부")] + public bool blockMovementDuringAttack = true; [Header("Team Settings")] [SerializeField] private TeamType initialTeam = TeamType.Player; @@ -21,6 +23,7 @@ public class NetworkPlayerController : NetworkBehaviour, ITeamMember, IDamageabl [Header("Death Settings")] [SerializeField] private GameObject resourcePickupPrefab; // 자원 드랍 프리팹 [SerializeField] private float respawnDelay = 10f; // 부활 대기 시간 (초) + [SerializeField] private bool dropResourcesOnDeath = true; [Header("Health Bar")] [SerializeField] private bool showHealthBar = true; @@ -61,9 +64,18 @@ public class NetworkPlayerController : NetworkBehaviour, ITeamMember, IDamageabl // 이 플레이어가 로컬 플레이어인지 확인 - public new bool IsLocalPlayer => _ownerPlayerId.Value == NetworkManager.Singleton.LocalClientId; + public new bool IsLocalPlayer => NetworkManager.Singleton != null && + (_ownerPlayerId.Value == ulong.MaxValue ? OwnerClientId : _ownerPlayerId.Value) == NetworkManager.Singleton.LocalClientId; - public ulong OwnerPlayerId => _ownerPlayerId.Value; + public ulong OwnerPlayerId => _ownerPlayerId.Value == ulong.MaxValue ? OwnerClientId : _ownerPlayerId.Value; + public Vector3 ServerMoveDirection => new Vector3(_serverMoveInput.x, 0f, _serverMoveInput.y).normalized; + + public void ConfigurePrototypeMode() + { + blockMovementDuringAttack = false; + dropResourcesOnDeath = false; + respawnDelay = 3f; + } // 중앙 집중식 입력 관리 - 다른 컴포넌트에서 참조 public PlayerInputActions InputActions => _inputActions; @@ -89,6 +101,10 @@ public class NetworkPlayerController : NetworkBehaviour, ITeamMember, IDamageabl // 서버에서 초기화 if (IsServer) { + if (_ownerPlayerId.Value == ulong.MaxValue) + { + _ownerPlayerId.Value = OwnerClientId; + } if (_team.Value == TeamType.Neutral) { _team.Value = initialTeam; @@ -245,7 +261,7 @@ public class NetworkPlayerController : NetworkBehaviour, ITeamMember, IDamageabl var attackAction = GetComponent(); var playerInteraction = GetComponent(); - bool isActionBlocked = (attackAction != null && attackAction.IsAttacking) || + bool isActionBlocked = (blockMovementDuringAttack && attackAction != null && attackAction.IsAttacking) || (playerInteraction != null && playerInteraction.IsInteracting); if (isActionBlocked) @@ -420,7 +436,10 @@ public class NetworkPlayerController : NetworkBehaviour, ITeamMember, IDamageabl if (!IsServer) return; // 플레이어가 가진 자원을 ResourcePickup으로 드랍 - DropPlayerResources(); + if (dropResourcesOnDeath) + { + DropPlayerResources(); + } // 사망 이펙트 ShowDeathEffectClientRpc(); diff --git a/Assets/Scripts/PlayerActionSystem.cs b/Assets/Scripts/PlayerActionSystem.cs index 2ea87d0..453a83f 100644 --- a/Assets/Scripts/PlayerActionSystem.cs +++ b/Assets/Scripts/PlayerActionSystem.cs @@ -17,6 +17,10 @@ namespace Northbound [Header("Animation")] public bool playAnimations = true; + [Header("Secondary Action")] + [Tooltip("우클릭으로 실행할 액션 이름. 비어 있으면 사용하지 않습니다.")] + public string secondaryActionName = ""; + private Dictionary _actions = new Dictionary(); private Animator _animator; private NetworkAnimator _networkAnimator; @@ -103,6 +107,18 @@ namespace Northbound ExecuteAction("Attack"); } + private void Update() + { + if (!_isInputInitialized || !IsLocalPlayer || string.IsNullOrEmpty(secondaryActionName)) return; + if (Mouse.current != null && Mouse.current.rightButton.wasPressedThisFrame) + { + if (!UpgradeListPopup.IsOpen && (_networkPlayerController == null || !_networkPlayerController.IsDead())) + { + ExecuteAction(secondaryActionName); + } + } + } + public void ExecuteAction(string actionName) { if (_actions.TryGetValue(actionName, out IAction action)) diff --git a/Assets/Scripts/SimpleCameraZFollow.cs b/Assets/Scripts/SimpleCameraZFollow.cs index 2666c16..a5779d6 100644 --- a/Assets/Scripts/SimpleCameraZFollow.cs +++ b/Assets/Scripts/SimpleCameraZFollow.cs @@ -11,6 +11,15 @@ public class SimpleCameraZFollow : MonoBehaviour private Transform target; + public void Configure(float height, float forwardOffset, float followSmoothSpeed) + { + fixedXPosition = 0f; + fixedYPosition = height; + zOffset = forwardOffset; + smoothSpeed = followSmoothSpeed; + lockRotation = true; + } + private void Start() { FindPlayerTarget(); @@ -21,7 +30,7 @@ public class SimpleCameraZFollow : MonoBehaviour var players = FindObjectsByType(); foreach (var player in players) { - if (player.IsOwner) + if (player.IsLocalPlayer) { target = player.transform; Debug.Log($"[Camera] Target found: {player.name}");