From 33363da571cee2fe36af2dc78c5c860364d885d8 Mon Sep 17 00:00:00 2001 From: Ali Sharoz Date: Fri, 14 Feb 2025 16:16:17 +0500 Subject: [PATCH] ForeSight VFX Fix Cursor Addition, Ability UI, Platform Shapes --- .../Fantastic cartoon VFX/Materials/WindS.mat | 16 +- .../Custom_TransparentOutline.mat | 0 .../Custom_TransparentOutline.mat.meta | 0 Assets/Prefabs/Character/Crow.prefab | 24 +- Assets/Prefabs/CursorSystem.prefab | 4 + Assets/Prefabs/ForeSightLineRenderer.prefab | 6 +- Assets/RightArrow.png | Bin 15526 -> 0 bytes Assets/Scenes/BossRoom.unity | 1346 ++++++++++++++--- Assets/Scenes/BossRoom/DungeonEntrance.unity | 229 ++- Assets/Scripts/Gameplay/AbilitySystem.cs | 6 +- Assets/Scripts/Gameplay/CrowManager.cs | 2 +- .../Scripts/Gameplay/CrowsForesightPrefab.cs | 7 +- Assets/Scripts/Gameplay/CursorState.cs | 2 + Assets/Scripts/Gameplay/PlatformManager.cs | 473 +++--- Assets/Scripts/Gameplay/UI/HeroActionBar.cs | 11 + Assets/{ => Scripts}/OutlineManager.cs | 0 Assets/{ => Scripts}/OutlineManager.cs.meta | 0 Assets/{ => Scripts}/OutlineRenderFeature.cs | 0 .../OutlineRenderFeature.cs.meta | 0 Assets/{ => Scripts}/Outliner.cs | 0 Assets/{ => Scripts}/Outliner.cs.meta | 0 Assets/{ => Scripts}/ScrollingLineRenderer.cs | 4 +- .../ScrollingLineRenderer.cs.meta | 0 Assets/{ => VFX}/FireyMaterial.mat | 0 Assets/{ => VFX}/FireyMaterial.mat.meta | 0 Assets/{ => VFX}/OutlineURP.shader | 0 Assets/{ => VFX}/OutlineURP.shader.meta | 0 Assets/{ => VFX}/OutlineURP2.shader | 0 Assets/{ => VFX}/OutlineURP2.shader.meta | 0 Assets/VFX/RightArrow.png | Bin 0 -> 16592 bytes Assets/{ => VFX}/RightArrow.png.meta | 0 Assets/{ => VFX}/ScrollingLineMaterial..mat | 2 +- .../{ => VFX}/ScrollingLineMaterial..mat.meta | 0 Assets/{ => VFX}/ScrollingLineShader.shader | 0 .../{ => VFX}/ScrollingLineShader.shader.meta | 0 35 files changed, 1660 insertions(+), 472 deletions(-) rename Assets/{ => Materials}/Custom_TransparentOutline.mat (100%) rename Assets/{ => Materials}/Custom_TransparentOutline.mat.meta (100%) delete mode 100644 Assets/RightArrow.png rename Assets/{ => Scripts}/OutlineManager.cs (100%) rename Assets/{ => Scripts}/OutlineManager.cs.meta (100%) rename Assets/{ => Scripts}/OutlineRenderFeature.cs (100%) rename Assets/{ => Scripts}/OutlineRenderFeature.cs.meta (100%) rename Assets/{ => Scripts}/Outliner.cs (100%) rename Assets/{ => Scripts}/Outliner.cs.meta (100%) rename Assets/{ => Scripts}/ScrollingLineRenderer.cs (82%) rename Assets/{ => Scripts}/ScrollingLineRenderer.cs.meta (100%) rename Assets/{ => VFX}/FireyMaterial.mat (100%) rename Assets/{ => VFX}/FireyMaterial.mat.meta (100%) rename Assets/{ => VFX}/OutlineURP.shader (100%) rename Assets/{ => VFX}/OutlineURP.shader.meta (100%) rename Assets/{ => VFX}/OutlineURP2.shader (100%) rename Assets/{ => VFX}/OutlineURP2.shader.meta (100%) create mode 100644 Assets/VFX/RightArrow.png rename Assets/{ => VFX}/RightArrow.png.meta (100%) rename Assets/{ => VFX}/ScrollingLineMaterial..mat (98%) rename Assets/{ => VFX}/ScrollingLineMaterial..mat.meta (100%) rename Assets/{ => VFX}/ScrollingLineShader.shader (100%) rename Assets/{ => VFX}/ScrollingLineShader.shader.meta (100%) diff --git a/Assets/Hovl Studio/Fantastic cartoon VFX/Materials/WindS.mat b/Assets/Hovl Studio/Fantastic cartoon VFX/Materials/WindS.mat index c29b36c..d6abf25 100644 --- a/Assets/Hovl Studio/Fantastic cartoon VFX/Materials/WindS.mat +++ b/Assets/Hovl Studio/Fantastic cartoon VFX/Materials/WindS.mat @@ -2,19 +2,25 @@ %TAG !u! tag:unity3d.com,2011: --- !u!21 &2100000 Material: - serializedVersion: 6 + serializedVersion: 8 m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} m_Name: WindS m_Shader: {fileID: 4800000, guid: 60ebdfbe66389c449a414da5266da8e6, type: 3} - m_ShaderKeywords: _SIDEOPACITY_ON + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: [] + m_InvalidKeywords: + - _SIDEOPACITY_ON m_LightmapFlags: 4 m_EnableInstancingVariants: 0 m_DoubleSidedGI: 0 m_CustomRenderQueue: -1 stringTagMap: {} disabledShaderPasses: [] + m_LockedProperties: m_SavedProperties: serializedVersion: 3 m_TexEnvs: @@ -26,6 +32,7 @@ Material: m_Texture: {fileID: 0} m_Scale: {x: 1, y: 1} m_Offset: {x: 0, y: 0} + m_Ints: [] m_Floats: - _CullMode: 0 - _Depthpower: 1 @@ -45,3 +52,4 @@ Material: - _EmissionRGB: {r: 1, g: 0.4, b: 0.4, a: 1} - _NoisespeedXY: {r: 0, g: 0, b: 0, a: 0} - _TintColor: {r: 1, g: 1, b: 1, a: 1} + m_BuildTextureStacks: [] diff --git a/Assets/Custom_TransparentOutline.mat b/Assets/Materials/Custom_TransparentOutline.mat similarity index 100% rename from Assets/Custom_TransparentOutline.mat rename to Assets/Materials/Custom_TransparentOutline.mat diff --git a/Assets/Custom_TransparentOutline.mat.meta b/Assets/Materials/Custom_TransparentOutline.mat.meta similarity index 100% rename from Assets/Custom_TransparentOutline.mat.meta rename to Assets/Materials/Custom_TransparentOutline.mat.meta diff --git a/Assets/Prefabs/Character/Crow.prefab b/Assets/Prefabs/Character/Crow.prefab index 3aba683..25680cc 100644 --- a/Assets/Prefabs/Character/Crow.prefab +++ b/Assets/Prefabs/Character/Crow.prefab @@ -70,15 +70,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4185353098247508, guid: 2c925d5a2a53b164facec46c461cbf08, type: 3} propertyPath: m_LocalScale.x - value: 0.2 + value: 0.6 objectReference: {fileID: 0} - target: {fileID: 4185353098247508, guid: 2c925d5a2a53b164facec46c461cbf08, type: 3} propertyPath: m_LocalScale.y - value: 0.3 + value: 0.90000004 objectReference: {fileID: 0} - target: {fileID: 4185353098247508, guid: 2c925d5a2a53b164facec46c461cbf08, type: 3} propertyPath: m_LocalScale.z - value: 0.2 + value: 0.6 objectReference: {fileID: 0} - target: {fileID: 4185353098247508, guid: 2c925d5a2a53b164facec46c461cbf08, type: 3} propertyPath: m_LocalPosition.x @@ -122,23 +122,31 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4185353098247508, guid: 2c925d5a2a53b164facec46c461cbf08, type: 3} propertyPath: m_ConstrainProportionsScale - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 4607482767239554, guid: 2c925d5a2a53b164facec46c461cbf08, type: 3} propertyPath: m_LocalScale.x - value: 0.1 + value: 0.3 objectReference: {fileID: 0} - target: {fileID: 4607482767239554, guid: 2c925d5a2a53b164facec46c461cbf08, type: 3} propertyPath: m_LocalScale.y - value: 0.2 + value: 0.6 objectReference: {fileID: 0} - target: {fileID: 4607482767239554, guid: 2c925d5a2a53b164facec46c461cbf08, type: 3} propertyPath: m_LocalScale.z - value: 0.1 + value: 0.3 + objectReference: {fileID: 0} + - target: {fileID: 4607482767239554, guid: 2c925d5a2a53b164facec46c461cbf08, type: 3} + propertyPath: m_LocalPosition.x + value: -1.31 objectReference: {fileID: 0} - target: {fileID: 4607482767239554, guid: 2c925d5a2a53b164facec46c461cbf08, type: 3} propertyPath: m_ConstrainProportionsScale - value: 0 + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 198937496368903046, guid: 2c925d5a2a53b164facec46c461cbf08, type: 3} + propertyPath: InitialModule.startColor.maxColor.a + value: 1 objectReference: {fileID: 0} m_RemovedComponents: [] m_RemovedGameObjects: [] diff --git a/Assets/Prefabs/CursorSystem.prefab b/Assets/Prefabs/CursorSystem.prefab index 9fcae1f..b79ed6d 100644 --- a/Assets/Prefabs/CursorSystem.prefab +++ b/Assets/Prefabs/CursorSystem.prefab @@ -59,6 +59,10 @@ MonoBehaviour: cursorSprite: {fileID: 21300000, guid: 95df65ca6b071bc46abc311e5df6c825, type: 3} - state: 5 cursorSprite: {fileID: 21300000, guid: dd87f236e3b9ed340981d46ddd4c4b4d, type: 3} + - state: 6 + cursorSprite: {fileID: 21300000, guid: c06f03bfa5a475d4e8369a8da969bf27, type: 3} + - state: 7 + cursorSprite: {fileID: 21300000, guid: 51426df4432f6414899c4bef10e4687a, type: 3} cursorObject: {fileID: 3100281247147120253} --- !u!1 &3100281247147120253 GameObject: diff --git a/Assets/Prefabs/ForeSightLineRenderer.prefab b/Assets/Prefabs/ForeSightLineRenderer.prefab index 7121ff2..baacc0c 100644 --- a/Assets/Prefabs/ForeSightLineRenderer.prefab +++ b/Assets/Prefabs/ForeSightLineRenderer.prefab @@ -29,7 +29,7 @@ Transform: 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: 1 + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -129,7 +129,7 @@ LineRenderer: numCornerVertices: 0 numCapVertices: 0 alignment: 0 - textureMode: 0 + textureMode: 1 textureScale: {x: 1, y: 1} shadowBias: 0.5 generateLightingData: 0 @@ -152,4 +152,4 @@ MonoBehaviour: lineRenderer: {fileID: 9057376229307534297} scrollingMaterial: {fileID: 2100000, guid: 77e5ea3a019674146a9f2b3ed629b386, type: 2} speed: 1 - tiling: 0.28 + tiling: 0.5 diff --git a/Assets/RightArrow.png b/Assets/RightArrow.png deleted file mode 100644 index fd39ebe241bc85bf70c1c9c38ed84d9ef2bb77d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15526 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 x5T^%^9M$FJ<-OcI /// Ensures the players list is updated when a player is spawned or despawned. - /// + /// /// The ServerCharacter to track. public void OnPlayerSpawned(ServerCharacter character) { diff --git a/Assets/Scripts/Gameplay/CrowsForesightPrefab.cs b/Assets/Scripts/Gameplay/CrowsForesightPrefab.cs index 3061a33..82b7474 100644 --- a/Assets/Scripts/Gameplay/CrowsForesightPrefab.cs +++ b/Assets/Scripts/Gameplay/CrowsForesightPrefab.cs @@ -133,11 +133,10 @@ public class CrowsForesightPrefab : NetworkBehaviour private LineRenderer CreateLine() { //GameObject lineObj = new GameObject("ForesightLine"); - GameObject lineObj = Instantiate(LinePrefab); - LineRenderer line = lineObj.AddComponent(); - line.startWidth = 0.7f; - line.endWidth = 0.7f; + LineRenderer line = lineObj.GetComponent(); + line.startWidth = 1f; + line.endWidth = 1f; //line.material = new Material(Shader.Find("Sprites/Default")); line.transform.SetParent(transform); return line; diff --git a/Assets/Scripts/Gameplay/CursorState.cs b/Assets/Scripts/Gameplay/CursorState.cs index 7a94ef2..f206b8c 100644 --- a/Assets/Scripts/Gameplay/CursorState.cs +++ b/Assets/Scripts/Gameplay/CursorState.cs @@ -6,4 +6,6 @@ public enum CursorState VectorWall, Dash, Freeze, + Executioner, + Foresight, } diff --git a/Assets/Scripts/Gameplay/PlatformManager.cs b/Assets/Scripts/Gameplay/PlatformManager.cs index 38e274a..a1cdef2 100644 --- a/Assets/Scripts/Gameplay/PlatformManager.cs +++ b/Assets/Scripts/Gameplay/PlatformManager.cs @@ -11,7 +11,8 @@ namespace Unity.Multiplayer.Samples.BossRoom { public static PlatformManager Instance; public List m_Platforms; - public int numberOfPlayers = 2; // Number of players (n) + public Transform centerPoint; + public float shapeRadius = 5f; private void Awake() { @@ -31,220 +32,80 @@ namespace Unity.Multiplayer.Samples.BossRoom { InitializePlatforms(); StartCoroutine(DelayedServerSetup()); - } } - #region DistancePlatform - public List platforms; // Assign all platforms in the Inspector - private List activePlatforms = new List(); // Stores only active platforms - private Dictionary platformDistances = new Dictionary(); // Stores distances - private List sortedUniqueDistances = new List(); // Stores unique sorted distances - public List platformTransforms; // Assign platform GameObjects here - public Transform centerPoint; // Center position where the shape will form - public float shapeRadius = 5f; - - - - void Starter() - { - UpdateActivePlatforms(); - PrecomputeDistances(); - } - public void ArrangePlatforms() + private void InitializePlatforms() { - // Get only active platforms - List activePlatforms = platformTransforms.Where(p => p.gameObject.activeSelf).ToList(); - int count = activePlatforms.Count; - - if (count < 3) + m_Platforms = GetComponentsInChildren(true).ToList(); + for (int i = 0; i < m_Platforms.Count; i++) { - Debug.LogWarning("Not enough platforms to form a shape!"); - return; + m_Platforms[i].AssignID(i + 1); } + } - // Arrange them in a regular polygon shape - PlacePlatformsInShape(activePlatforms, count); + private IEnumerator DelayedServerSetup() + { + yield return new WaitForSeconds(0.5f); + PlatformSelection(); } - private void PlacePlatformsInShape(List platforms, int count) + public void ArrangePlatforms() { - float angleStep = 360f / count; // Equal angles for each platform - float startAngle = 90f; // Start from the top (adjust if needed) + List activePlatforms = m_Platforms.Where(p => p.gameObject.activeSelf).ToList(); + int platformCount = activePlatforms.Count; + Debug.Log("Count of Active Platforms is: " + platformCount); + if (platformCount < 3) return; // Minimum 3 platforms for a shape - for (int i = 0; i < count; i++) + float angleStep = 360f / platformCount; + float startAngle = 90f; // Start from top + + for (int i = 0; i < platformCount; i++) { float angle = startAngle + (i * angleStep); float radians = angle * Mathf.Deg2Rad; - // Calculate new position using circle formula Vector3 newPosition = new Vector3( centerPoint.position.x + shapeRadius * Mathf.Cos(radians), centerPoint.position.y, centerPoint.position.z + shapeRadius * Mathf.Sin(radians) ); - // Move platform to its new position - platforms[i].position = newPosition; - } - } - - public void UpdateActivePlatforms() - { - // Refresh the active platforms list - activePlatforms = platforms.Where(p => p.gameObject.activeSelf).ToList(); - } - - private void PrecomputeDistances() - { - platformDistances.Clear(); - sortedUniqueDistances.Clear(); - - if (activePlatforms.Count < 2) - { - Debug.LogWarning("Not enough active platforms to calculate distances."); - return; - } - - HashSet uniqueDistances = new HashSet(); - - // Compute and store distances between all active platform pairs - for (int i = 0; i < activePlatforms.Count; i++) - { - for (int j = i + 1; j < activePlatforms.Count; j++) - { - Platform platformA = activePlatforms[i]; - Platform platformB = activePlatforms[j]; - - float rawDistance = Vector3.Distance(platformA.transform.position, platformB.transform.position); - float roundedDistance = Mathf.Round(rawDistance * 100f) / 100f; // Rounds to 2 decimal places - - uniqueDistances.Add(roundedDistance); - - string key = GetPlatformKey(platformA, platformB); - platformDistances[key] = roundedDistance; - } - } - - // Convert unique distances into a sorted list - sortedUniqueDistances = uniqueDistances.OrderBy(d => d).ToList(); - - Debug.Log("Sorted unique distances: " + string.Join(", ", sortedUniqueDistances)); - } - - public float CalculateScore(Platform platformA, Platform platformB) - { - if(platformA== null) - { - Debug.Log("platformA is null"); - } - if(platformB == null) - { - Debug.Log("platformB is null"); - } - if (!platformA.gameObject.activeSelf || !platformB.gameObject.activeSelf) - { - Debug.Log("One or both selected platforms are not active."); - return -1; - } - Debug.Log("PlatformKey getter"); - string key = GetPlatformKey(platformA, platformB); - Debug.Log("PlatformKey getter2"); - if (!platformDistances.ContainsKey(key)) - { - Debug.LogError("Distance for selected platforms not found!"); - return -1; - } - - float distance = platformDistances[key]; - float scoreMultiplier = GetMultiplier(distance); - Debug.Log($"Platforms {platformA.name} & {platformB.name} selected. Distance: {distance:F2}, Score Multiplier: {scoreMultiplier}"); - return scoreMultiplier; - } - - private float GetMultiplier(float distance) - { - if (sortedUniqueDistances.Count == 0) - { - return 1.0f; // Default if no distances are calculated + activePlatforms[i].transform.position = newPosition; } - - // Find the index of the selected distance in the sorted list - int index = sortedUniqueDistances.IndexOf(distance); - - // Multiplier starts from 1.0 and increases by 0.1 per step - return 1.0f + (index * 0.1f); - } - - private string GetPlatformKey(Platform platformA, Platform platformB) - { - return platformA.name + "_" + platformB.name; - } - #endregion - /// - /// Initializes platform list and assigns unique IDs. - /// - private void InitializePlatforms() - { - m_Platforms = GetComponentsInChildren(true).ToList(); - for (int i = 0; i < m_Platforms.Count; i++) - { - m_Platforms[i].AssignID(i + 1); // Assign unique IDs to platforms - } - } - - /// - /// Delayed server setup to allow other components to initialize. - /// - private IEnumerator DelayedServerSetup() - { - yield return new WaitForSeconds(0.5f); - PlatformSelection(); } - /// - /// Server-side logic to select and enable platforms based on player count. - /// private void PlatformSelection() { + //int platformsToSpawn = 5; + int platformsToSpawn = PlayerPrefs.GetInt("NumberOfLobbyPlayers", 1) - 1; - int platformsToSpawn = PlayerPrefs.GetInt("NumberOfLobbyPlayers",1) - 1; - //int platformsToSpawn = 2; - - // Disable all platforms initially foreach (var platform in m_Platforms) { platform.gameObject.SetActive(false); } - // Enable required number of platforms for (int i = 0; i < platformsToSpawn; i++) { - Debug.Log(m_Platforms[i].gameObject.name + " is activated"); m_Platforms[i].gameObject.SetActive(true); } m_Platforms = m_Platforms.Where(platform => platform.gameObject.activeSelf).ToList(); int[] platformIDs = m_Platforms.Select(p => p.PlatformID.Value).ToArray(); - // Notify clients to enable corresponding platforms ClientEnablePlatformClientRpc(platformIDs); + ArrangePlatforms(); } - /// - /// ClientRpc to enable platforms on the client side. - /// [ClientRpc] private void ClientEnablePlatformClientRpc(int[] platformIDs) { m_Platforms = GetComponentsInChildren(true).ToList(); - // Disable all platforms initially foreach (var platform in m_Platforms) { platform.gameObject.SetActive(false); } - // Enable specified platforms foreach (int id in platformIDs) { var platformToEnable = m_Platforms.FirstOrDefault(p => p.PlatformID.Value == id); @@ -255,22 +116,12 @@ namespace Unity.Multiplayer.Samples.BossRoom } m_Platforms = m_Platforms.Where(platform => platform.gameObject.activeSelf).ToList(); - - Starter(); - + } - /// - /// Finds the nearest unoccupied platform to a given position. - /// Server-only method. - /// public Platform FindNearestUnoccupiedPlatform(Vector3 position) { - if (!IsServer) - { - Debug.LogError("FindNearestUnoccupiedPlatform should only be called on the server."); - return null; - } + if (!IsServer) return null; return m_Platforms .Where(platform => !platform.IsOccupied) @@ -278,42 +129,27 @@ namespace Unity.Multiplayer.Samples.BossRoom .FirstOrDefault(); } - /// - /// Checks if all platforms are occupied. - /// public bool AreAllPlatformsOccupied() { return m_Platforms.All(platform => platform.IsOccupied); } - /// - /// Gets the platform occupied by a specific player. - /// public Platform GetPlatformOccupiedByPlayer(ServerCharacter player) { return m_Platforms.FirstOrDefault(p => p.IsOccupied && p.GetOccupierId() == player.OwnerClientId); } - /// - /// Checks if a platform is occupied. - /// public bool IsPlatformOccupied(Platform platform) { return platform.IsOccupied; } - /// - /// Gets the position of a platform by its ID. - /// public Vector3 GetPlatformPosition(int platformId) { var platform = m_Platforms.FirstOrDefault(p => p.PlatformID.Value == platformId); return platform ? platform.transform.position : Vector3.zero; } - /// - /// Gets a platform by its ID. - /// public Platform GetPlatformById(int platformId) { return m_Platforms.FirstOrDefault(p => p.PlatformID.Value == platformId); @@ -322,6 +158,7 @@ namespace Unity.Multiplayer.Samples.BossRoom } + //using System.Collections; //using System.Collections.Generic; //using System.Linq; @@ -336,7 +173,6 @@ namespace Unity.Multiplayer.Samples.BossRoom // public static PlatformManager Instance; // public List m_Platforms; // public int numberOfPlayers = 2; // Number of players (n) -// public float planeRadius = 4f; // Radius of the circular plane // private void Awake() // { @@ -354,86 +190,241 @@ namespace Unity.Multiplayer.Samples.BossRoom // { // if (IsServer) // { -// m_Platforms = GetComponentsInChildren(true).ToList(); -// for (int i = 0; i < m_Platforms.Count; i++) +// InitializePlatforms(); +// StartCoroutine(DelayedServerSetup()); + +// } +// } +// #region DistancePlatform +// public List platforms; // Assign all platforms in the Inspector +// private List activePlatforms = new List(); // Stores only active platforms +// private Dictionary platformDistances = new Dictionary(); // Stores distances +// private List sortedUniqueDistances = new List(); // Stores unique sorted distances +// public List platformTransforms; // Assign platform GameObjects here +// public Transform centerPoint; // Center position where the shape will form +// public float shapeRadius = 5f; + + + +// void Starter() +// { +// UpdateActivePlatforms(); +// PrecomputeDistances(); +// } + +// public void ArrangePlatforms() +// { +// // Get only active platforms +// List activePlatforms = platformTransforms.Where(p => p.gameObject.activeSelf).ToList(); +// int count = activePlatforms.Count; + +// if (count < 3) +// { +// Debug.LogWarning("Not enough platforms to form a shape!"); +// return; +// } + +// // Arrange them in a regular polygon shape +// PlacePlatformsInShape(activePlatforms, count); +// } + +// private void PlacePlatformsInShape(List platforms, int count) +// { +// float angleStep = 360f / count; // Equal angles for each platform +// float startAngle = 90f; // Start from the top (adjust if needed) + +// for (int i = 0; i < count; i++) +// { +// float angle = startAngle + (i * angleStep); +// float radians = angle * Mathf.Deg2Rad; + +// // Calculate new position using circle formula +// Vector3 newPosition = new Vector3( +// centerPoint.position.x + shapeRadius * Mathf.Cos(radians), +// centerPoint.position.y, +// centerPoint.position.z + shapeRadius * Mathf.Sin(radians) +// ); + +// // Move platform to its new position +// platforms[i].position = newPosition; +// } +// } + +// public void UpdateActivePlatforms() +// { +// // Refresh the active platforms list +// activePlatforms = platforms.Where(p => p.gameObject.activeSelf).ToList(); +// } + +// private void PrecomputeDistances() +// { +// platformDistances.Clear(); +// sortedUniqueDistances.Clear(); + +// if (activePlatforms.Count < 2) +// { +// Debug.LogWarning("Not enough active platforms to calculate distances."); +// return; +// } + +// HashSet uniqueDistances = new HashSet(); + +// // Compute and store distances between all active platform pairs +// for (int i = 0; i < activePlatforms.Count; i++) +// { +// for (int j = i + 1; j < activePlatforms.Count; j++) // { -// m_Platforms[i].AssignID(i + 1); // Initialize platforms with unique IDs +// Platform platformA = activePlatforms[i]; +// Platform platformB = activePlatforms[j]; + +// float rawDistance = Vector3.Distance(platformA.transform.position, platformB.transform.position); +// float roundedDistance = Mathf.Round(rawDistance * 100f) / 100f; // Rounds to 2 decimal places + +// uniqueDistances.Add(roundedDistance); + +// string key = GetPlatformKey(platformA, platformB); +// platformDistances[key] = roundedDistance; // } -// StartCoroutine(DelayedServerSetup()); // } -// else + +// // Convert unique distances into a sorted list +// sortedUniqueDistances = uniqueDistances.OrderBy(d => d).ToList(); + +// Debug.Log("Sorted unique distances: " + string.Join(", ", sortedUniqueDistances)); +// } + +// public float CalculateScore(Platform platformA, Platform platformB) +// { +// if(platformA== null) +// { +// Debug.Log("platformA is null"); +// } +// if(platformB == null) +// { +// Debug.Log("platformB is null"); +// } +// if (!platformA.gameObject.activeSelf || !platformB.gameObject.activeSelf) // { -// StartCoroutine(DelayedClientSetup()); // Delay to give time to load +// Debug.Log("One or both selected platforms are not active."); +// return -1; // } +// Debug.Log("PlatformKey getter"); +// string key = GetPlatformKey(platformA, platformB); +// Debug.Log("PlatformKey getter2"); +// if (!platformDistances.ContainsKey(key)) +// { +// Debug.LogError("Distance for selected platforms not found!"); +// return -1; +// } + +// float distance = platformDistances[key]; +// float scoreMultiplier = GetMultiplier(distance); +// Debug.Log($"Platforms {platformA.name} & {platformB.name} selected. Distance: {distance:F2}, Score Multiplier: {scoreMultiplier}"); +// return scoreMultiplier; // } +// private float GetMultiplier(float distance) +// { +// if (sortedUniqueDistances.Count == 0) +// { +// return 1.0f; // Default if no distances are calculated +// } + +// // Find the index of the selected distance in the sorted list +// int index = sortedUniqueDistances.IndexOf(distance); + +// // Multiplier starts from 1.0 and increases by 0.1 per step +// return 1.0f + (index * 0.1f); +// } + +// private string GetPlatformKey(Platform platformA, Platform platformB) +// { +// return platformA.name + "_" + platformB.name; +// } +// #endregion // /// -// /// Coroutine to delay server-side setup. +// /// Initializes platform list and assigns unique IDs. // /// -// private IEnumerator DelayedServerSetup() +// private void InitializePlatforms() // { -// yield return new WaitForSeconds(0.5f); // Delay for 0.5 seconds -// PlatformSelection(); // Call ServerRpc after delay +// m_Platforms = GetComponentsInChildren(true).ToList(); +// for (int i = 0; i < m_Platforms.Count; i++) +// { +// m_Platforms[i].AssignID(i + 1); // Assign unique IDs to platforms +// } // } // /// -// /// Coroutine to delay client-side setup. +// /// Delayed server setup to allow other components to initialize. // /// -// private IEnumerator DelayedClientSetup() +// private IEnumerator DelayedServerSetup() // { // yield return new WaitForSeconds(0.5f); -// m_Platforms = GetComponentsInChildren(true).ToList(); // Populate client platform list -// Debug.Log($"Client platform list initialized. Platform count: {m_Platforms.Count}"); +// PlatformSelection(); // } + +// /// +// /// Server-side logic to select and enable platforms based on player count. +// /// // private void PlatformSelection() // { -// int platformsToSpawn = PlayerPrefs.GetInt("NumberOfLobbyPlayers") - 1; -// m_Platforms.ForEach(platform => platform.gameObject.SetActive(false)); -// Debug.Log("Disabled all platforms on the server."); +// int platformsToSpawn = PlayerPrefs.GetInt("NumberOfLobbyPlayers",1) - 1; +// //int platformsToSpawn = 2; -// if (platformsToSpawn > 0) +// // Disable all platforms initially +// foreach (var platform in m_Platforms) // { -// for (int i = 0; i < platformsToSpawn; i++) -// { -// m_Platforms[i].gameObject.SetActive(true); -// Debug.Log($"Enabled platform with ID {m_Platforms[i].PlatformID.Value} on server."); -// } +// platform.gameObject.SetActive(false); // } + +// // Enable required number of platforms +// for (int i = 0; i < platformsToSpawn; i++) +// { +// Debug.Log(m_Platforms[i].gameObject.name + " is activated"); +// m_Platforms[i].gameObject.SetActive(true); +// } + // m_Platforms = m_Platforms.Where(platform => platform.gameObject.activeSelf).ToList(); // int[] platformIDs = m_Platforms.Select(p => p.PlatformID.Value).ToArray(); + +// // Notify clients to enable corresponding platforms // ClientEnablePlatformClientRpc(platformIDs); // } +// /// +// /// ClientRpc to enable platforms on the client side. +// /// // [ClientRpc] // private void ClientEnablePlatformClientRpc(int[] platformIDs) // { -// m_Platforms = GetComponentsInChildren(true).ToList(); // Ensure the platform list is refreshed -// Debug.Log($"Client received platform IDs: {string.Join(",", platformIDs)}"); -// Debug.Log($"Client platform list count: {m_Platforms.Count}"); - +// m_Platforms = GetComponentsInChildren(true).ToList(); +// // Disable all platforms initially // foreach (var platform in m_Platforms) // { // platform.gameObject.SetActive(false); -// Debug.Log($"Disabled platform with ID: {platform.PlatformID.Value}"); // } +// // Enable specified platforms // foreach (int id in platformIDs) // { // var platformToEnable = m_Platforms.FirstOrDefault(p => p.PlatformID.Value == id); // if (platformToEnable != null) // { // platformToEnable.gameObject.SetActive(true); -// Debug.Log($"Enabled platform with ID: {id}"); -// } -// else -// { -// Debug.LogError($"Platform with ID {id} not found on client."); // } // } + // m_Platforms = m_Platforms.Where(platform => platform.gameObject.activeSelf).ToList(); +// Starter(); + // } + +// /// +// /// Finds the nearest unoccupied platform to a given position. +// /// Server-only method. +// /// // public Platform FindNearestUnoccupiedPlatform(Vector3 position) // { // if (!IsServer) @@ -448,46 +439,42 @@ namespace Unity.Multiplayer.Samples.BossRoom // .FirstOrDefault(); // } +// /// +// /// Checks if all platforms are occupied. +// /// // public bool AreAllPlatformsOccupied() // { // return m_Platforms.All(platform => platform.IsOccupied); // } -// /*public bool AssignPlayerToPlatform(ServerCharacter player) -// { -// if (!IsServer) -// { -// Debug.LogError("AssignPlayerToPlatform should only be called on the server."); -// return false; -// } - -// var platform = m_Platforms.FirstOrDefault(p => !p.IsOccupied); -// if (platform != null) -// { -// platform.Occupy(player); -// return true; -// } - -// Debug.LogWarning($"No unoccupied platforms available for {player.name}."); -// return false; -// }*/ - +// /// +// /// Gets the platform occupied by a specific player. +// /// // public Platform GetPlatformOccupiedByPlayer(ServerCharacter player) // { // return m_Platforms.FirstOrDefault(p => p.IsOccupied && p.GetOccupierId() == player.OwnerClientId); // } +// /// +// /// Checks if a platform is occupied. +// /// // public bool IsPlatformOccupied(Platform platform) // { // return platform.IsOccupied; // } +// /// +// /// Gets the position of a platform by its ID. +// /// // public Vector3 GetPlatformPosition(int platformId) // { // var platform = m_Platforms.FirstOrDefault(p => p.PlatformID.Value == platformId); // return platform ? platform.transform.position : Vector3.zero; // } +// /// +// /// Gets a platform by its ID. +// /// // public Platform GetPlatformById(int platformId) // { // return m_Platforms.FirstOrDefault(p => p.PlatformID.Value == platformId); diff --git a/Assets/Scripts/Gameplay/UI/HeroActionBar.cs b/Assets/Scripts/Gameplay/UI/HeroActionBar.cs index ba4d77f..fce7628 100644 --- a/Assets/Scripts/Gameplay/UI/HeroActionBar.cs +++ b/Assets/Scripts/Gameplay/UI/HeroActionBar.cs @@ -26,6 +26,12 @@ namespace Unity.BossRoom.Gameplay.UI [SerializeField] [Tooltip("The button that activates the hero's second special move")] UIHUDButton m_SpecialAction2Button; + [SerializeField] + [Tooltip("The button that activates the hero's thid special move")] + UIHUDButton m_SpecialAction3Button; + [SerializeField] + [Tooltip("The button that activates the hero's fourth special move")] + UIHUDButton m_SpecialAction4Button; [SerializeField] [Tooltip("The button that opens/closes the Emote bar")] @@ -49,6 +55,9 @@ namespace Unity.BossRoom.Gameplay.UI Special1, Special2, EmoteBar, + Special3, + Special4, + } /// @@ -171,6 +180,8 @@ namespace Unity.BossRoom.Gameplay.UI [ActionButtonType.BasicAction] = new ActionButtonInfo(ActionButtonType.BasicAction, m_BasicActionButton, this), [ActionButtonType.Special1] = new ActionButtonInfo(ActionButtonType.Special1, m_SpecialAction1Button, this), [ActionButtonType.Special2] = new ActionButtonInfo(ActionButtonType.Special2, m_SpecialAction2Button, this), + [ActionButtonType.Special3] = new ActionButtonInfo(ActionButtonType.Special3, m_SpecialAction3Button, this), + [ActionButtonType.Special4] = new ActionButtonInfo(ActionButtonType.Special4, m_SpecialAction4Button, this), [ActionButtonType.EmoteBar] = new ActionButtonInfo(ActionButtonType.EmoteBar, m_EmoteBarButton, this), }; diff --git a/Assets/OutlineManager.cs b/Assets/Scripts/OutlineManager.cs similarity index 100% rename from Assets/OutlineManager.cs rename to Assets/Scripts/OutlineManager.cs diff --git a/Assets/OutlineManager.cs.meta b/Assets/Scripts/OutlineManager.cs.meta similarity index 100% rename from Assets/OutlineManager.cs.meta rename to Assets/Scripts/OutlineManager.cs.meta diff --git a/Assets/OutlineRenderFeature.cs b/Assets/Scripts/OutlineRenderFeature.cs similarity index 100% rename from Assets/OutlineRenderFeature.cs rename to Assets/Scripts/OutlineRenderFeature.cs diff --git a/Assets/OutlineRenderFeature.cs.meta b/Assets/Scripts/OutlineRenderFeature.cs.meta similarity index 100% rename from Assets/OutlineRenderFeature.cs.meta rename to Assets/Scripts/OutlineRenderFeature.cs.meta diff --git a/Assets/Outliner.cs b/Assets/Scripts/Outliner.cs similarity index 100% rename from Assets/Outliner.cs rename to Assets/Scripts/Outliner.cs diff --git a/Assets/Outliner.cs.meta b/Assets/Scripts/Outliner.cs.meta similarity index 100% rename from Assets/Outliner.cs.meta rename to Assets/Scripts/Outliner.cs.meta diff --git a/Assets/ScrollingLineRenderer.cs b/Assets/Scripts/ScrollingLineRenderer.cs similarity index 82% rename from Assets/ScrollingLineRenderer.cs rename to Assets/Scripts/ScrollingLineRenderer.cs index c5bafec..b2ff1b6 100644 --- a/Assets/ScrollingLineRenderer.cs +++ b/Assets/Scripts/ScrollingLineRenderer.cs @@ -12,8 +12,8 @@ public class ScrollingLineRenderer : MonoBehaviour if (scrollingMaterial == null) return; // Scroll texture over time - float offset = Time.time * -speed; + float offset = Time.time * speed; scrollingMaterial.SetFloat("_Speed", speed); - scrollingMaterial.SetFloat("_Tiling", tiling); + scrollingMaterial.SetFloat("_Tiling", -tiling); } } diff --git a/Assets/ScrollingLineRenderer.cs.meta b/Assets/Scripts/ScrollingLineRenderer.cs.meta similarity index 100% rename from Assets/ScrollingLineRenderer.cs.meta rename to Assets/Scripts/ScrollingLineRenderer.cs.meta diff --git a/Assets/FireyMaterial.mat b/Assets/VFX/FireyMaterial.mat similarity index 100% rename from Assets/FireyMaterial.mat rename to Assets/VFX/FireyMaterial.mat diff --git a/Assets/FireyMaterial.mat.meta b/Assets/VFX/FireyMaterial.mat.meta similarity index 100% rename from Assets/FireyMaterial.mat.meta rename to Assets/VFX/FireyMaterial.mat.meta diff --git a/Assets/OutlineURP.shader b/Assets/VFX/OutlineURP.shader similarity index 100% rename from Assets/OutlineURP.shader rename to Assets/VFX/OutlineURP.shader diff --git a/Assets/OutlineURP.shader.meta b/Assets/VFX/OutlineURP.shader.meta similarity index 100% rename from Assets/OutlineURP.shader.meta rename to Assets/VFX/OutlineURP.shader.meta diff --git a/Assets/OutlineURP2.shader b/Assets/VFX/OutlineURP2.shader similarity index 100% rename from Assets/OutlineURP2.shader rename to Assets/VFX/OutlineURP2.shader diff --git a/Assets/OutlineURP2.shader.meta b/Assets/VFX/OutlineURP2.shader.meta similarity index 100% rename from Assets/OutlineURP2.shader.meta rename to Assets/VFX/OutlineURP2.shader.meta diff --git a/Assets/VFX/RightArrow.png b/Assets/VFX/RightArrow.png new file mode 100644 index 0000000000000000000000000000000000000000..e84ede5eaff5ebb9a914ea50acf38a81ea54d1a7 GIT binary patch literal 16592 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