From 6590654c591ecf6e4e9d19ca472fe8d4ef1bd09d Mon Sep 17 00:00:00 2001 From: Hazim Date: Sun, 4 May 2025 00:55:03 +0500 Subject: [PATCH] Working on meteor shower --- Assets/GameData/NetworkPrefabs.asset | 10 + Assets/Prefabs/ChaosRune.meta | 8 + Assets/Prefabs/ChaosRune/ChaosRune.prefab | 178 ++++++++++++++++++ .../Prefabs/ChaosRune/ChaosRune.prefab.meta | 7 + Assets/Prefabs/ChaosRuneEffects.meta | 8 + .../MeteorStrikeEffect.prefab | 74 ++++++++ .../MeteorStrikeEffect.prefab.meta | 7 + Assets/Scenes/BossRoom.unity | 83 +++++++- Assets/Scripts/Gameplay/ChaosRuneBase.cs | 75 ++++++++ Assets/Scripts/Gameplay/ChaosRuneBase.cs.meta | 11 ++ Assets/Scripts/Gameplay/ChaosRunePrefab.cs | 23 +++ .../Scripts/Gameplay/ChaosRunePrefab.cs.meta | 11 ++ Assets/Scripts/Gameplay/ChaosRuneSystem.cs | 92 +++++++++ .../Scripts/Gameplay/ChaosRuneSystem.cs.meta | 11 ++ Assets/Scripts/Gameplay/MeteorStrikeEffect.cs | 125 ++++++++++++ .../Gameplay/MeteorStrikeEffect.cs.meta | 11 ++ 16 files changed, 729 insertions(+), 5 deletions(-) create mode 100644 Assets/Prefabs/ChaosRune.meta create mode 100644 Assets/Prefabs/ChaosRune/ChaosRune.prefab create mode 100644 Assets/Prefabs/ChaosRune/ChaosRune.prefab.meta create mode 100644 Assets/Prefabs/ChaosRuneEffects.meta create mode 100644 Assets/Prefabs/ChaosRuneEffects/MeteorStrikeEffect.prefab create mode 100644 Assets/Prefabs/ChaosRuneEffects/MeteorStrikeEffect.prefab.meta create mode 100644 Assets/Scripts/Gameplay/ChaosRuneBase.cs create mode 100644 Assets/Scripts/Gameplay/ChaosRuneBase.cs.meta create mode 100644 Assets/Scripts/Gameplay/ChaosRunePrefab.cs create mode 100644 Assets/Scripts/Gameplay/ChaosRunePrefab.cs.meta create mode 100644 Assets/Scripts/Gameplay/ChaosRuneSystem.cs create mode 100644 Assets/Scripts/Gameplay/ChaosRuneSystem.cs.meta create mode 100644 Assets/Scripts/Gameplay/MeteorStrikeEffect.cs create mode 100644 Assets/Scripts/Gameplay/MeteorStrikeEffect.cs.meta diff --git a/Assets/GameData/NetworkPrefabs.asset b/Assets/GameData/NetworkPrefabs.asset index 089c87a6..1dbe0463 100644 --- a/Assets/GameData/NetworkPrefabs.asset +++ b/Assets/GameData/NetworkPrefabs.asset @@ -94,3 +94,13 @@ MonoBehaviour: SourcePrefabToOverride: {fileID: 0} SourceHashToOverride: 0 OverridingTargetPrefab: {fileID: 0} + - Override: 0 + Prefab: {fileID: 1423745118134693202, guid: 0a08bdb749bc8d94eb0675c1ff256f88, type: 3} + SourcePrefabToOverride: {fileID: 0} + SourceHashToOverride: 0 + OverridingTargetPrefab: {fileID: 0} + - Override: 0 + Prefab: {fileID: 4534193173484108557, guid: 485ac43964761ef428fc80e096af0abd, type: 3} + SourcePrefabToOverride: {fileID: 0} + SourceHashToOverride: 0 + OverridingTargetPrefab: {fileID: 0} diff --git a/Assets/Prefabs/ChaosRune.meta b/Assets/Prefabs/ChaosRune.meta new file mode 100644 index 00000000..dea695f2 --- /dev/null +++ b/Assets/Prefabs/ChaosRune.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a4ca53f5f677a134ab21b8ce6abfff16 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Prefabs/ChaosRune/ChaosRune.prefab b/Assets/Prefabs/ChaosRune/ChaosRune.prefab new file mode 100644 index 00000000..925d8c75 --- /dev/null +++ b/Assets/Prefabs/ChaosRune/ChaosRune.prefab @@ -0,0 +1,178 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &1423745118134693202 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7931252305845676974} + - component: {fileID: 6622665570321301229} + - component: {fileID: 1476813267534383213} + - component: {fileID: 4247345913643518399} + - component: {fileID: 395240331964147678} + - component: {fileID: 6138991760020901714} + - component: {fileID: -4553228673610520739} + m_Layer: 0 + m_Name: ChaosRune + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &7931252305845676974 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1423745118134693202} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -0.86752474, y: -0.19581793, z: 4.865039} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &6622665570321301229 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1423745118134693202} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &1476813267534383213 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1423745118134693202} + 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_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, 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: 0 + 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_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!135 &4247345913643518399 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1423745118134693202} + 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: 3 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!114 &395240331964147678 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1423745118134693202} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} + m_Name: + m_EditorClassIdentifier: + GlobalObjectIdHash: 3655965266 + InScenePlacedSourceGlobalObjectIdHash: 0 + AlwaysReplicateAsRoot: 0 + SynchronizeTransform: 1 + ActiveSceneSynchronization: 0 + SceneMigrationSynchronization: 1 + SpawnWithObservers: 1 + DontDestroyWithOwner: 0 + AutoObjectParentSync: 1 +--- !u!114 &6138991760020901714 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1423745118134693202} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b07ebcf1dcb10584eb72e0a384385ba3, type: 3} + m_Name: + m_EditorClassIdentifier: + chaosRuneRadius: 1 + chaosRuneMagnitude: 1 + chaosRuneDuration: 5 + chaosRuneCooldownTime: 10 + chaosRuneApplicationRadius: 2 + lifetime: 10 + chaosRuneEffect: {fileID: 0} + ChaosRuneType: 0 +--- !u!54 &-4553228673610520739 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1423745118134693202} + serializedVersion: 4 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_CenterOfMass: {x: 0, y: 0, z: 0} + m_InertiaTensor: {x: 1, y: 1, z: 1} + m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ImplicitCom: 1 + m_ImplicitTensor: 1 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 112 + m_CollisionDetection: 0 diff --git a/Assets/Prefabs/ChaosRune/ChaosRune.prefab.meta b/Assets/Prefabs/ChaosRune/ChaosRune.prefab.meta new file mode 100644 index 00000000..bfc3e19e --- /dev/null +++ b/Assets/Prefabs/ChaosRune/ChaosRune.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 0a08bdb749bc8d94eb0675c1ff256f88 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Prefabs/ChaosRuneEffects.meta b/Assets/Prefabs/ChaosRuneEffects.meta new file mode 100644 index 00000000..a89e59b8 --- /dev/null +++ b/Assets/Prefabs/ChaosRuneEffects.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2073273cc98fce04e890d476f09e53c5 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Prefabs/ChaosRuneEffects/MeteorStrikeEffect.prefab b/Assets/Prefabs/ChaosRuneEffects/MeteorStrikeEffect.prefab new file mode 100644 index 00000000..41c8cb3c --- /dev/null +++ b/Assets/Prefabs/ChaosRuneEffects/MeteorStrikeEffect.prefab @@ -0,0 +1,74 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &4534193173484108557 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 373034462500573541} + - component: {fileID: 6440658106440455518} + - component: {fileID: 1556918889048963796} + m_Layer: 0 + m_Name: MeteorStrikeEffect + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &373034462500573541 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4534193173484108557} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -0.86752474, y: -0.19581793, z: 4.865039} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &6440658106440455518 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4534193173484108557} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} + m_Name: + m_EditorClassIdentifier: + GlobalObjectIdHash: 1414638663 + InScenePlacedSourceGlobalObjectIdHash: 0 + AlwaysReplicateAsRoot: 0 + SynchronizeTransform: 1 + ActiveSceneSynchronization: 0 + SceneMigrationSynchronization: 1 + SpawnWithObservers: 1 + DontDestroyWithOwner: 0 + AutoObjectParentSync: 1 +--- !u!114 &1556918889048963796 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4534193173484108557} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: de3fc098854109c4ca330533f2298154, type: 3} + m_Name: + m_EditorClassIdentifier: + meteorPrefab: {fileID: 0} + meteorCount: 10 + strikeDuration: 3 + strikeRadius: 10 + spawnHeight: 20 + startOnAwake: 1 diff --git a/Assets/Prefabs/ChaosRuneEffects/MeteorStrikeEffect.prefab.meta b/Assets/Prefabs/ChaosRuneEffects/MeteorStrikeEffect.prefab.meta new file mode 100644 index 00000000..8ca9ecce --- /dev/null +++ b/Assets/Prefabs/ChaosRuneEffects/MeteorStrikeEffect.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 485ac43964761ef428fc80e096af0abd +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scenes/BossRoom.unity b/Assets/Scenes/BossRoom.unity index ea752a20..4fa70fb7 100644 --- a/Assets/Scenes/BossRoom.unity +++ b/Assets/Scenes/BossRoom.unity @@ -19338,11 +19338,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1676734515771252668, guid: 0193228de87741d40a42e561901c9083, type: 3} propertyPath: m_LocalRotation.y - value: 0.28987613 + value: 0.28987607 objectReference: {fileID: 0} - target: {fileID: 1676734515771252668, guid: 0193228de87741d40a42e561901c9083, type: 3} propertyPath: m_LocalRotation.z - value: -0.18152039 + value: -0.18152031 objectReference: {fileID: 0} - target: {fileID: 1676734516302391364, guid: 0193228de87741d40a42e561901c9083, type: 3} propertyPath: m_UpdateMethod @@ -19394,7 +19394,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1676734516724634599, guid: 0193228de87741d40a42e561901c9083, type: 3} propertyPath: m_LocalRotation.w - value: 0.8027669 + value: 0.80276686 objectReference: {fileID: 0} - target: {fileID: 1676734516724634599, guid: 0193228de87741d40a42e561901c9083, type: 3} propertyPath: m_LocalRotation.x @@ -19402,11 +19402,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1676734516724634599, guid: 0193228de87741d40a42e561901c9083, type: 3} propertyPath: m_LocalRotation.y - value: 0.29218328 + value: 0.2921833 objectReference: {fileID: 0} - target: {fileID: 1676734516724634599, guid: 0193228de87741d40a42e561901c9083, type: 3} propertyPath: m_LocalRotation.z - value: -0.17778282 + value: -0.17778286 objectReference: {fileID: 0} - target: {fileID: 1676734516866984540, guid: 0193228de87741d40a42e561901c9083, type: 3} propertyPath: m_VerticalDamping @@ -24114,6 +24114,78 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1444955166} m_CullTransparentMesh: 1 +--- !u!1 &1450980511 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1450980514} + - component: {fileID: 1450980512} + - component: {fileID: 1450980513} + m_Layer: 0 + m_Name: ChaosRuneSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1450980512 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1450980511} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} + m_Name: + m_EditorClassIdentifier: + GlobalObjectIdHash: 78981818 + InScenePlacedSourceGlobalObjectIdHash: 0 + AlwaysReplicateAsRoot: 0 + SynchronizeTransform: 1 + ActiveSceneSynchronization: 0 + SceneMigrationSynchronization: 1 + SpawnWithObservers: 1 + DontDestroyWithOwner: 0 + AutoObjectParentSync: 1 +--- !u!114 &1450980513 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1450980511} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0e06f4ab6aafccf4cb96cd1840c1f6a4, type: 3} + m_Name: + m_EditorClassIdentifier: + powerUpDropInterval: 10 + chaosRunePrefabs: + - {fileID: 1423745118134693202, guid: 0a08bdb749bc8d94eb0675c1ff256f88, type: 3} + spawnAreaCenter: {x: 0, y: 0, z: 0} + spawnAreaSize: {x: 20, y: 20} + spawnHeight: 15 +--- !u!4 &1450980514 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1450980511} + 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: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1464662815 GameObject: m_ObjectHideFlags: 0 @@ -489967,3 +490039,4 @@ SceneRoots: - {fileID: 917181830697422961} - {fileID: 1010981557} - {fileID: 1025868247} + - {fileID: 1450980514} diff --git a/Assets/Scripts/Gameplay/ChaosRuneBase.cs b/Assets/Scripts/Gameplay/ChaosRuneBase.cs new file mode 100644 index 00000000..a0f55b8b --- /dev/null +++ b/Assets/Scripts/Gameplay/ChaosRuneBase.cs @@ -0,0 +1,75 @@ +using System.Collections; +using Unity.BossRoom.Gameplay.GameplayObjects.Character; +using Unity.Netcode; +using UnityEngine; + +[RequireComponent(typeof(NetworkObject), typeof(Collider))] +public abstract class ChaosRuneBase : NetworkBehaviour +{ + [Header("Rune Data")] + [Tooltip("Radius of the trigger collider; set your collider to match.")] + public float chaosRuneRadius = 1f; + public float chaosRuneMagnitude = 1f; + public float chaosRuneDuration = 5f; + public float chaosRuneCooldownTime = 10f; + public float chaosRuneApplicationRadius = 2f; + + [Space, Tooltip("Seconds before this rune auto-expires if not picked up")] + public float lifetime = 5f; + + private Coroutine _expireRoutine; + + public override void OnNetworkSpawn() + { + if (!IsServer) return; + + // start the expiry countdown + _expireRoutine = StartCoroutine(ExpireAfter(lifetime)); + } + + private IEnumerator ExpireAfter(float secs) + { + yield return new WaitForSeconds(secs); + + // server‐only hook + OnChaosRuneExpired(); + + // remove from all clients + NetworkObject.Despawn(); + } + + private void OnTriggerEnter(Collider other) + { + if (!IsServer) return; + + // only players can pick up + var picker = other.GetComponent(); + if (picker == null) return; + + // cancel expiry + StopCoroutine(_expireRoutine); + + // server‐only hook + OnChaosRunePickedUp(picker); + + // remove from all clients + NetworkObject.Despawn(); + } + + /// + /// Override in your concrete prefab‐script (or subclass) to grant effects. + /// + protected virtual void OnChaosRunePickedUp(ServerCharacter picker) + { + Debug.Log($"[Server] {picker.name} picked up {name}"); + // e.g. picker.ApplyEffect(chaosRuneMagnitude, chaosRuneDuration); + } + + /// + /// Override to do cleanup if nobody picked it up. + /// + protected virtual void OnChaosRuneExpired() + { + Debug.Log($"[Server] {name} expired before pickup"); + } +} diff --git a/Assets/Scripts/Gameplay/ChaosRuneBase.cs.meta b/Assets/Scripts/Gameplay/ChaosRuneBase.cs.meta new file mode 100644 index 00000000..e4643514 --- /dev/null +++ b/Assets/Scripts/Gameplay/ChaosRuneBase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4f96840b0b586f1488748f96d1aa2921 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Gameplay/ChaosRunePrefab.cs b/Assets/Scripts/Gameplay/ChaosRunePrefab.cs new file mode 100644 index 00000000..8bac546c --- /dev/null +++ b/Assets/Scripts/Gameplay/ChaosRunePrefab.cs @@ -0,0 +1,23 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class ChaosRunePrefab : ChaosRuneBase +{ + + [SerializeField] private GameObject chaosRuneEffect; + [SerializeField] private ChaosRuneType ChaosRuneType; + + + // Start is called before the first frame update + void Start() + { + + } + + // Update is called once per frame + void Update() + { + + } +} diff --git a/Assets/Scripts/Gameplay/ChaosRunePrefab.cs.meta b/Assets/Scripts/Gameplay/ChaosRunePrefab.cs.meta new file mode 100644 index 00000000..e85e4902 --- /dev/null +++ b/Assets/Scripts/Gameplay/ChaosRunePrefab.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b07ebcf1dcb10584eb72e0a384385ba3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Gameplay/ChaosRuneSystem.cs b/Assets/Scripts/Gameplay/ChaosRuneSystem.cs new file mode 100644 index 00000000..6a6dd69f --- /dev/null +++ b/Assets/Scripts/Gameplay/ChaosRuneSystem.cs @@ -0,0 +1,92 @@ +using System.Collections; +using Unity.Netcode; +using UnityEngine; + +public class ChaosRuneSystem : NetworkBehaviour +{ + [Header("Drop Timing (seconds)")] + [SerializeField] private float powerUpDropInterval = 10f; + + [Header("Chaos Rune Prefabs")] + [Tooltip("Drag your ChaosRune prefabs here (must have NetworkObject + ChaosRune).")] + [SerializeField] private GameObject[] chaosRunePrefabs; + + [Header("Spawn Area (local to this GameObject)")] + [Tooltip("Local offset from this GameObject’s position to the center of the spawn area.")] + [SerializeField] private Vector3 spawnAreaCenter = Vector3.zero; + [Tooltip("Size of the rectangle: X = width, Y = depth.")] + [SerializeField] private Vector2 spawnAreaSize = new Vector2(20f, 20f); + [Tooltip("Height above this GameObject’s Y-position from which runes spawn.")] + [SerializeField] private float spawnHeight = 15f; + + public override void OnNetworkSpawn() + { + if (IsServer) + StartCoroutine(DropRunesLoop()); + } + + private IEnumerator DropRunesLoop() + { + while (true) + { + yield return new WaitForSeconds(powerUpDropInterval); + SpawnRandomRune(); + } + } + + private void SpawnRandomRune() + { + if (chaosRunePrefabs == null || chaosRunePrefabs.Length == 0) + { + Debug.LogWarning("ChaosRuneSystem: No prefabs assigned."); + return; + } + + int idx = Random.Range(0, chaosRunePrefabs.Length); + GameObject prefab = chaosRunePrefabs[idx]; + Vector3 pos = GetRandomDropPosition(); + + var go = Instantiate(prefab, pos, Quaternion.identity); + var netObj = go.GetComponent(); + if (netObj != null) + netObj.Spawn(); + else + Debug.LogError($"ChaosRuneSystem: Prefab '{prefab.name}' missing NetworkObject."); + } + + private Vector3 GetRandomDropPosition() + { + // center in world space + Vector3 worldCenter = transform.position + spawnAreaCenter; + float halfW = spawnAreaSize.x * 0.5f; + float halfD = spawnAreaSize.y * 0.5f; + float x = worldCenter.x + Random.Range(-halfW, halfW); + float z = worldCenter.z + Random.Range(-halfD, halfD); + float y = transform.position.y + spawnHeight; + return new Vector3(x, y, z); + } + + private void OnDrawGizmosSelected() + { + // draw spawn area rectangle on XZ plane + Vector3 worldCenter = transform.position + spawnAreaCenter; + Vector3 size = new Vector3(spawnAreaSize.x, 0.1f, spawnAreaSize.y); + + Gizmos.color = Color.cyan; + Gizmos.DrawWireCube(worldCenter, size); + + // draw vertical line & marker at spawn height + Gizmos.color = Color.gray; + Vector3 bottom = worldCenter; + Vector3 top = worldCenter + Vector3.up * spawnHeight; + Gizmos.DrawLine(bottom, top); + Gizmos.DrawWireSphere(top, 0.2f); + } +} + +public enum ChaosRuneType +{ + MeteorStrike, + BoobyTrap, + Barricade +} diff --git a/Assets/Scripts/Gameplay/ChaosRuneSystem.cs.meta b/Assets/Scripts/Gameplay/ChaosRuneSystem.cs.meta new file mode 100644 index 00000000..15297732 --- /dev/null +++ b/Assets/Scripts/Gameplay/ChaosRuneSystem.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0e06f4ab6aafccf4cb96cd1840c1f6a4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Gameplay/MeteorStrikeEffect.cs b/Assets/Scripts/Gameplay/MeteorStrikeEffect.cs new file mode 100644 index 00000000..6b6cfbca --- /dev/null +++ b/Assets/Scripts/Gameplay/MeteorStrikeEffect.cs @@ -0,0 +1,125 @@ +using System.Collections; +using Unity.BossRoom.Gameplay.GameplayObjects.Character; +using Unity.Netcode; +using UnityEngine; + +[RequireComponent(typeof(NetworkObject))] +public class MeteorStrikeEffect : NetworkBehaviour +{ + [Header("Meteor Shower Settings")] + [Tooltip("Prefab of a single meteor. Must have Collider + (optionally) Rigidbody + NetworkObject if you want networked meteors.")] + public GameObject meteorPrefab; + + [Tooltip("Number of meteors to spawn over the duration.")] + public int meteorCount = 10; + + [Tooltip("Total time (in seconds) over which meteors will fall.")] + public float strikeDuration = 3f; + + [Tooltip("Horizontal radius (XZ plane) around this object's position where meteors will land.")] + public float strikeRadius = 10f; + + [Tooltip("Vertical offset above this object's position from which meteors spawn.")] + public float spawnHeight = 20f; + + [Tooltip("If checked, the shower will start automatically on network spawn.")] + public bool startOnAwake = true; + + private Coroutine _showerRoutine; + + public override void OnNetworkSpawn() + { + // Only run on the server + if (!IsServer) return; + + if (startOnAwake) + { + StartShower(); + } + } + + /// + /// Public method to kick off the meteor shower at this GameObject's position. + /// + public void StartShower() + { + if (!IsServer) return; + + if (_showerRoutine != null) + StopCoroutine(_showerRoutine); + + _showerRoutine = StartCoroutine(ShowerCoroutine()); + } + + private IEnumerator ShowerCoroutine() + { + float interval = strikeDuration / Mathf.Max(1, meteorCount); + Vector3 center = transform.position; + + for (int i = 0; i < meteorCount; i++) + { + // pick a random landing point in the XZ circle + Vector2 offset = Random.insideUnitCircle * strikeRadius; + Vector3 spawnPos = new Vector3( + center.x + offset.x, + center.y + spawnHeight, + center.z + offset.y + ); + + // instantiate the meteor + var go = Instantiate(meteorPrefab, spawnPos, Quaternion.identity); + + // if it has a NetworkObject, spawn it on clients + if (go.TryGetComponent(out var netObj)) + { + netObj.Spawn(true); + } + else + { + // otherwise ensure it falls via physics + var rb = go.GetComponent() ?? go.AddComponent(); + rb.useGravity = true; + } + + // attach our collision-forwarder + var mb = go.AddComponent(); + mb.controller = this; + + yield return new WaitForSeconds(interval); + } + } + + /// + /// Override this in a subclass or add logic here to handle when a meteor hits something. + /// + /// The object struck by the meteor. + protected virtual void OnHit(GameObject hitObject) + { + Debug.Log($"[Server] Meteor hit: {hitObject.name}"); + // TODO: your custom hit logic here + } + + private void OnDrawGizmosSelected() + { + // visualize the landing radius in the editor + Gizmos.matrix = transform.localToWorldMatrix; + Gizmos.DrawWireSphere(Vector3.zero, strikeRadius); + } + + /// + /// Internal helper attached to each spawned meteor to forward collisions. + /// + private class MeteorBehavior : MonoBehaviour + { + [HideInInspector] public MeteorStrikeEffect controller; + + private void OnCollisionEnter(Collision collision) + { + if (controller != null && controller.IsServer) + { + controller.OnHit(collision.gameObject); + } + Destroy(gameObject); + } + } +} diff --git a/Assets/Scripts/Gameplay/MeteorStrikeEffect.cs.meta b/Assets/Scripts/Gameplay/MeteorStrikeEffect.cs.meta new file mode 100644 index 00000000..f93e3d02 --- /dev/null +++ b/Assets/Scripts/Gameplay/MeteorStrikeEffect.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: de3fc098854109c4ca330533f2298154 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: