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}");