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

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
+1 -5
View File
@@ -58,9 +58,7 @@
<Compile Include="Assets\Scripts\EnemyUnit.cs" /> <Compile Include="Assets\Scripts\EnemyUnit.cs" />
<Compile Include="Assets\Scripts\TeamType.cs" /> <Compile Include="Assets\Scripts\TeamType.cs" />
<Compile Include="Assets\Scripts\CoreResourceManager.cs" /> <Compile Include="Assets\Scripts\CoreResourceManager.cs" />
<Compile Include="Assets\NorthboundPrototype\Scripts\PrototypeCameraRig.cs" />
<Compile Include="Assets\Scripts\PlayerVisionProvider.cs" /> <Compile Include="Assets\Scripts\PlayerVisionProvider.cs" />
<Compile Include="Assets\NorthboundPrototype\Scripts\PrototypePlayer.cs" />
<Compile Include="Assets\Scripts\EquipmentSocket.cs" /> <Compile Include="Assets\Scripts\EquipmentSocket.cs" />
<Compile Include="Assets\Scripts\ContinuousPortMonitor.cs" /> <Compile Include="Assets\Scripts\ContinuousPortMonitor.cs" />
<Compile Include="Assets\Scripts\TeamManager.cs" /> <Compile Include="Assets\Scripts\TeamManager.cs" />
@@ -71,7 +69,6 @@
<Compile Include="Assets\Scripts\UI\TeamHealthUI.cs" /> <Compile Include="Assets\Scripts\UI\TeamHealthUI.cs" />
<Compile Include="Assets\Scripts\AutoTargetSystem.cs" /> <Compile Include="Assets\Scripts\AutoTargetSystem.cs" />
<Compile Include="Assets\Scripts\BuildingSlotButton.cs" /> <Compile Include="Assets\Scripts\BuildingSlotButton.cs" />
<Compile Include="Assets\NorthboundPrototype\Scripts\PrototypeCore.cs" />
<Compile Include="Assets\FlatKit\[Render Pipeline] URP\Water\Scripts\Buoyancy.cs" /> <Compile Include="Assets\FlatKit\[Render Pipeline] URP\Water\Scripts\Buoyancy.cs" />
<Compile Include="Assets\Scripts\ObstacleSpawner.cs" /> <Compile Include="Assets\Scripts\ObstacleSpawner.cs" />
<Compile Include="Assets\Scripts\UnitHealthBar.cs" /> <Compile Include="Assets\Scripts\UnitHealthBar.cs" />
@@ -85,7 +82,6 @@
<Compile Include="Assets\Scripts\RespawnCountdownUI.cs" /> <Compile Include="Assets\Scripts\RespawnCountdownUI.cs" />
<Compile Include="Assets\Scripts\PlayerSpawnPoint.cs" /> <Compile Include="Assets\Scripts\PlayerSpawnPoint.cs" />
<Compile Include="Assets\FlatKit\Demos\Common\Scripts\AutoLoadPipelineAsset.cs" /> <Compile Include="Assets\FlatKit\Demos\Common\Scripts\AutoLoadPipelineAsset.cs" />
<Compile Include="Assets\NorthboundPrototype\Scripts\PrototypeTower.cs" />
<Compile Include="Assets\NorthboundPrototype\Scripts\PortalSite.cs" /> <Compile Include="Assets\NorthboundPrototype\Scripts\PortalSite.cs" />
<Compile Include="Assets\Scripts\MonsterAnimationController.cs" /> <Compile Include="Assets\Scripts\MonsterAnimationController.cs" />
<Compile Include="Assets\Scripts\IVisionProvider.cs" /> <Compile Include="Assets\Scripts\IVisionProvider.cs" />
@@ -119,7 +115,6 @@
<Compile Include="Assets\Scripts\SimpleCameraZFollow.cs" /> <Compile Include="Assets\Scripts\SimpleCameraZFollow.cs" />
<Compile Include="Assets\NorthboundPrototype\Scripts\PrototypeNetworkLauncher.cs" /> <Compile Include="Assets\NorthboundPrototype\Scripts\PrototypeNetworkLauncher.cs" />
<Compile Include="Assets\Scripts\GameResourceUI.cs" /> <Compile Include="Assets\Scripts\GameResourceUI.cs" />
<Compile Include="Assets\NorthboundPrototype\Scripts\PrototypeEnemy.cs" />
<Compile Include="Assets\Scripts\FogOfWarRenderer.cs" /> <Compile Include="Assets\Scripts\FogOfWarRenderer.cs" />
<Compile Include="Assets\Scripts\ResourcePickup.cs" /> <Compile Include="Assets\Scripts\ResourcePickup.cs" />
<Compile Include="Assets\FlatKit\Demos\Common\Scripts\Motion\OrbitMotion.cs" /> <Compile Include="Assets\FlatKit\Demos\Common\Scripts\Motion\OrbitMotion.cs" />
@@ -130,6 +125,7 @@
<Compile Include="Assets\Data\Scripts\DataClasses\PlayerData.cs" /> <Compile Include="Assets\Data\Scripts\DataClasses\PlayerData.cs" />
<Compile Include="Assets\Scripts\Worker.cs" /> <Compile Include="Assets\Scripts\Worker.cs" />
<Compile Include="Assets\Scripts\IHealthProvider.cs" /> <Compile Include="Assets\Scripts\IHealthProvider.cs" />
<Compile Include="Assets\NorthboundPrototype\Scripts\PrototypeSpecialAttack.cs" />
<Compile Include="Assets\Scripts\WorkerSpawner.cs" /> <Compile Include="Assets\Scripts\WorkerSpawner.cs" />
<Compile Include="Assets\Scripts\CreepDataComponent.cs" /> <Compile Include="Assets\Scripts\CreepDataComponent.cs" />
<Compile Include="Assets\Scripts\PlayerStats.cs" /> <Compile Include="Assets\Scripts\PlayerStats.cs" />
+5
View File
@@ -214,3 +214,8 @@ MonoBehaviour:
SourcePrefabToOverride: {fileID: 0} SourcePrefabToOverride: {fileID: 0}
SourceHashToOverride: 0 SourceHashToOverride: 0
OverridingTargetPrefab: {fileID: 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 static class PrototypePlayModeSmoke
{ {
public const string SessionKey = "Northbound.Prototype.InteractiveSmoke";
[MenuItem("Northbound/Run Gameplay Prototype Smoke Test")]
public static void Start() 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"); EditorSceneManager.OpenScene("Assets/NorthboundPrototype/Scenes/NorthboundGameplayPrototype.unity");
EditorApplication.isPlaying = true; EditorApplication.isPlaying = true;
} }
@@ -1,12 +1,13 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using Unity.AI.Navigation;
using Unity.Netcode; using Unity.Netcode;
using Unity.Netcode.Components;
using Unity.Netcode.Transports.UTP; using Unity.Netcode.Transports.UTP;
using UnityEditor; using UnityEditor;
using UnityEditor.SceneManagement; using UnityEditor.SceneManagement;
using UnityEngine; using UnityEngine;
using UnityEngine.AI;
using UnityEngine.SceneManagement; using UnityEngine.SceneManagement;
namespace Northbound.Prototype.Editor namespace Northbound.Prototype.Editor
@@ -24,72 +25,81 @@ namespace Northbound.Prototype.Editor
public static void Build() public static void Build()
{ {
EnsureFolders(); EnsureFolders();
CleanupObsoletePrototypeAssets();
var palette = CreatePalette(); var palette = CreatePalette();
GameObject playerPrefab = CreatePlayerPrefab(palette["Player"]); GameObject playerPrefab = CreatePlayerVariant();
var enemyPrefabs = new[] GameObject[] enemyPrefabs = LoadPrefabs(new[]
{ {
CreateEnemyPrefab("Enemy_Grunt", EnemyRole.Grunt, 55f, 8f, 2.4f, palette["Enemy"]), "Assets/Prefabs/Monster/Monster101.prefab", "Assets/Prefabs/Monster/Monster102.prefab",
CreateEnemyPrefab("Enemy_Raider", EnemyRole.Raider, 48f, 7f, 2.9f, palette["Raider"]), "Assets/Prefabs/Monster/Monster103.prefab", "Assets/Prefabs/Monster/Monster104.prefab",
CreateEnemyPrefab("Enemy_Digger", EnemyRole.Digger, 75f, 10f, 2f, palette["Digger"]), "Assets/Prefabs/Monster/Monster105.prefab"
CreateEnemyPrefab("Enemy_Elite", EnemyRole.Elite, 150f, 18f, 1.8f, palette["Elite"]) });
}; GameObject towerPrefab = LoadRequired<GameObject>("Assets/Prefabs/Tower/Tower1.prefab");
GameObject towerPrefab = CreateTowerPrefab(palette["Allied"]); GameObject corePrefab = LoadRequired<GameObject>("Assets/Prefabs/Core.prefab");
Scene scene = EditorSceneManager.NewScene(NewSceneSetup.EmptyScene, NewSceneMode.Single); Scene scene = EditorSceneManager.NewScene(NewSceneSetup.EmptyScene, NewSceneMode.Single);
scene.name = "NorthboundGameplayPrototype"; scene.name = "NorthboundGameplayPrototype";
CreateEnvironment(palette); CreateEnvironment(palette);
CreateSpawnPoints();
var networkRoot = new GameObject("Network Runtime"); var networkRoot = new GameObject("Network Runtime");
var manager = networkRoot.AddComponent<NetworkManager>(); var manager = networkRoot.AddComponent<NetworkManager>();
var transport = networkRoot.AddComponent<UnityTransport>(); var transport = networkRoot.AddComponent<UnityTransport>();
networkRoot.AddComponent<NetworkConnectionHandler>();
var launcher = networkRoot.AddComponent<PrototypeNetworkLauncher>(); var launcher = networkRoot.AddComponent<PrototypeNetworkLauncher>();
networkRoot.AddComponent<PrototypeSmokeRunner>(); networkRoot.AddComponent<PrototypeSmokeRunner>();
manager.NetworkConfig.NetworkTransport = transport; manager.NetworkConfig.NetworkTransport = transport;
manager.NetworkConfig.PlayerPrefab = playerPrefab; manager.NetworkConfig.PlayerPrefab = playerPrefab;
manager.NetworkConfig.ConnectionApproval = true;
var spawnables = new List<GameObject>(enemyPrefabs) { towerPrefab }; var spawnables = new List<GameObject>(enemyPrefabs) { towerPrefab };
ConfigureNetworkPrefabs(manager, playerPrefab, spawnables); ConfigureNetworkPrefabs(manager, playerPrefab, spawnables);
launcher.EditorConfigure(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 wave = CreateNetworkSceneObject<PrototypeWaveManager>("Wave Manager", Vector3.zero);
var enemyComponents = Array.ConvertAll(enemyPrefabs, item => item.GetComponent<PrototypeEnemy>()); wave.EditorConfigure(timer, enemyPrefabs);
wave.EditorConfigure(enemyComponents);
CreateCore(palette["Core"]); CreateCore(corePrefab);
PortalSite[] portals = CreatePortals(palette); PortalSite[] portals = CreatePortals(palette);
var crystals = CreateCrystals(palette["Crystal"]); var crystals = CreateCrystals(palette["Crystal"]);
CreateDefenseSlots(crystals, towerPrefab.GetComponent<PrototypeTower>(), palette["Slot"]); CreateDefenseSlots(crystals, towerPrefab, palette["Slot"]);
CreateCameraAndHud(launcher, wave); CreateCameraAndHud(launcher, wave);
EditorSceneManager.MarkSceneDirty(scene); EditorSceneManager.MarkSceneDirty(scene);
EditorSceneManager.SaveScene(scene, ScenePath); EditorSceneManager.SaveScene(scene, ScenePath);
BuildNavigation();
EditorSceneManager.SaveScene(scene, ScenePath);
AddToBuildSettings(ScenePath); AddToBuildSettings(ScenePath);
AssetDatabase.SaveAssets(); AssetDatabase.SaveAssets();
AssetDatabase.Refresh(); AssetDatabase.Refresh();
Validate(playerPrefab, enemyPrefabs, towerPrefab, portals, crystals); 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() private static void EnsureFolders()
{ {
Directory.CreateDirectory(Root + "/Scenes"); Directory.CreateDirectory(Root + "/Scenes"); Directory.CreateDirectory(Prefabs); Directory.CreateDirectory(Materials);
Directory.CreateDirectory(Prefabs);
Directory.CreateDirectory(Materials);
AssetDatabase.Refresh(); 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() private static Dictionary<string, Material> CreatePalette()
{ {
var colors = new Dictionary<string, Color> var colors = new Dictionary<string, Color>
{ {
["Ground"] = new(0.08f, 0.11f, 0.14f), ["Road"] = new(0.16f, 0.2f, 0.23f), ["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), ["Wall"] = new(0.08f, 0.3f, 0.34f), ["Allied"] = new(0.1f, 0.72f, 1f),
["Enemy"] = new(0.85f, 0.16f, 0.24f), ["Raider"] = new(1f, 0.42f, 0.12f), ["PortalEnemy"] = new(0.8f, 0.1f, 0.65f), ["Crystal"] = new(0.4f, 0.25f, 0.9f),
["Digger"] = new(0.65f, 0.28f, 0.13f), ["Elite"] = new(0.85f, 0.1f, 0.75f), ["Slot"] = new(0.25f, 0.38f, 0.42f)
["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)
}; };
var result = new Dictionary<string, Material>(); var result = new Dictionary<string, Material>();
Shader shader = Shader.Find("Universal Render Pipeline/Lit") ?? Shader.Find("Standard"); 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"; string path = $"{Materials}/{pair.Key}.mat";
var material = AssetDatabase.LoadAssetAtPath<Material>(path); var material = AssetDatabase.LoadAssetAtPath<Material>(path);
if (material == null) { material = new Material(shader); AssetDatabase.CreateAsset(material, path); } if (material == null) { material = new Material(shader); AssetDatabase.CreateAsset(material, path); }
material.color = pair.Value; material.color = pair.Value; EditorUtility.SetDirty(material); result[pair.Key] = material;
EditorUtility.SetDirty(material);
result[pair.Key] = material;
} }
return result; return result;
} }
private static GameObject CreatePlayerPrefab(Material material) private static GameObject CreatePlayerVariant()
{ {
string path = Prefabs + "/Player.prefab"; string path = Prefabs + "/Player.prefab";
var root = new GameObject("Prototype Player"); GameObject source = LoadRequired<GameObject>("Assets/Prefabs/Player/Player.prefab");
root.AddComponent<NetworkObject>(); AssetDatabase.DeleteAsset(path);
root.AddComponent<NetworkTransform>(); var instance = (GameObject)PrefabUtility.InstantiatePrefab(source);
root.AddComponent<CapsuleCollider>(); instance.name = "Prototype Player (Player Variant)";
root.AddComponent<PrototypePlayer>(); var controller = instance.GetComponent<NetworkPlayerController>(); controller.ConfigurePrototypeMode();
var body = CreatePrimitive("Body", PrimitiveType.Capsule, root.transform, Vector3.zero, new Vector3(0.8f, 0.8f, 0.8f), material, false); var attack = instance.GetComponent<AttackAction>();
CreatePrimitive("Facing", PrimitiveType.Cube, root.transform, new Vector3(0f, 0.15f, 0.75f), new Vector3(0.25f, 0.25f, 0.75f), material, false); attack.useFacingArc = true; attack.minimumFacingDot = 0.2f; attack.useAnimationEvents = false;
var prefab = PrefabUtility.SaveAsPrefabAsset(root, path); attack.blockDuringAnimation = false; attack.useEquipment = false; attack.attackAnimationTrigger = string.Empty;
UnityEngine.Object.DestroyImmediate(root); 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; 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 component = gameObject.GetComponent<T>(); if (component != null) component.enabled = false;
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;
} }
private static void CreateEnvironment(Dictionary<string, Material> palette) 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("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("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"]); CreatePrimitive("East Boundary", PrimitiveType.Cube, null, new Vector3(17f, 1f, 3f), new Vector3(1f, 3f, 180f), palette["Wall"]);
float[] bandZ = { -62f, -20f, 25f, 70f }; float[] bands = { -62f, -20f, 25f, 70f };
string[] names = { "본진", "첫 확장", "포탈 전초", "최종 코어" }; 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);
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"]);
var lightObject = new GameObject("Directional Light"); var lightObject = new GameObject("Directional Light");
var light = lightObject.AddComponent<Light>(); light.type = LightType.Directional; light.intensity = 1.3f; var light = lightObject.AddComponent<Light>(); light.type = LightType.Directional; light.intensity = 1.3f;
lightObject.transform.rotation = Quaternion.Euler(55f, -30f, 0f); 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)); for (int i = 0; i < 4; i++)
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); 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) private static PortalSite[] CreatePortals(Dictionary<string, Material> palette)
@@ -179,19 +181,27 @@ namespace Northbound.Prototype.Editor
var portals = new PortalSite[z.Length]; var portals = new PortalSite[z.Length];
for (int i = 0; i < z.Length; i++) for (int i = 0; i < z.Length; i++)
{ {
portals[i] = CreateNetworkSceneObject<PortalSite>($"P{i} Portal Site", new Vector3(0f, 0.5f, z[i])); var root = new GameObject($"P{i} Portal Site"); root.transform.position = new Vector3(0f, 0.4f, z[i]);
var trigger = portals[i].gameObject.AddComponent<BoxCollider>(); root.AddComponent<NetworkObject>(); root.AddComponent<EnemyPortal>(); root.AddComponent<TeamGate>();
trigger.size = new Vector3(4.5f, 2f, 2.5f); portals[i] = root.AddComponent<PortalSite>();
trigger.isTrigger = true; var detection = root.AddComponent<SphereCollider>(); detection.radius = 2.3f; detection.isTrigger = true;
var visual = CreatePrimitive("Portal Ring", PrimitiveType.Cylinder, portals[i].transform, Vector3.zero, 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;
new Vector3(2.2f, 0.25f, 2.2f), states[i] == PortalState.Allied ? palette["Allied"] : palette["PortalEnemy"], false); 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;
portals[i].EditorConfigure(i, i == z.Length - 1, states[i], null, null, visual.GetComponent<Renderer>()); 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++) 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);
portals[i].EditorSetNeighbors(i > 0 ? portals[i - 1] : null, i + 1 < portals.Length ? portals[i + 1] : null);
return portals; 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) private static PrototypeCrystalOutpost[] CreateCrystals(Material material)
{ {
Vector3[] positions = { new(-8f, 0.8f, -43f), new(8f, 0.8f, 2f), new(-8f, 0.8f, 48f) }; 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]); result[i] = CreateNetworkSceneObject<PrototypeCrystalOutpost>($"Crystal Outpost {i + 1}", positions[i]);
var collider = result[i].gameObject.AddComponent<SphereCollider>(); collider.radius = 1.2f; 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); 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); visual.transform.rotation = Quaternion.Euler(0f, 45f, 45f); result[i].EditorConfigure(visual.GetComponent<Renderer>());
result[i].EditorConfigure(visual.GetComponent<Renderer>());
} }
return result; 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++) for (int i = 0; i < crystals.Length; i++)
{ {
var visual = CreatePrimitive($"Defense Slot {i + 1}", PrimitiveType.Cylinder, null, 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); 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>(); visual.AddComponent<NetworkObject>();
slot.EditorConfigure(crystals[i], towerPrefab); visual.AddComponent<PrototypeDefenseSlot>().EditorConfigure(crystals[i], towerPrefab);
} }
} }
private static void CreateCameraAndHud(PrototypeNetworkLauncher launcher, PrototypeWaveManager wave) private static void CreateCameraAndHud(PrototypeNetworkLauncher launcher, PrototypeWaveManager wave)
{ {
var cameraObject = new GameObject("Main Camera"); var cameraObject = new GameObject("Main Camera"); cameraObject.tag = "MainCamera";
cameraObject.tag = "MainCamera";
var camera = cameraObject.AddComponent<Camera>(); camera.orthographic = true; camera.orthographicSize = 16f; var camera = cameraObject.AddComponent<Camera>(); camera.orthographic = true; camera.orthographicSize = 16f;
cameraObject.transform.position = new Vector3(0f, 30f, -62f); cameraObject.transform.position = new Vector3(0f, 30f, -62f); cameraObject.transform.rotation = Quaternion.Euler(90f, 0f, 0f);
cameraObject.transform.rotation = Quaternion.Euler(90f, 0f, 0f); cameraObject.AddComponent<SimpleCameraZFollow>().Configure(30f, 6f, 8f);
cameraObject.AddComponent<PrototypeCameraRig>(); cameraObject.AddComponent<PrototypeHud>().EditorConfigure(launcher, wave); cameraObject.AddComponent<AudioListener>();
var hud = cameraObject.AddComponent<PrototypeHud>(); hud.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 private static T CreateNetworkSceneObject<T>(string name, Vector3 position) where T : Component
{ {
var gameObject = new GameObject(name); gameObject.transform.position = position; var gameObject = new GameObject(name); gameObject.transform.position = position; gameObject.AddComponent<NetworkObject>(); return gameObject.AddComponent<T>();
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) 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; var gameObject = GameObject.CreatePrimitive(type); gameObject.name = name;
if (!collider) 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;
var primitiveCollider = gameObject.GetComponent<Collider>(); gameObject.transform.localScale = scale; gameObject.GetComponent<Renderer>().sharedMaterial = material; return gameObject;
if (primitiveCollider != null) UnityEngine.Object.DestroyImmediate(primitiveCollider);
} }
if (parent != null) { gameObject.transform.SetParent(parent, false); gameObject.transform.localPosition = position; }
else gameObject.transform.position = position; private static T LoadRequired<T>(string path) where T : UnityEngine.Object
gameObject.transform.localScale = scale; {
gameObject.GetComponent<Renderer>().sharedMaterial = material; var asset = AssetDatabase.LoadAssetAtPath<T>(path); if (asset == null) throw new InvalidOperationException($"Required reusable asset is missing: {path}"); return asset;
return gameObject; }
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) private static void AddToBuildSettings(string path)
{ {
var scenes = new List<EditorBuildSettingsScene>(EditorBuildSettings.scenes); var scenes = new List<EditorBuildSettingsScene>(EditorBuildSettings.scenes);
if (scenes.Exists(item => item.path == path)) return; if (!scenes.Exists(item => item.path == path)) scenes.Add(new EditorBuildSettingsScene(path, true));
scenes.Add(new EditorBuildSettingsScene(path, true));
EditorBuildSettings.scenes = scenes.ToArray(); EditorBuildSettings.scenes = scenes.ToArray();
} }
private static void ConfigureNetworkPrefabs(NetworkManager manager, GameObject player, List<GameObject> spawnables) private static void ConfigureNetworkPrefabs(NetworkManager manager, GameObject player, List<GameObject> spawnables)
{ {
var prefabList = AssetDatabase.LoadAssetAtPath<NetworkPrefabsList>(PrefabListPath); var prefabList = AssetDatabase.LoadAssetAtPath<NetworkPrefabsList>(PrefabListPath);
if (prefabList == null) if (prefabList == null) { prefabList = ScriptableObject.CreateInstance<NetworkPrefabsList>(); AssetDatabase.CreateAsset(prefabList, PrefabListPath); }
{ var desired = new List<GameObject> { player }; desired.AddRange(spawnables);
prefabList = ScriptableObject.CreateInstance<NetworkPrefabsList>(); foreach (var entry in new List<NetworkPrefab>(prefabList.PrefabList)) prefabList.Remove(entry);
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);
foreach (var prefab in desired) prefabList.Add(new NetworkPrefab { Override = NetworkPrefabOverride.None, Prefab = prefab }); 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"); var defaultList = AssetDatabase.LoadAssetAtPath<NetworkPrefabsList>("Assets/DefaultNetworkPrefabs.asset");
if (defaultList != null) if (defaultList != null)
{ {
foreach (var entry in new List<NetworkPrefab>(defaultList.PrefabList)) foreach (var entry in new List<NetworkPrefab>(defaultList.PrefabList)) if (desired.Contains(entry.Prefab)) defaultList.Remove(entry);
if (desired.Contains(entry.Prefab)) defaultList.Remove(entry);
EditorUtility.SetDirty(defaultList); EditorUtility.SetDirty(defaultList);
} }
EditorUtility.SetDirty(prefabList); 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) private static void Validate(GameObject player, GameObject[] enemies, GameObject tower, PortalSite[] portals, PrototypeCrystalOutpost[] crystals)
{ {
if (player.GetComponent<NetworkObject>() == null || player.GetComponent<PrototypePlayer>() == null) if (player.GetComponent<NetworkPlayerController>() == null || player.GetComponent<AttackAction>() == null || player.GetComponent<PrototypeSpecialAttack>() == null)
throw new InvalidOperationException("Player prefab is incomplete."); throw new InvalidOperationException("Reusable player variant is incomplete.");
foreach (var enemy in enemies) foreach (var enemy in enemies)
if (enemy.GetComponent<NetworkObject>() == null || enemy.GetComponent<PrototypeEnemy>() == null) if (enemy.GetComponent<EnemyUnit>() == null || enemy.GetComponent<EnemyAIController>() == null || enemy.GetComponent<MonsterDataComponent>() == null)
throw new InvalidOperationException($"Enemy prefab is incomplete: {enemy.name}"); throw new InvalidOperationException($"Reusable enemy prefab is incomplete: {enemy.name}");
if (tower.GetComponent<NetworkObject>() == null || portals.Length != 4 || crystals.Length != 3) if (tower.GetComponent<Building>() == null || portals.Length != 4 || crystals.Length != 3 || UnityEngine.Object.FindAnyObjectByType<GlobalTimer>() == null)
throw new InvalidOperationException("Prototype scope validation failed."); throw new InvalidOperationException("Reusable 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.");
} }
} }
} }
@@ -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 %YAML 1.1
%TAG !u! tag:unity3d.com,2011: %TAG !u! tag:unity3d.com,2011:
--- !u!1 &1469678369176762886 --- !u!1001 &3319709612200465506
GameObject: PrefabInstance:
m_ObjectHideFlags: 0 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 serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_Modification:
m_LocalPosition: {x: 0, y: 0, z: 0} serializedVersion: 3
m_LocalScale: {x: 0.8, y: 0.8, z: 0.8} m_TransformParent: {fileID: 0}
m_ConstrainProportionsScale: 0 m_Modifications:
m_Children: [] - target: {fileID: 1314983689436087486, guid: 6c700f44a7d74e141a002e9484d2057c, type: 3}
m_Father: {fileID: 6373439727280873961} propertyPath: m_Name
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} value: Player
--- !u!33 &855754173299961746 objectReference: {fileID: 0}
MeshFilter: - target: {fileID: 1883169379180791275, guid: 6c700f44a7d74e141a002e9484d2057c, type: 3}
m_ObjectHideFlags: 0 propertyPath: m_Enabled
m_CorrespondingSourceObject: {fileID: 0} value: 0
m_PrefabInstance: {fileID: 0} objectReference: {fileID: 0}
m_PrefabAsset: {fileID: 0} - target: {fileID: 2148255267416253297, guid: 6c700f44a7d74e141a002e9484d2057c, type: 3}
m_GameObject: {fileID: 1469678369176762886} propertyPath: m_Enabled
m_Mesh: {fileID: 10208, guid: 0000000000000000e000000000000000, type: 0} value: 0
--- !u!23 &2883844877114008318 objectReference: {fileID: 0}
MeshRenderer: - target: {fileID: 2443072964133329520, guid: 6c700f44a7d74e141a002e9484d2057c, type: 3}
m_ObjectHideFlags: 0 propertyPath: m_Enabled
m_CorrespondingSourceObject: {fileID: 0} value: 0
m_PrefabInstance: {fileID: 0} objectReference: {fileID: 0}
m_PrefabAsset: {fileID: 0} - target: {fileID: 3792365921352178844, guid: 6c700f44a7d74e141a002e9484d2057c, type: 3}
m_GameObject: {fileID: 1469678369176762886} propertyPath: respawnDelay
m_Enabled: 1 value: 3
m_CastShadows: 1 objectReference: {fileID: 0}
m_ReceiveShadows: 1 - target: {fileID: 3792365921352178844, guid: 6c700f44a7d74e141a002e9484d2057c, type: 3}
m_DynamicOccludee: 1 propertyPath: dropResourcesOnDeath
m_StaticShadowCaster: 0 value: 0
m_MotionVectors: 1 objectReference: {fileID: 0}
m_LightProbeUsage: 1 - target: {fileID: 3792365921352178844, guid: 6c700f44a7d74e141a002e9484d2057c, type: 3}
m_ReflectionProbeUsage: 1 propertyPath: blockMovementDuringAttack
m_RayTracingMode: 2 value: 0
m_RayTraceProcedural: 0 objectReference: {fileID: 0}
m_RayTracingAccelStructBuildFlagsOverride: 0 - target: {fileID: 5217638038410020423, guid: 6c700f44a7d74e141a002e9484d2057c, type: 3}
m_RayTracingAccelStructBuildFlags: 1 propertyPath: playAnimations
m_SmallMeshCulling: 1 value: 0
m_ForceMeshLod: -1 objectReference: {fileID: 0}
m_MeshLodSelectionBias: 0 - target: {fileID: 5217638038410020423, guid: 6c700f44a7d74e141a002e9484d2057c, type: 3}
m_RenderingLayerMask: 1 propertyPath: secondaryActionName
m_RendererPriority: 0 value: SpecialAttack
m_Materials: objectReference: {fileID: 0}
- {fileID: 2100000, guid: 7731605e2e21ed94fa6f9f66ecad2912, type: 2} - target: {fileID: 5217638038410020423, guid: 6c700f44a7d74e141a002e9484d2057c, type: 3}
m_StaticBatchInfo: propertyPath: actionComponents.Array.size
firstSubMesh: 0 value: 2
subMeshCount: 0 objectReference: {fileID: 0}
m_StaticBatchRoot: {fileID: 0} - target: {fileID: 5217638038410020423, guid: 6c700f44a7d74e141a002e9484d2057c, type: 3}
m_ProbeAnchor: {fileID: 0} propertyPath: 'actionComponents.Array.data[1]'
m_LightProbeVolumeOverride: {fileID: 0} value:
m_ScaleInLightmap: 1 objectReference: {fileID: 1026917702892562607}
m_ReceiveGI: 1 - target: {fileID: 5887522270574905679, guid: 6c700f44a7d74e141a002e9484d2057c, type: 3}
m_PreserveUVs: 1 propertyPath: m_LocalPosition.x
m_IgnoreNormalsForChartDetection: 0 value: 0
m_ImportantGI: 0 objectReference: {fileID: 0}
m_StitchLightmapSeams: 1 - target: {fileID: 5887522270574905679, guid: 6c700f44a7d74e141a002e9484d2057c, type: 3}
m_SelectedEditorRenderState: 3 propertyPath: m_LocalPosition.y
m_MinimumChartSize: 4 value: 1
m_AutoUVMaxDistance: 0.5 objectReference: {fileID: 0}
m_AutoUVMaxAngle: 89 - target: {fileID: 5887522270574905679, guid: 6c700f44a7d74e141a002e9484d2057c, type: 3}
m_LightmapParameters: {fileID: 0} propertyPath: m_LocalPosition.z
m_GlobalIlluminationMeshLod: 0 value: 0
m_SortingLayerID: 0 objectReference: {fileID: 0}
m_SortingLayer: 0 - target: {fileID: 5887522270574905679, guid: 6c700f44a7d74e141a002e9484d2057c, type: 3}
m_SortingOrder: 0 propertyPath: m_LocalRotation.w
m_MaskInteraction: 0 value: 1
m_AdditionalVertexStreams: {fileID: 0} objectReference: {fileID: 0}
--- !u!1 &3305664295896478561 - 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: GameObject:
m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 1314983689436087486, guid: 6c700f44a7d74e141a002e9484d2057c, type: 3}
m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 3319709612200465506}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
serializedVersion: 6 --- !u!114 &1026917702892562607
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
MonoBehaviour: MonoBehaviour:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0} m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0} m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3305664295896478561} m_GameObject: {fileID: 4336466159322648796}
m_Enabled: 1 m_Enabled: 1
m_EditorHideFlags: 0 m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} m_Script: {fileID: 11500000, guid: c645a5457e4901d4199afde290b51961, type: 3}
m_Name: m_Name:
m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.NetworkObject m_EditorClassIdentifier: Assembly-CSharp::Northbound.Prototype.PrototypeSpecialAttack
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
ShowTopMostFoldoutHeaderGroup: 1 ShowTopMostFoldoutHeaderGroup: 1
NetworkTransformExpanded: 0 cooldown: 4
AutoOwnerAuthorityTickOffset: 1 manaCost: 25
PositionInterpolationType: 0 range: 6
RotationInterpolationType: 0 radius: 3.5
ScaleInterpolationType: 0 damageMultiplier: 3
PositionLerpSmoothing: 1 minimumFacingDot: 0.05
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}
@@ -15,32 +15,37 @@ MonoBehaviour:
IsDefault: 0 IsDefault: 0
List: List:
- Override: 0 - Override: 0
Prefab: {fileID: 3305664295896478561, guid: 2a0bac19258f9514691bd9aff479dfea, type: 3} Prefab: {fileID: 4336466159322648796, guid: 2a0bac19258f9514691bd9aff479dfea, type: 3}
SourcePrefabToOverride: {fileID: 0} SourcePrefabToOverride: {fileID: 0}
SourceHashToOverride: 0 SourceHashToOverride: 0
OverridingTargetPrefab: {fileID: 0} OverridingTargetPrefab: {fileID: 0}
- Override: 0 - Override: 0
Prefab: {fileID: 4493379191484186568, guid: 6a48fd333dbaeba41a27f5c3ad884627, type: 3} Prefab: {fileID: 7146441246397375875, guid: eccdace7a7b21a446891da5739b1549f, type: 3}
SourcePrefabToOverride: {fileID: 0} SourcePrefabToOverride: {fileID: 0}
SourceHashToOverride: 0 SourceHashToOverride: 0
OverridingTargetPrefab: {fileID: 0} OverridingTargetPrefab: {fileID: 0}
- Override: 0 - Override: 0
Prefab: {fileID: 1976415545473119508, guid: 2f53defa3aa7c474994f1e59a903be4f, type: 3} Prefab: {fileID: 9065146123892903723, guid: 4ee9b364dfe9d0949a23374e660d3e13, type: 3}
SourcePrefabToOverride: {fileID: 0} SourcePrefabToOverride: {fileID: 0}
SourceHashToOverride: 0 SourceHashToOverride: 0
OverridingTargetPrefab: {fileID: 0} OverridingTargetPrefab: {fileID: 0}
- Override: 0 - Override: 0
Prefab: {fileID: 546703575891773344, guid: 6283a318d09055c4f87992c5c47ea18f, type: 3} Prefab: {fileID: 2347008446492047424, guid: 9cac250ebe8d420469bd4da3ab8cfd86, type: 3}
SourcePrefabToOverride: {fileID: 0} SourcePrefabToOverride: {fileID: 0}
SourceHashToOverride: 0 SourceHashToOverride: 0
OverridingTargetPrefab: {fileID: 0} OverridingTargetPrefab: {fileID: 0}
- Override: 0 - Override: 0
Prefab: {fileID: 3287245990848439041, guid: 9d32d65f4d76dcb4ebd0debe3c504625, type: 3} Prefab: {fileID: 4973514444862586119, guid: ff2924ffa397a8e44925625790831d25, type: 3}
SourcePrefabToOverride: {fileID: 0} SourcePrefabToOverride: {fileID: 0}
SourceHashToOverride: 0 SourceHashToOverride: 0
OverridingTargetPrefab: {fileID: 0} OverridingTargetPrefab: {fileID: 0}
- Override: 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} SourcePrefabToOverride: {fileID: 0}
SourceHashToOverride: 0 SourceHashToOverride: 0
OverridingTargetPrefab: {fileID: 0} OverridingTargetPrefab: {fileID: 0}
@@ -4,104 +4,114 @@ using UnityEngine;
namespace Northbound.Prototype namespace Northbound.Prototype
{ {
[RequireComponent(typeof(NetworkObject))] [RequireComponent(typeof(NetworkObject), typeof(EnemyPortal), typeof(TeamGate))]
public sealed class PortalSite : NetworkBehaviour, IPrototypeDamageable public sealed class PortalSite : NetworkBehaviour, IInteractable
{ {
public static readonly List<PortalSite> All = new(); public static readonly List<PortalSite> All = new();
[SerializeField] private int siteIndex; [SerializeField] private int siteIndex;
[SerializeField] private bool finalPortal; [SerializeField] private bool finalPortal;
[SerializeField] private PortalState initialState = PortalState.Enemy; [SerializeField] private PortalState initialState = PortalState.Enemy;
[SerializeField] private PortalSite southNeighbor; [SerializeField] private PortalSite southNeighbor;
[SerializeField] private PortalSite northNeighbor; [SerializeField] private PortalSite northNeighbor;
[SerializeField] private float maxHealth = 260f;
[SerializeField] private float rebuildCost = 60f; [SerializeField] private float rebuildCost = 60f;
[SerializeField] private Renderer stateRenderer; [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<PortalState> State = new();
public readonly NetworkVariable<float> Health = new(); private EnemyPortal portal;
private readonly Dictionary<ulong, float> teleportCooldown = new(); private TeamGate gate;
public int SiteIndex => siteIndex; public int SiteIndex => siteIndex;
public bool IsFinal => finalPortal; public bool IsFinal => finalPortal;
public bool IsAlive => State.Value != PortalState.Ruined && Health.Value > 0f;
public Vector3 Position => transform.position; 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); private void OnDisable() => All.Remove(this);
public override void OnNetworkSpawn() public override void OnNetworkSpawn()
{ {
State.OnValueChanged += OnStateChanged; State.OnValueChanged += OnStateChanged;
portal.OnPortalDestroyed += OnDestroyed;
if (IsServer) if (IsServer)
{ {
State.Value = initialState; 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; public override void OnNetworkDespawn()
private void OnStateChanged(PortalState previous, PortalState current) => RefreshVisual();
private void RefreshVisual()
{ {
if (stateRenderer == null) return; State.OnValueChanged -= OnStateChanged;
portal.OnPortalDestroyed -= OnDestroyed;
}
private void OnDestroyed(ulong attackerId)
{
if (!IsServer) return;
bool won = State.Value == PortalState.Enemy && finalPortal;
State.Value = PortalState.Ruined;
portal.SetDormant();
if (won) PrototypeGameState.Instance.SetPhase(PrototypeGamePhase.Victory);
RefreshAllGates();
}
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()
{
if (stateRenderer != null)
stateRenderer.material.color = State.Value switch stateRenderer.material.color = State.Value switch
{ {
PortalState.Enemy => new Color(0.8f, 0.1f, 0.65f), PortalState.Enemy => new Color(0.8f, 0.1f, 0.65f),
PortalState.Allied => new Color(0.1f, 0.75f, 1f), PortalState.Allied => new Color(0.1f, 0.75f, 1f),
_ => new Color(0.25f, 0.25f, 0.28f) _ => new Color(0.25f, 0.25f, 0.28f)
}; };
} bool allied = State.Value == PortalState.Allied;
bool canSouth = allied && southNeighbor != null && southNeighbor.State.Value == PortalState.Allied;
public void TakeDamage(float amount, bool fromEnemy) 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)
{ {
if (!IsServer || !IsAlive) return; gate.enabled = canSouth || canNorth;
if (fromEnemy != (State.Value == PortalState.Allied)) return; gate.frontTrigger = southEntry; gate.backTrigger = northEntry;
Health.Value = Mathf.Max(0f, Health.Value - amount); gate.frontExitPoint = canNorth ? northNeighbor.northArrival : northArrival;
if (Health.Value > 0f) return; gate.backExitPoint = canSouth ? southNeighbor.southArrival : southArrival;
}
if (State.Value == PortalState.Enemy && finalPortal)
PrototypeGameState.Instance.SetPhase(PrototypeGamePhase.Victory);
State.Value = PortalState.Ruined;
} }
public static void TryInteractNearest(PrototypePlayer player) 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()
{ {
PortalSite nearest = null; if (State.Value != PortalState.Ruined || !PrototypeGameState.Instance.TrySpend(rebuildCost)) return;
float best = 3.2f; portal.RestorePortal(TeamType.Player);
foreach (var portal in All) State.Value = PortalState.Allied;
{
float distance = Vector3.Distance(player.Position, portal.Position);
if (distance < best) { best = distance; nearest = portal; }
}
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)
{
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;
} }
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 #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; siteIndex = index; finalPortal = isFinal; initialState = state; southNeighbor = south; northNeighbor = north;
southNeighbor = south; northNeighbor = north; stateRenderer = renderer; 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; } public void EditorSetNeighbors(PortalSite south, PortalSite north) { southNeighbor = south; northNeighbor = north; }
#endif #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 namespace Northbound.Prototype
{ {
[RequireComponent(typeof(NetworkObject))] [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(); 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 float manaPerSecond = 0.75f;
[SerializeField] private Renderer stateRenderer; [SerializeField] private Renderer stateRenderer;
public readonly NetworkVariable<bool> IsCaptured = new(); 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; public float ManaPerSecond => manaPerSecond;
bool IPrototypeDamageable.IsAlive => IsAlive; public bool IsAlive => IsCaptured.Value && health.Value > 0;
public bool IsAlive => IsCaptured.Value && Health.Value > 0f;
public Vector3 Position => transform.position; public Vector3 Position => transform.position;
private void OnEnable() { if (!All.Contains(this)) All.Add(this); } private void OnEnable() { if (!All.Contains(this)) All.Add(this); }
private void OnDisable() => All.Remove(this); private void OnDisable() => All.Remove(this);
public override void OnNetworkSpawn() public override void OnNetworkSpawn()
{ {
IsCaptured.OnValueChanged += (_, _) => Refresh(); IsCaptured.OnValueChanged += OnCapturedChanged;
if (IsServer) { IsCaptured.Value = false; Health.Value = maxHealth; } if (IsServer) { IsCaptured.Value = false; health.Value = maxHealth; team.Value = TeamType.Neutral; }
Refresh(); 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); } 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; if (IsCaptured.Value) return false;
foreach (var crystal in All) foreach (var enemy in FindObjectsByType<EnemyUnit>())
if (!enemy.IsDead() && Vector3.Distance(enemy.transform.position, transform.position) < 6f) return false;
return true;
}
public void Interact(ulong playerId) { if (CanInteract(playerId)) CaptureRpc(); }
[Rpc(SendTo.Server, InvokePermission = RpcInvokePermission.Everyone)]
private void CaptureRpc()
{ {
float distance = Vector3.Distance(player.Position, crystal.Position); if (IsCaptured.Value) return;
if (distance < best) { best = distance; nearest = crystal; } 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;
} }
if (nearest == null || nearest.IsCaptured.Value) return;
foreach (var enemy in PrototypeEnemy.All) public void TakeDamage(int damage, ulong attackerId)
if (Vector3.Distance(enemy.Position, nearest.Position) < 6f) return;
nearest.IsCaptured.Value = true;
nearest.Health.Value = nearest.maxHealth;
}
public void TakeDamage(float amount, bool fromEnemy)
{ {
if (!IsServer || !fromEnemy || !IsAlive) return; if (!IsServer || !IsAlive) return;
Health.Value = Mathf.Max(0f, Health.Value - amount); health.Value = Mathf.Max(0, health.Value - damage);
if (Health.Value <= 0f) IsCaptured.Value = false; 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 #if UNITY_EDITOR
public void EditorConfigure(Renderer renderer) => stateRenderer = renderer; public void EditorConfigure(Renderer renderer) => stateRenderer = renderer;
#endif #endif
@@ -1,32 +1,37 @@
using System.Collections.Generic; using System.Collections.Generic;
using Unity.Netcode;
using UnityEngine; using UnityEngine;
namespace Northbound.Prototype namespace Northbound.Prototype
{ {
public sealed class PrototypeDefenseSlot : MonoBehaviour [RequireComponent(typeof(NetworkObject))]
public sealed class PrototypeDefenseSlot : NetworkBehaviour, IInteractable
{ {
public static readonly List<PrototypeDefenseSlot> All = new(); public static readonly List<PrototypeDefenseSlot> All = new();
[SerializeField] private PrototypeCrystalOutpost requiredOutpost; [SerializeField] private PrototypeCrystalOutpost requiredOutpost;
[SerializeField] private PrototypeTower towerPrefab; [SerializeField] private GameObject towerPrefab;
[SerializeField] private float buildCost = 45f; [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 OnEnable() { if (!All.Contains(this)) All.Add(this); }
private void OnDisable() => All.Remove(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; if (IsBuilt.Value || requiredOutpost == null || !requiredOutpost.IsCaptured.Value ||
foreach (var slot in All) !PrototypeGameState.Instance.TrySpend(buildCost)) return;
{ GameObject tower = Instantiate(towerPrefab, transform.position + Vector3.up * 0.7f, Quaternion.identity);
float distance = Vector3.Distance(player.Position, slot.transform.position); tower.GetComponent<NetworkObject>().Spawn();
if (distance < best) { best = distance; nearest = slot; } IsBuilt.Value = true;
}
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();
} }
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 #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 #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() private void Update()
{ {
if (!IsServer || Phase.Value != PrototypeGamePhase.Playing) return; if (!IsServer || Phase.Value != PrototypeGamePhase.Playing) return;
var core = FindAnyObjectByType<Core>();
if (core != null && core.IsDead())
{
SetPhase(PrototypeGamePhase.Defeat);
return;
}
float income = baseManaPerSecond; float income = baseManaPerSecond;
foreach (var crystal in PrototypeCrystalOutpost.All) foreach (var crystal in PrototypeCrystalOutpost.All)
if (crystal != null && crystal.IsCaptured.Value) income += crystal.ManaPerSecond; if (crystal != null && crystal.IsCaptured.Value) income += crystal.ManaPerSecond;
@@ -1,5 +1,4 @@
using UnityEngine; using UnityEngine;
using UnityEngine.InputSystem;
namespace Northbound.Prototype namespace Northbound.Prototype
{ {
@@ -7,12 +6,6 @@ namespace Northbound.Prototype
{ {
[SerializeField] private PrototypeNetworkLauncher launcher; [SerializeField] private PrototypeNetworkLauncher launcher;
[SerializeField] private PrototypeWaveManager waveManager; [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() private void OnGUI()
{ {
GUI.skin.label.fontSize = 17; GUI.skin.button.fontSize = 17; 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), "작전 현황"); GUI.Box(new Rect(18, 18, 390, 142), "작전 현황");
string wave = waveManager == null ? "-" : $"{waveManager.WaveNumber.Value} (다음 {waveManager.NextWaveIn.Value:0}초)"; string wave = waveManager == null ? "-" : $"{waveManager.WaveNumber.Value} (다음 {waveManager.NextWaveIn.Value:0}초)";
string resonance = waveManager == null ? "-" : waveManager.ResonanceSnapshot.Value.ToString(); 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.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.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좌/우클릭 공격 · 회피/방어 없음"); 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()) foreach (string argument in System.Environment.GetCommandLineArgs())
if (argument == "-prototypeSmoke") { StartHost(); break; } 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 StartHost() { if (!manager.IsListening) manager.StartHost(); }
public void StartClient() { if (!manager.IsListening) manager.StartClient(); } 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 public sealed class PrototypeSmokeRunner : MonoBehaviour
{ {
private bool enabledForCommandLine; private bool smokeEnabled;
private float startedAt; private float startedAt;
private void Start() private void Start()
{ {
foreach (string argument in System.Environment.GetCommandLineArgs()) 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; startedAt = Time.realtimeSinceStartup;
} }
private void Update() 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 && bool valid = NetworkManager.Singleton != null && NetworkManager.Singleton.IsHost &&
PrototypeGameState.Instance != null && PrototypeCore.Instance != null && PrototypeGameState.Instance != null && FindAnyObjectByType<Core>() != null &&
PrototypePlayer.All.Count == 1 && PortalSite.All.Count == 4 && FindObjectsByType<NetworkPlayerController>().Length == 1 && PortalSite.All.Count == 4 &&
PrototypeCrystalOutpost.All.Count == 3 && PrototypeEnemy.All.Count > 0 && PrototypeCrystalOutpost.All.Count == 3 && FindObjectsByType<EnemyUnit>().Length > 0 &&
FindFirstObjectByType<PrototypeWaveManager>().WaveNumber.Value == 1; FindAnyObjectByType<PrototypeWaveManager>().WaveNumber.Value == 1;
if (valid) 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); Quit(0);
} }
else else
{ {
Debug.LogError($"[Northbound Prototype Smoke] FAIL: host={NetworkManager.Singleton?.IsHost}, players={PrototypePlayer.All.Count}, portals={PortalSite.All.Count}, crystals={PrototypeCrystalOutpost.All.Count}"); int playerCount = FindObjectsByType<NetworkPlayerController>().Length;
foreach (var crystal in FindObjectsByType<PrototypeCrystalOutpost>(FindObjectsSortMode.None)) 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}"); Debug.LogError($"[Northbound Prototype Smoke] Crystal object: {crystal.name}, active={crystal.isActiveAndEnabled}, spawned={crystal.IsSpawned}");
Quit(2); Quit(2);
} }
enabledForCommandLine = false; smokeEnabled = false;
} }
private static void Quit(int code) private static void Quit(int code)
{ {
#if UNITY_EDITOR #if UNITY_EDITOR
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); UnityEditor.EditorApplication.Exit(code);
}
#else #else
Application.Quit(code); Application.Quit(code);
#endif #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 namespace Northbound.Prototype
{ {
public enum PrototypeGamePhase : byte { Playing, Victory, Defeat } public enum PrototypeGamePhase : byte { Playing, Victory, Defeat }
public enum PortalState : byte { Enemy, Ruined, Allied } public enum PortalState : byte { Enemy, Ruined, Allied }
public enum EnemyRole : byte { Grunt, Raider, Digger, Elite } 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 System.Collections.Generic;
using Unity.Netcode; using Unity.Netcode;
using UnityEngine; using UnityEngine;
@@ -8,74 +7,81 @@ namespace Northbound.Prototype
[RequireComponent(typeof(NetworkObject))] [RequireComponent(typeof(NetworkObject))]
public sealed class PrototypeWaveManager : NetworkBehaviour public sealed class PrototypeWaveManager : NetworkBehaviour
{ {
[SerializeField] private PrototypeEnemy[] enemyPrefabs; [SerializeField] private GlobalTimer globalTimer;
[SerializeField] private float firstWaveDelay = 15f; [SerializeField] private GameObject[] enemyPrefabs;
[SerializeField] private float waveInterval = 90f;
[SerializeField] private int resonanceCap = 3; [SerializeField] private int resonanceCap = 3;
[SerializeField] private float healthPerPortal = 0.10f; [SerializeField] private float healthPerPortal = 0.10f;
[SerializeField] private float damagePerPortal = 0.06f; [SerializeField] private float damagePerPortal = 0.06f;
public readonly NetworkVariable<int> WaveNumber = new(); public readonly NetworkVariable<int> WaveNumber = new();
public readonly NetworkVariable<int> ResonanceSnapshot = new(); public readonly NetworkVariable<int> ResonanceSnapshot = new();
public readonly NetworkVariable<float> NextWaveIn = new(); public readonly NetworkVariable<float> NextWaveIn = new();
public override void OnNetworkSpawn() public override void OnNetworkSpawn()
{ {
if (IsServer) StartCoroutine(WaveLoop()); if (globalTimer == null) globalTimer = GlobalTimer.Instance;
if (IsServer && globalTimer != null) globalTimer.OnCycleComplete += SpawnWave;
} }
public override void OnNetworkDespawn()
private IEnumerator WaveLoop()
{ {
float delay = firstWaveDelay; if (IsServer && globalTimer != null) globalTimer.OnCycleComplete -= SpawnWave;
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;
}
} }
private void Update() { if (IsServer && globalTimer != null) NextWaveIn.Value = globalTimer.GetCurrentTime(); }
private void SpawnWave() private void SpawnWave()
{ {
if (!IsServer || PrototypeGameState.Instance.Phase.Value != PrototypeGamePhase.Playing) return;
var activePortals = new List<PortalSite>(); var activePortals = new List<PortalSite>();
foreach (var portal in PortalSite.All) foreach (var portal in PortalSite.All) if (portal != null && portal.State.Value == PortalState.Enemy) activePortals.Add(portal);
if (portal != null && portal.State.Value == PortalState.Enemy) activePortals.Add(portal);
if (activePortals.Count == 0) return; if (activePortals.Count == 0) return;
WaveNumber.Value++; WaveNumber.Value++;
ResonanceSnapshot.Value = Mathf.Min(activePortals.Count, resonanceCap); ResonanceSnapshot.Value = Mathf.Min(activePortals.Count, resonanceCap);
int budget = 5 + WaveNumber.Value * 2; int remainingBudget = 18 + WaveNumber.Value * 3;
float hpMultiplier = 1f + ResonanceSnapshot.Value * healthPerPortal; int spawnIndex = 0;
float damageMultiplier = 1f + ResonanceSnapshot.Value * damagePerPortal; while (remainingBudget > 0)
for (int i = 0; i < budget; i++)
{ {
PortalSite portal = activePortals[i % activePortals.Count]; GameObject prefab = SelectAffordablePrefab(remainingBudget);
int prefabIndex = ChooseEnemyIndex(i, WaveNumber.Value); if (prefab == null) break;
var prefab = enemyPrefabs[Mathf.Clamp(prefabIndex, 0, enemyPrefabs.Length - 1)]; var data = prefab.GetComponent<MonsterDataComponent>()?.monsterData;
float xOffset = prefabIndex == 2 ? (i % 2 == 0 ? -11f : 11f) : Random.Range(-2f, 2f); int cost = data != null ? Mathf.Max(1, data.cost) : 3;
float zOffset = prefabIndex == 2 ? -7f : -2.5f; PortalSite portal = activePortals[spawnIndex % activePortals.Count];
var enemy = Instantiate(prefab, portal.Position + new Vector3(xOffset, 0.7f, zOffset), Quaternion.identity); float x = spawnIndex % 5 == 4 ? (spawnIndex % 2 == 0 ? -11f : 11f) : Random.Range(-2f, 2f);
enemy.ApplyWaveStats(hpMultiplier, damageMultiplier); GameObject enemy = Instantiate(prefab, portal.Position + new Vector3(x, 0.3f, -3f), Quaternion.identity);
enemy.NetworkObject.Spawn(); 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; var eligible = new List<GameObject>(); float totalWeight = 0f;
if (wave >= 3 && spawnIndex % 7 == 0) return Mathf.Min(3, enemyPrefabs.Length - 1); foreach (var prefab in enemyPrefabs)
if (spawnIndex % 5 == 0) return Mathf.Min(1, enemyPrefabs.Length - 1); {
if (wave >= 2 && spawnIndex % 4 == 0) return Mathf.Min(2, enemyPrefabs.Length - 1); if (prefab == null) continue;
return 0; 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 #if UNITY_EDITOR
public void EditorConfigure(PrototypeEnemy[] prefabs) => enemyPrefabs = prefabs; public void EditorConfigure(GlobalTimer timer, GameObject[] prefabs) { globalTimer = timer; enemyPrefabs = prefabs; }
#endif #endif
} }
} }
+11 -1
View File
@@ -11,6 +11,8 @@ namespace Northbound
[Header("Attack Settings")] [Header("Attack Settings")]
public float attackCooldown = 0.5f; public float attackCooldown = 0.5f;
public LayerMask attackableLayer = ~0; public LayerMask attackableLayer = ~0;
public bool useFacingArc = false;
[Range(-1f, 1f)] public float minimumFacingDot = 0.25f;
[Header("Animation")] [Header("Animation")]
public string attackAnimationTrigger = "Attack"; public string attackAnimationTrigger = "Attack";
@@ -72,7 +74,7 @@ namespace Northbound
PlayAttackAnimation(); PlayAttackAnimation();
// 애니메이션이 없으면 즉시 공격 실행 // 애니메이션이 없으면 즉시 공격 실행
if (_animator == null || string.IsNullOrEmpty(attackAnimationTrigger)) if (!useAnimationEvents || _animator == null || string.IsNullOrEmpty(attackAnimationTrigger))
{ {
PerformAttack(); PerformAttack();
_isAttacking = false; _isAttacking = false;
@@ -89,6 +91,14 @@ namespace Northbound
if (hit.transform.root == transform.root) if (hit.transform.root == transform.root)
continue; 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 targetDamageable = hit.GetComponent<IDamageable>();
var targetTeamMember = hit.GetComponent<ITeamMember>(); var targetTeamMember = hit.GetComponent<ITeamMember>();
+41 -1
View File
@@ -9,6 +9,10 @@ using UnityEngine;
[Header("Team Settings")] [Header("Team Settings")]
[Tooltip("포털의 팀 (Hostile 또는 Monster)")] [Tooltip("포털의 팀 (Hostile 또는 Monster)")]
[SerializeField] private TeamType portalTeam = TeamType.Hostile; [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")] [Header("Health Settings")]
[Tooltip("최대 체력")] [Tooltip("최대 체력")]
@@ -67,12 +71,18 @@ using UnityEngine;
} }
} }
if (spawnFromGlobalTimer && GlobalTimer.Instance != null)
{
GlobalTimer.Instance.OnCycleStart += OnCycleStart; GlobalTimer.Instance.OnCycleStart += OnCycleStart;
} }
}
public override void OnNetworkDespawn() public override void OnNetworkDespawn()
{
if (spawnFromGlobalTimer && GlobalTimer.Instance != null)
{ {
GlobalTimer.Instance.OnCycleStart -= OnCycleStart; GlobalTimer.Instance.OnCycleStart -= OnCycleStart;
}
// 체력 변경 이벤트 정리 (나중에 추가할 경우 대비) // 체력 변경 이벤트 정리 (나중에 추가할 경우 대비)
@@ -257,11 +267,41 @@ using UnityEngine;
ShowDestroyEffectClientRpc(); ShowDestroyEffectClientRpc();
// 몬스터 스폰 중지 (이벤트 구독 해제) // 몬스터 스폰 중지 (이벤트 구독 해제)
if (spawnFromGlobalTimer && GlobalTimer.Instance != null)
{
GlobalTimer.Instance.OnCycleStart -= OnCycleStart; GlobalTimer.Instance.OnCycleStart -= OnCycleStart;
}
// 네트워크 오브젝트 파괴 (약간의 딜레이) OnPortalDestroyed?.Invoke(attackerId);
if (despawnWhenDestroyed)
{
Invoke(nameof(DespawnPortal), 1.0f); 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() private void DespawnPortal()
{ {
+22 -10
View File
@@ -17,6 +17,8 @@ namespace Northbound
private Dictionary<ulong, int> _clientSpawnIndices = new Dictionary<ulong, int>(); private Dictionary<ulong, int> _clientSpawnIndices = new Dictionary<ulong, int>();
private int _nextSpawnIndex = 0; private int _nextSpawnIndex = 0;
private NetworkManager _networkManager;
private bool _callbacksRegistered;
// ⭐ Awake에서 스폰 포인트 먼저 찾고, 콜백 등록 // ⭐ Awake에서 스폰 포인트 먼저 찾고, 콜백 등록
private void Awake() private void Awake()
@@ -28,15 +30,25 @@ namespace Northbound
} }
// 2️⃣ 그 다음 콜백 등록 // 2️⃣ 그 다음 콜백 등록
if (NetworkManager.Singleton != null) RegisterCallbacks();
{
NetworkManager.Singleton.ConnectionApprovalCallback = ApprovalCheck;
NetworkManager.Singleton.OnServerStarted += OnServerStarted;
NetworkManager.Singleton.OnClientConnectedCallback += OnClientConnected;
} }
else
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() private void FindSpawnPoints()
@@ -192,11 +204,11 @@ namespace Northbound
private void OnDestroy() private void OnDestroy()
{ {
if (NetworkManager.Singleton != null) if (_callbacksRegistered && _networkManager != null)
{ {
NetworkManager.Singleton.ConnectionApprovalCallback = null; _networkManager.ConnectionApprovalCallback = null;
NetworkManager.Singleton.OnServerStarted -= OnServerStarted; _networkManager.OnServerStarted -= OnServerStarted;
NetworkManager.Singleton.OnClientConnectedCallback -= OnClientConnected; _networkManager.OnClientConnectedCallback -= OnClientConnected;
} }
} }
} }
+22 -3
View File
@@ -10,6 +10,8 @@ public class NetworkPlayerController : NetworkBehaviour, ITeamMember, IDamageabl
{ {
[Header("Movement Settings")] [Header("Movement Settings")]
public float rotationSpeed = 10f; public float rotationSpeed = 10f;
[Tooltip("공격 애니메이션 중 이동을 막을지 여부")]
public bool blockMovementDuringAttack = true;
[Header("Team Settings")] [Header("Team Settings")]
[SerializeField] private TeamType initialTeam = TeamType.Player; [SerializeField] private TeamType initialTeam = TeamType.Player;
@@ -21,6 +23,7 @@ public class NetworkPlayerController : NetworkBehaviour, ITeamMember, IDamageabl
[Header("Death Settings")] [Header("Death Settings")]
[SerializeField] private GameObject resourcePickupPrefab; // 자원 드랍 프리팹 [SerializeField] private GameObject resourcePickupPrefab; // 자원 드랍 프리팹
[SerializeField] private float respawnDelay = 10f; // 부활 대기 시간 (초) [SerializeField] private float respawnDelay = 10f; // 부활 대기 시간 (초)
[SerializeField] private bool dropResourcesOnDeath = true;
[Header("Health Bar")] [Header("Health Bar")]
[SerializeField] private bool showHealthBar = true; [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; public PlayerInputActions InputActions => _inputActions;
@@ -89,6 +101,10 @@ public class NetworkPlayerController : NetworkBehaviour, ITeamMember, IDamageabl
// 서버에서 초기화 // 서버에서 초기화
if (IsServer) if (IsServer)
{ {
if (_ownerPlayerId.Value == ulong.MaxValue)
{
_ownerPlayerId.Value = OwnerClientId;
}
if (_team.Value == TeamType.Neutral) if (_team.Value == TeamType.Neutral)
{ {
_team.Value = initialTeam; _team.Value = initialTeam;
@@ -245,7 +261,7 @@ public class NetworkPlayerController : NetworkBehaviour, ITeamMember, IDamageabl
var attackAction = GetComponent<AttackAction>(); var attackAction = GetComponent<AttackAction>();
var playerInteraction = GetComponent<PlayerInteraction>(); var playerInteraction = GetComponent<PlayerInteraction>();
bool isActionBlocked = (attackAction != null && attackAction.IsAttacking) || bool isActionBlocked = (blockMovementDuringAttack && attackAction != null && attackAction.IsAttacking) ||
(playerInteraction != null && playerInteraction.IsInteracting); (playerInteraction != null && playerInteraction.IsInteracting);
if (isActionBlocked) if (isActionBlocked)
@@ -420,7 +436,10 @@ public class NetworkPlayerController : NetworkBehaviour, ITeamMember, IDamageabl
if (!IsServer) return; if (!IsServer) return;
// 플레이어가 가진 자원을 ResourcePickup으로 드랍 // 플레이어가 가진 자원을 ResourcePickup으로 드랍
if (dropResourcesOnDeath)
{
DropPlayerResources(); DropPlayerResources();
}
// 사망 이펙트 // 사망 이펙트
ShowDeathEffectClientRpc(); ShowDeathEffectClientRpc();
+16
View File
@@ -17,6 +17,10 @@ namespace Northbound
[Header("Animation")] [Header("Animation")]
public bool playAnimations = true; public bool playAnimations = true;
[Header("Secondary Action")]
[Tooltip("우클릭으로 실행할 액션 이름. 비어 있으면 사용하지 않습니다.")]
public string secondaryActionName = "";
private Dictionary<string, IAction> _actions = new Dictionary<string, IAction>(); private Dictionary<string, IAction> _actions = new Dictionary<string, IAction>();
private Animator _animator; private Animator _animator;
private NetworkAnimator _networkAnimator; private NetworkAnimator _networkAnimator;
@@ -103,6 +107,18 @@ namespace Northbound
ExecuteAction("Attack"); 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) public void ExecuteAction(string actionName)
{ {
if (_actions.TryGetValue(actionName, out IAction action)) if (_actions.TryGetValue(actionName, out IAction action))
+10 -1
View File
@@ -11,6 +11,15 @@ public class SimpleCameraZFollow : MonoBehaviour
private Transform target; 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() private void Start()
{ {
FindPlayerTarget(); FindPlayerTarget();
@@ -21,7 +30,7 @@ public class SimpleCameraZFollow : MonoBehaviour
var players = FindObjectsByType<NetworkPlayerController>(); var players = FindObjectsByType<NetworkPlayerController>();
foreach (var player in players) foreach (var player in players)
{ {
if (player.IsOwner) if (player.IsLocalPlayer)
{ {
target = player.transform; target = player.transform;
Debug.Log($"<color=green>[Camera] Target found: {player.name}</color>"); Debug.Log($"<color=green>[Camera] Target found: {player.name}</color>");