diff --git a/Assets/Prefabs/Player Blue.prefab b/Assets/Prefabs/Player Blue.prefab index 11cbeeb..60fd4ab 100644 --- a/Assets/Prefabs/Player Blue.prefab +++ b/Assets/Prefabs/Player Blue.prefab @@ -47,7 +47,7 @@ SphereCollider: serializedVersion: 2 m_Bits: 0 m_LayerOverridePriority: 0 - m_IsTrigger: 0 + m_IsTrigger: 1 m_ProvidesContacts: 0 m_Enabled: 1 serializedVersion: 3 @@ -302,8 +302,9 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 2b6244fd2a6ceee4ab8504fadf75ae20, type: 3} m_Name: m_EditorClassIdentifier: - cameraOperator: {fileID: 0} playerId: 2 + playerName: Blue Bilboa + cameraOperator: {fileID: 0} thrustAcceleration: 1500 steerVelocity: 300 normalMaxVelocity: 25 @@ -318,9 +319,11 @@ MonoBehaviour: boostMagnitude: 2.5 outsideBoostRate: 0 boostAntiGravityFactor: 0.8 - tackleStunFactor: 0.1 - tackleStunTime: 0.6 - tacklePowerFactor: 30 + stunLooseControlFactor: 0.1 + tackleCriticalStunTime: 0.6 + tackleBodyStunTime: 0.3 + criticalTacklePowerFactor: 234 + normalTacklePowerFactor: 10 boostUI: {fileID: 4200181511080825266} playerInput: {fileID: 0} instanceID: 0 @@ -417,6 +420,7 @@ GameObject: m_Component: - component: {fileID: 6166152332587307364} - component: {fileID: 1551560316097652998} + - component: {fileID: 3630649017457658103} m_Layer: 7 m_Name: BodyArea m_TagString: Vulnerable @@ -459,9 +463,25 @@ CapsuleCollider: m_Enabled: 1 serializedVersion: 2 m_Radius: 0.57511306 - m_Height: 2.3651605 + m_Height: 2 m_Direction: 1 - m_Center: {x: 0, y: -0.2, z: 0} + m_Center: {x: 0, y: 0, z: 0} +--- !u!114 &3630649017457658103 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7665455622387539610} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3c7fe3de71657ad45a715b48cce00faa, type: 3} + m_Name: + m_EditorClassIdentifier: + tackleKind: 1 + TackleResponse: + m_PersistentCalls: + m_Calls: [] --- !u!1 &8319233940171307812 GameObject: m_ObjectHideFlags: 0 @@ -555,6 +575,7 @@ GameObject: m_Component: - component: {fileID: 5758221365909025383} - component: {fileID: 7759512979313569539} + - component: {fileID: 1265162896801572869} m_Layer: 7 m_Name: VulnerableArea m_TagString: Vulnerable @@ -596,10 +617,26 @@ CapsuleCollider: m_ProvidesContacts: 0 m_Enabled: 1 serializedVersion: 2 - m_Radius: 0.56869245 - m_Height: 1.1373849 - m_Direction: 1 - m_Center: {x: -0.0013287067, y: 0.115499854, z: 0} + m_Radius: 0.24395981 + m_Height: 1.101471 + m_Direction: 0 + m_Center: {x: 0.012868404, y: -0.077233285, z: 0} +--- !u!114 &1265162896801572869 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9173867352853251920} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3c7fe3de71657ad45a715b48cce00faa, type: 3} + m_Name: + m_EditorClassIdentifier: + tackleKind: 0 + TackleResponse: + m_PersistentCalls: + m_Calls: [] --- !u!1001 &1930064064740072725 PrefabInstance: m_ObjectHideFlags: 0 diff --git a/Assets/Prefabs/Player Gray.prefab b/Assets/Prefabs/Player Gray.prefab index 6bbf518..30acf8d 100644 --- a/Assets/Prefabs/Player Gray.prefab +++ b/Assets/Prefabs/Player Gray.prefab @@ -248,8 +248,9 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 2b6244fd2a6ceee4ab8504fadf75ae20, type: 3} m_Name: m_EditorClassIdentifier: - cameraOperator: {fileID: 0} playerId: 1 + playerName: Gray Gustav + cameraOperator: {fileID: 0} thrustAcceleration: 1500 steerVelocity: 300 normalMaxVelocity: 25 @@ -264,9 +265,11 @@ MonoBehaviour: boostMagnitude: 2.5 outsideBoostRate: 0 boostAntiGravityFactor: 0.8 - tackleStunFactor: 0.1 - tackleStunTime: 0.6 - tacklePowerFactor: 30 + stunLooseControlFactor: 0.1 + tackleCriticalStunTime: 0.6 + tackleBodyStunTime: 0.3 + criticalTacklePowerFactor: 183 + normalTacklePowerFactor: 10 boostUI: {fileID: 3576024133074538910} playerInput: {fileID: 0} instanceID: 0 @@ -317,11 +320,11 @@ SphereCollider: serializedVersion: 2 m_Bits: 0 m_LayerOverridePriority: 0 - m_IsTrigger: 0 + m_IsTrigger: 1 m_ProvidesContacts: 0 m_Enabled: 1 serializedVersion: 3 - m_Radius: 0.4807241 + m_Radius: 0.5 m_Center: {x: 0, y: -0.15, z: 0} --- !u!1 &3792860668480113901 GameObject: @@ -416,6 +419,7 @@ GameObject: m_Component: - component: {fileID: 3900807414520724371} - component: {fileID: 2877831592369095334} + - component: {fileID: 6578531240251070333} m_Layer: 7 m_Name: VulnerableArea m_TagString: Vulnerable @@ -457,10 +461,26 @@ CapsuleCollider: m_ProvidesContacts: 0 m_Enabled: 1 serializedVersion: 2 - m_Radius: 0.38593757 - m_Height: 1.3338675 + m_Radius: 0.24395981 + m_Height: 1.101471 m_Direction: 0 - m_Center: {x: -0.000009298325, y: -0.025820732, z: 0} + m_Center: {x: 0.012868404, y: -0.077233285, z: 0} +--- !u!114 &6578531240251070333 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4131857668379936813} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3c7fe3de71657ad45a715b48cce00faa, type: 3} + m_Name: + m_EditorClassIdentifier: + tackleKind: 0 + TackleResponse: + m_PersistentCalls: + m_Calls: [] --- !u!1 &7085924197508447212 GameObject: m_ObjectHideFlags: 0 @@ -471,6 +491,7 @@ GameObject: m_Component: - component: {fileID: 2323253733787261421} - component: {fileID: 7345168250516523601} + - component: {fileID: 1618336731388176427} m_Layer: 7 m_Name: BodyArea m_TagString: Vulnerable @@ -513,9 +534,25 @@ CapsuleCollider: m_Enabled: 1 serializedVersion: 2 m_Radius: 0.57511306 - m_Height: 2.3651605 + m_Height: 2 m_Direction: 1 - m_Center: {x: 0, y: -0.2, z: 0} + m_Center: {x: 0, y: 0, z: 0} +--- !u!114 &1618336731388176427 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7085924197508447212} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3c7fe3de71657ad45a715b48cce00faa, type: 3} + m_Name: + m_EditorClassIdentifier: + tackleKind: 1 + TackleResponse: + m_PersistentCalls: + m_Calls: [] --- !u!1001 &8054534206256546014 PrefabInstance: m_ObjectHideFlags: 0 diff --git a/Assets/Scenes/BattleField.unity b/Assets/Scenes/BattleField.unity index a9ec717..018684f 100644 --- a/Assets/Scenes/BattleField.unity +++ b/Assets/Scenes/BattleField.unity @@ -365,6 +365,14 @@ PrefabInstance: propertyPath: cameraOperator value: objectReference: {fileID: 963194229} + - target: {fileID: 8932415214367391550, guid: 105162f72bf50c84aaf92b1ca494ed3b, type: 3} + propertyPath: normalTacklePowerFactor + value: 10 + objectReference: {fileID: 0} + - target: {fileID: 8932415214367391550, guid: 105162f72bf50c84aaf92b1ca494ed3b, type: 3} + propertyPath: criticalTacklePowerFactor + value: 25 + objectReference: {fileID: 0} m_RemovedComponents: [] m_RemovedGameObjects: [] m_AddedGameObjects: [] @@ -454,8 +462,8 @@ MonoBehaviour: m_faceColor: serializedVersion: 2 rgba: 4294967295 - m_fontSize: 32 - m_fontSizeBase: 32 + m_fontSize: 28 + m_fontSizeBase: 28 m_fontWeight: 400 m_enableAutoSizing: 0 m_fontSizeMin: 18 @@ -757,6 +765,14 @@ PrefabInstance: propertyPath: cameraOperator value: objectReference: {fileID: 963194229} + - target: {fileID: 7382138887082377466, guid: d247a5257c4a6774399dc902f311b653, type: 3} + propertyPath: normalTacklePowerFactor + value: 10 + objectReference: {fileID: 0} + - target: {fileID: 7382138887082377466, guid: d247a5257c4a6774399dc902f311b653, type: 3} + propertyPath: criticalTacklePowerFactor + value: 25 + objectReference: {fileID: 0} m_RemovedComponents: [] m_RemovedGameObjects: [] m_AddedGameObjects: [] diff --git a/Assets/Scripts/Announcments.cs b/Assets/Scripts/Announcments.cs index d89828d..eefdc97 100644 --- a/Assets/Scripts/Announcments.cs +++ b/Assets/Scripts/Announcments.cs @@ -9,19 +9,32 @@ public class Announcments : MonoBehaviour { [SerializeField] TextMeshProUGUI announcementText; + public Queue> announcementQueue = new Queue>(); + private bool workingOnQueue = false; private float remainingTime; void Update() { + if (!workingOnQueue && announcementQueue.Count != 0) + { + workingOnQueue = true; + Tuple announcement = announcementQueue.Dequeue(); + AnnounceText(announcement.Item1, announcement.Item2); + return; + } if (remainingTime > 0) { remainingTime -= Time.deltaTime; } else { + workingOnQueue = false; announcementText.enabled = false; remainingTime = 0; - enabled = false; + if (announcementQueue.Count == 0) + { + enabled = false; + } } } @@ -33,15 +46,23 @@ public class Announcments : MonoBehaviour enabled = true; } + public void QueueAnnounceText(string text, float time) + { + announcementQueue.Enqueue(new Tuple(text, time)); + enabled = true; + } + public void AnnounceText(string text) { announcementText.text = text; announcementText.enabled = true; + announcementQueue.Clear(); enabled = false; } public void StopAnnouncement() { + announcementQueue.Clear(); announcementText.text = String.Empty; remainingTime = 0; announcementText.enabled = false; diff --git a/Assets/Scripts/GameManager.cs b/Assets/Scripts/GameManager.cs index b69c4f6..320160a 100644 --- a/Assets/Scripts/GameManager.cs +++ b/Assets/Scripts/GameManager.cs @@ -75,7 +75,7 @@ public class GameManager : MonoBehaviour controlSchemeDetector = new ControlSchemeDetection(); controlSchemeDetector.ControlSchemeDetected += DetectPlayerControls; controlSchemeDetector.EnableDetection(); - announcements.AnnounceText("You both press a key \n on your control scheme of choice \n to start the match"); + announcements.AnnounceText("Choose your control schemes \n Each player press a button \n to start the match \n (see description for controls)"); } void StartMatch() @@ -87,7 +87,7 @@ public class GameManager : MonoBehaviour if (announcements != null) { announcements.StopAnnouncement(); - announcements.AnnounceText("Match Start", 1.6f); + announcements.QueueAnnounceText("Match Start", 1.6f); } } @@ -95,10 +95,11 @@ public class GameManager : MonoBehaviour { if (!go.CompareTag("Player") || currentState == GameState.End) return; + PlayerController pc = go.GetComponent(); currentState = GameState.End; zone.onPlayZoneExited -= CheckLosingCondition; + announcements.AnnounceText(pc.playerName + " has lost the match", 2f); Destroy(go); - announcements.AnnounceText(go.name + " has lost the match", 2f); restartMatchTime = 2.2f; enabled = true; } diff --git a/Assets/Scripts/PlayerController.cs b/Assets/Scripts/PlayerController.cs index 445b5d1..5156cf2 100644 --- a/Assets/Scripts/PlayerController.cs +++ b/Assets/Scripts/PlayerController.cs @@ -7,6 +7,7 @@ using static AffectingForcesManager; public class PlayerController : MonoBehaviour { [SerializeField] public int playerId = 1; + [SerializeField] public string playerName = "gray"; // Private variables [SerializeField] private CameraOperator cameraOperator; [SerializeField] private float thrustAcceleration = 400; @@ -24,9 +25,11 @@ public class PlayerController : MonoBehaviour [SerializeField] private float boostMagnitude = 1.5f; [SerializeField] private float outsideBoostRate = 0.5f; [SerializeField, Range(0, 1)] private float boostAntiGravityFactor = 0.2f; - [SerializeField] private float tackleStunFactor = 0.1f; - [SerializeField] private float tackleStunTime = 0.6f; - [SerializeField, Range(0, 1000)] private float tacklePowerFactor = 10f; + [SerializeField] private float stunLooseControlFactor = 0.1f; + [SerializeField] private float tackleCriticalStunTime = 0.6f; + [SerializeField] private float tackleBodyStunTime = 0.3f; + [SerializeField, Range(0, 300)] private float criticalTacklePowerFactor = 10f; + [SerializeField, Range(0, 300)] private float normalTacklePowerFactor = 10f; [SerializeField] private BoostCapacityUI boostUI; private AffectingForcesManager forceManager; public PlayerInput playerInput; @@ -39,6 +42,8 @@ public class PlayerController : MonoBehaviour // Saves the current input for steering private float currentSteerInput = 0; private bool canBoost = true; + private TackleDetection[] tackleDetectors; + private bool isCriticalTackle = false; private bool isTackled = false; private float tackledTime = 0f; // Current Zone the player occupies @@ -63,6 +68,20 @@ public class PlayerController : MonoBehaviour boostUI.SetMinBoostRatio(minBoostCapacity / maxBoostCapacity); GameManager.GM.RegisterPlayer(this); cameraOperator.AddPlayer(gameObject); + + tackleDetectors = GetComponentsInChildren(); + foreach (TackleDetection td in tackleDetectors) + { + td.TackleResponse.AddListener(StartTackleResponse); + } + } + + void OnDestroy() + { + foreach (TackleDetection td in tackleDetectors) + { + td.TackleResponse.RemoveAllListeners(); + } } // Update is called once per frame @@ -79,7 +98,7 @@ public class PlayerController : MonoBehaviour UpdateMovement(); // TODO Always full thrust when boosting? BoostStateUpdate(Time.deltaTime); - UpdateTackleResponse(); + UpdateTackleResponse(isCriticalTackle); } void UpdateMovement() @@ -93,7 +112,7 @@ public class PlayerController : MonoBehaviour currentGravity = forceManager.GetGravityForInstance(instanceID)(transform.position); body.AddForce(currentGravity, ForceMode.Acceleration); - float tackleFactor = isTackled ? tackleStunFactor : 1f; + float tackleFactor = isCriticalTackle ? stunLooseControlFactor : 1f; Vector3 acceleration = thrustAcceleration * currentThrustInput * Time.deltaTime * Vector3.up * tackleFactor; @@ -102,15 +121,18 @@ public class PlayerController : MonoBehaviour Vector3 boostedAcceleration = BoostAcceleration(acceleration, currentGravity); - if (!isTackled) + if (!isCriticalTackle) { // Add drag Vector3 dragDecceleration = DragDecceleration(currentVelocity, zone); body.AddForce(dragDecceleration, ForceMode.Acceleration); - // Add anti drift acceleration - Vector3 driftDampeningAcceleration = DriftDampeningAcceleration(currentVelocity, zone); - body.AddForce(driftDampeningAcceleration, ForceMode.Acceleration); + if (!isTackled) + { + // Add anti drift acceleration + Vector3 driftDampeningAcceleration = DriftDampeningAcceleration(currentVelocity, zone); + body.AddForce(driftDampeningAcceleration, ForceMode.Acceleration); + } if (currentVelocity.magnitude <= normalMaxVelocity || IsBoosting() || zone != Zone.NimbleZone) { @@ -216,13 +238,14 @@ public class PlayerController : MonoBehaviour if (gotTackled) { isTackled = true; - tackledTime = tackleStunTime; + tackledTime = isCriticalTackle ? tackleCriticalStunTime : tackleBodyStunTime; return; } tackledTime -= Time.deltaTime; if (tackledTime <= 0) { isTackled = false; + isCriticalTackle = false; tackledTime = 0; } } @@ -252,15 +275,20 @@ public class PlayerController : MonoBehaviour SceneManager.LoadScene(currentSceneName); } } - void OnTriggerEnter(Collider collider) + void StartTackleResponse(TackleKind tackleKind, Collider collider) { - if (collider.tag != "Spike") + float tacklePowerFactor = criticalTacklePowerFactor; + if (tackleKind == TackleKind.Critical) { - return; + isCriticalTackle = true; + } + else + { + isCriticalTackle = false; + tacklePowerFactor = normalTacklePowerFactor; } Vector3 colliderVelocity = collider.attachedRigidbody.velocity; Vector3 tackleDirection = body.transform.position - collider.transform.position; - float colliderMass = collider.attachedRigidbody.mass; body.AddForce(colliderVelocity.magnitude * tackleDirection * tacklePowerFactor, ForceMode.Acceleration); UpdateTackleResponse(true); } diff --git a/Assets/Scripts/TackleDetection.cs b/Assets/Scripts/TackleDetection.cs new file mode 100644 index 0000000..15d96b5 --- /dev/null +++ b/Assets/Scripts/TackleDetection.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEditor.AdaptivePerformance.Editor; +using UnityEngine; +using UnityEngine.Events; + +public class TackleDetection : MonoBehaviour +{ + [SerializeField] private TackleKind tackleKind; + public UnityEvent TackleResponse; + void OnTriggerEnter(Collider collider) + { + if (collider.tag != "Spike") + { + return; + } + TackleResponse.Invoke(tackleKind, collider); + } +} + +public enum TackleKind { Critical, Normal } \ No newline at end of file diff --git a/Assets/Scripts/TackleDetection.cs.meta b/Assets/Scripts/TackleDetection.cs.meta new file mode 100644 index 0000000..185d5f6 --- /dev/null +++ b/Assets/Scripts/TackleDetection.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3c7fe3de71657ad45a715b48cce00faa +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: