기존 시스템 재사용 프로토타입 보존

This commit is contained in:
2026-09-01 08:56:15 +09:00
parent 2f6e80fd57
commit b95c5bdb13
58 changed files with 714 additions and 3298 deletions
+5
View File
@@ -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}
@@ -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;
}
@@ -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<GameObject>("Assets/Prefabs/Tower/Tower1.prefab");
GameObject corePrefab = LoadRequired<GameObject>("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<NetworkManager>();
var transport = networkRoot.AddComponent<UnityTransport>();
networkRoot.AddComponent<NetworkConnectionHandler>();
var launcher = networkRoot.AddComponent<PrototypeNetworkLauncher>();
networkRoot.AddComponent<PrototypeSmokeRunner>();
manager.NetworkConfig.NetworkTransport = transport;
manager.NetworkConfig.PlayerPrefab = playerPrefab;
manager.NetworkConfig.ConnectionApproval = true;
var spawnables = new List<GameObject>(enemyPrefabs) { towerPrefab };
ConfigureNetworkPrefabs(manager, playerPrefab, spawnables);
launcher.EditorConfigure(playerPrefab, spawnables);
var state = CreateNetworkSceneObject<PrototypeGameState>("Game State", Vector3.zero);
CreateNetworkSceneObject<PrototypeGameState>("Game State", Vector3.zero);
var timer = CreateNetworkSceneObject<GlobalTimer>("Global Wave Timer", Vector3.zero);
timer.cycleLength = 90f; timer.exceptionalFirstCycleLength = 15f; timer.autoStart = true;
var wave = CreateNetworkSceneObject<PrototypeWaveManager>("Wave Manager", Vector3.zero);
var enemyComponents = Array.ConvertAll(enemyPrefabs, item => item.GetComponent<PrototypeEnemy>());
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<PrototypeTower>(), 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<string, Material> CreatePalette()
{
var colors = new Dictionary<string, Color>
{
["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<string, Material>();
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<Material>(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<NetworkObject>();
root.AddComponent<NetworkTransform>();
root.AddComponent<CapsuleCollider>();
root.AddComponent<PrototypePlayer>();
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<GameObject>("Assets/Prefabs/Player/Player.prefab");
AssetDatabase.DeleteAsset(path);
var instance = (GameObject)PrefabUtility.InstantiatePrefab(source);
instance.name = "Prototype Player (Player Variant)";
var controller = instance.GetComponent<NetworkPlayerController>(); controller.ConfigurePrototypeMode();
var attack = instance.GetComponent<AttackAction>();
attack.useFacingArc = true; attack.minimumFacingDot = 0.2f; attack.useAnimationEvents = false;
attack.blockDuringAnimation = false; attack.useEquipment = false; attack.attackAnimationTrigger = string.Empty;
var special = instance.AddComponent<PrototypeSpecialAttack>();
var actions = instance.GetComponent<PlayerActionSystem>();
actions.actionComponents.Clear(); actions.actionComponents.Add(attack); actions.actionComponents.Add(special);
actions.secondaryActionName = "SpecialAttack"; actions.playAnimations = false;
var interaction = instance.GetComponent<PlayerInteraction>();
interaction.playAnimations = false; interaction.useAnimationEvents = false; interaction.useEquipment = false;
interaction.blockDuringAnimation = false; interaction.showDebugRay = false;
Disable<BuildingPlacement>(instance); Disable<PlayerResourceInventory>(instance);
Disable<PlayerUpgradeManager>(instance); Disable<PlayerVisionProvider>(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<T>(GameObject gameObject) where T : Behaviour
{
string path = $"{Prefabs}/{name}.prefab";
var root = new GameObject(name);
root.AddComponent<NetworkObject>();
root.AddComponent<NetworkTransform>();
var collider = root.AddComponent<CapsuleCollider>(); collider.height = 1.4f; collider.radius = 0.45f;
var enemy = root.AddComponent<PrototypeEnemy>(); 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<NetworkObject>();
root.AddComponent<NetworkTransform>();
root.AddComponent<PrototypeTower>();
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<T>(); if (component != null) component.enabled = false;
}
private static void CreateEnvironment(Dictionary<string, Material> 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>(); 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<PrototypeCore>("South Core", new Vector3(0f, 1.5f, -78f));
var collider = core.gameObject.AddComponent<BoxCollider>(); 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<PlayerSpawnPoint>().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>(); core.maxHealth = 500; core.unlimitedStorage = true;
}
private static PortalSite[] CreatePortals(Dictionary<string, Material> 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<PortalSite>($"P{i} Portal Site", new Vector3(0f, 0.5f, z[i]));
var trigger = portals[i].gameObject.AddComponent<BoxCollider>();
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<Renderer>());
var root = new GameObject($"P{i} Portal Site"); root.transform.position = new Vector3(0f, 0.4f, z[i]);
root.AddComponent<NetworkObject>(); root.AddComponent<EnemyPortal>(); root.AddComponent<TeamGate>();
portals[i] = root.AddComponent<PortalSite>();
var detection = root.AddComponent<SphereCollider>(); detection.radius = 2.3f; detection.isTrigger = true;
var southTrigger = root.AddComponent<BoxCollider>(); southTrigger.center = new Vector3(0f, 0f, -1.35f); southTrigger.size = new Vector3(4.5f, 2f, 0.8f); southTrigger.isTrigger = true;
var northTrigger = root.AddComponent<BoxCollider>(); 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<Renderer>(), 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<PrototypeCrystalOutpost>($"Crystal Outpost {i + 1}", positions[i]);
var collider = result[i].gameObject.AddComponent<SphereCollider>(); 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<Renderer>());
visual.transform.rotation = Quaternion.Euler(0f, 45f, 45f); result[i].EditorConfigure(visual.GetComponent<Renderer>());
}
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<PrototypeDefenseSlot>();
slot.EditorConfigure(crystals[i], towerPrefab);
visual.AddComponent<NetworkObject>();
visual.AddComponent<PrototypeDefenseSlot>().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>(); camera.orthographic = true; camera.orthographicSize = 16f;
cameraObject.transform.position = new Vector3(0f, 30f, -62f);
cameraObject.transform.rotation = Quaternion.Euler(90f, 0f, 0f);
cameraObject.AddComponent<PrototypeCameraRig>();
var hud = cameraObject.AddComponent<PrototypeHud>(); hud.EditorConfigure(launcher, wave);
cameraObject.AddComponent<AudioListener>();
cameraObject.transform.position = new Vector3(0f, 30f, -62f); cameraObject.transform.rotation = Quaternion.Euler(90f, 0f, 0f);
cameraObject.AddComponent<SimpleCameraZFollow>().Configure(30f, 6f, 8f);
cameraObject.AddComponent<PrototypeHud>().EditorConfigure(launcher, wave); cameraObject.AddComponent<AudioListener>();
}
private static void BuildNavigation()
{
var navigation = new GameObject("Navigation (Reused EnemyAI)");
var surface = navigation.AddComponent<NavMeshSurface>(); surface.useGeometry = NavMeshCollectGeometry.PhysicsColliders;
surface.BuildNavMesh();
}
private static T CreateNetworkSceneObject<T>(string name, Vector3 position) where T : Component
{
var gameObject = new GameObject(name); gameObject.transform.position = position;
gameObject.AddComponent<NetworkObject>();
return gameObject.AddComponent<T>();
var gameObject = new GameObject(name); gameObject.transform.position = position; gameObject.AddComponent<NetworkObject>(); return gameObject.AddComponent<T>();
}
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<Collider>();
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<Renderer>().sharedMaterial = material;
return gameObject;
if (!collider) { var primitiveCollider = gameObject.GetComponent<Collider>(); 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<Renderer>().sharedMaterial = material; return gameObject;
}
private static T LoadRequired<T>(string path) where T : UnityEngine.Object
{
var asset = AssetDatabase.LoadAssetAtPath<T>(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<GameObject>(paths[i]); return result;
}
private static void AddToBuildSettings(string path)
{
var scenes = new List<EditorBuildSettingsScene>(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<GameObject> spawnables)
{
var prefabList = AssetDatabase.LoadAssetAtPath<NetworkPrefabsList>(PrefabListPath);
if (prefabList == null)
{
prefabList = ScriptableObject.CreateInstance<NetworkPrefabsList>();
AssetDatabase.CreateAsset(prefabList, PrefabListPath);
}
var desired = new List<GameObject> { player };
desired.AddRange(spawnables);
var existing = new List<NetworkPrefab>(prefabList.PrefabList);
foreach (var entry in existing) prefabList.Remove(entry);
if (prefabList == null) { prefabList = ScriptableObject.CreateInstance<NetworkPrefabsList>(); AssetDatabase.CreateAsset(prefabList, PrefabListPath); }
var desired = new List<GameObject> { player }; desired.AddRange(spawnables);
foreach (var entry in new List<NetworkPrefab>(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<NetworkPrefabsList>("Assets/DefaultNetworkPrefabs.asset");
if (defaultList != null)
{
foreach (var entry in new List<NetworkPrefab>(defaultList.PrefabList))
if (desired.Contains(entry.Prefab)) defaultList.Remove(entry);
foreach (var entry in new List<NetworkPrefab>(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<NetworkObject>() == null || player.GetComponent<PrototypePlayer>() == null)
throw new InvalidOperationException("Player prefab is incomplete.");
if (player.GetComponent<NetworkPlayerController>() == null || player.GetComponent<AttackAction>() == null || player.GetComponent<PrototypeSpecialAttack>() == null)
throw new InvalidOperationException("Reusable player variant is incomplete.");
foreach (var enemy in enemies)
if (enemy.GetComponent<NetworkObject>() == null || enemy.GetComponent<PrototypeEnemy>() == null)
throw new InvalidOperationException($"Enemy prefab is incomplete: {enemy.name}");
if (tower.GetComponent<NetworkObject>() == 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<EnemyUnit>() == null || enemy.GetComponent<EnemyAIController>() == null || enemy.GetComponent<MonsterDataComponent>() == null)
throw new InvalidOperationException($"Reusable enemy prefab is incomplete: {enemy.name}");
if (tower.GetComponent<Building>() == null || portals.Length != 4 || crystals.Length != 3 || UnityEngine.Object.FindAnyObjectByType<GlobalTimer>() == null)
throw new InvalidOperationException("Reusable prototype scope validation failed.");
}
}
}
@@ -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
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: bce46cc4fcdf4964db22a043d147b739
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 2100000
userData:
assetBundleName:
assetBundleVariant:
@@ -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
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 0a698bf6bb63d87478cac34b0f68c142
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 2100000
userData:
assetBundleName:
assetBundleVariant:
@@ -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
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 102393053b60ece44b904614372d6870
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 2100000
userData:
assetBundleName:
assetBundleVariant:
@@ -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
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: a89357393ee87964fa2f7116f9d159de
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 2100000
userData:
assetBundleName:
assetBundleVariant:
@@ -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
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 7731605e2e21ed94fa6f9f66ecad2912
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 2100000
userData:
assetBundleName:
assetBundleVariant:
@@ -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
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 5ea9b08c6c96a5841858a20ccc70924a
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 2100000
userData:
assetBundleName:
assetBundleVariant:
@@ -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
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 92f8ac4e67debf8479c82def6f3836b4
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 2100000
userData:
assetBundleName:
assetBundleVariant:
@@ -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}
@@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: ff6c084700aabbc489c6c0e56506cf06
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -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}
@@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 6283a318d09055c4f87992c5c47ea18f
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -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
@@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 9d32d65f4d76dcb4ebd0debe3c504625
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -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
@@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 6a48fd333dbaeba41a27f5c3ad884627
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -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}
@@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 2f53defa3aa7c474994f1e59a903be4f
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -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
@@ -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}
@@ -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<PortalSite> 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<PortalState> State = new();
public readonly NetworkVariable<float> Health = new();
private readonly Dictionary<ulong, float> 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<EnemyPortal>(); gate = GetComponent<TeamGate>(); }
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<PrototypePlayer>();
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<EnemyPortal>(); gate = GetComponent<TeamGate>();
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
@@ -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);
}
}
}
@@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: aadf8f3e54a5c63428969e2d8151f4a6
@@ -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<float> 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);
}
}
}
@@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: b33daae417e65af48a958114a2390cf8
@@ -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<PrototypeCrystalOutpost> 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<bool> IsCaptured = new();
public readonly NetworkVariable<float> Health = new();
private readonly NetworkVariable<int> health = new();
private readonly NetworkVariable<TeamType> 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<EnemyUnit>())
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<EnemyUnit>())
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
@@ -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<PrototypeDefenseSlot> 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<bool> 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<NetworkObject>().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
}
}
@@ -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<PrototypeEnemy> 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<float> 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
}
}
@@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: 9a43da78fc3aae144a68b43728a90ca5
@@ -29,6 +29,12 @@ namespace Northbound.Prototype
private void Update()
{
if (!IsServer || Phase.Value != PrototypeGamePhase.Playing) return;
var core = FindAnyObjectByType<Core>();
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;
@@ -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<Core>();
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좌/우클릭 공격 · 회피/방어 없음");
@@ -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(); }
@@ -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<PrototypePlayer> 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<float> 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<IPrototypeDamageable>();
foreach (var hit in hits)
{
var target = hit.GetComponentInParent<IPrototypeDamageable>();
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);
}
}
}
@@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: 47e38d0512a8abd4c83eda8608e3ef9f
@@ -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<PrototypeWaveManager>().WaveNumber.Value == 1;
PrototypeGameState.Instance != null && FindAnyObjectByType<Core>() != null &&
FindObjectsByType<NetworkPlayerController>().Length == 1 && PortalSite.All.Count == 4 &&
PrototypeCrystalOutpost.All.Count == 3 && FindObjectsByType<EnemyUnit>().Length > 0 &&
FindAnyObjectByType<PrototypeWaveManager>().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<EnemyUnit>().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<PrototypeCrystalOutpost>(FindObjectsSortMode.None))
int playerCount = FindObjectsByType<NetworkPlayerController>().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<PrototypeCrystalOutpost>())
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
@@ -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<PlayerStats>(); teamMember = GetComponent<ITeamMember>(); }
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<IDamageable>();
foreach (var hit in Physics.OverlapSphere(center, radius))
{
if (hit.transform.root == transform.root) continue;
var target = hit.GetComponentInParent<IDamageable>();
if (target == null || target.IsDead() || damaged.Contains(target)) continue;
var targetTeam = hit.GetComponentInParent<ITeamMember>();
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;
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: c645a5457e4901d4199afde290b51961
@@ -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);
}
}
}
@@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: 4f17758c8b6cecf4d8246570583e22dd
@@ -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);
}
}
@@ -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<int> WaveNumber = new();
public readonly NetworkVariable<int> ResonanceSnapshot = new();
public readonly NetworkVariable<float> 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<PortalSite>();
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<MonsterDataComponent>()?.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<NetworkObject>().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<GameObject>(); float totalWeight = 0f;
foreach (var prefab in enemyPrefabs)
{
if (prefab == null) continue;
var data = prefab.GetComponent<MonsterDataComponent>()?.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<MonsterDataComponent>().monsterData.weight);
if (roll <= 0f) return prefab;
}
return eligible[0];
}
private void ApplyResonance(GameObject enemy)
{
int resonance = ResonanceSnapshot.Value;
var unit = enemy.GetComponent<EnemyUnit>();
var ai = enemy.GetComponent<EnemyAIController>();
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
}
}
+11 -1
View File
@@ -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<IDamageable>();
var targetTeamMember = hit.GetComponent<ITeamMember>();
+46 -6
View File
@@ -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<ulong> 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()
+25 -13
View File
@@ -17,6 +17,8 @@ namespace Northbound
private Dictionary<ulong, int> _clientSpawnIndices = new Dictionary<ulong, int>();
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<NetworkManager>();
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;
}
}
}
+23 -4
View File
@@ -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<AttackAction>();
var playerInteraction = GetComponent<PlayerInteraction>();
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();
+16
View File
@@ -17,6 +17,10 @@ namespace Northbound
[Header("Animation")]
public bool playAnimations = true;
[Header("Secondary Action")]
[Tooltip("우클릭으로 실행할 액션 이름. 비어 있으면 사용하지 않습니다.")]
public string secondaryActionName = "";
private Dictionary<string, IAction> _actions = new Dictionary<string, IAction>();
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))
+10 -1
View File
@@ -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<NetworkPlayerController>();
foreach (var player in players)
{
if (player.IsOwner)
if (player.IsLocalPlayer)
{
target = player.transform;
Debug.Log($"<color=green>[Camera] Target found: {player.name}</color>");