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