feat: tackle response differentiation, announcement queue

This commit is contained in:
Jakob Feldmann 2024-01-06 16:21:15 +01:00
parent b8ce591b70
commit a720ce0e68
8 changed files with 215 additions and 42 deletions

View File

@ -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

View File

@ -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

View File

@ -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: []

View File

@ -9,21 +9,34 @@ public class Announcments : MonoBehaviour
{
[SerializeField] TextMeshProUGUI announcementText;
public Queue<Tuple<string, float>> announcementQueue = new Queue<Tuple<string, float>>();
private bool workingOnQueue = false;
private float remainingTime;
void Update()
{
if (!workingOnQueue && announcementQueue.Count != 0)
{
workingOnQueue = true;
Tuple<string, float> announcement = announcementQueue.Dequeue();
AnnounceText(announcement.Item1, announcement.Item2);
return;
}
if (remainingTime > 0)
{
remainingTime -= Time.deltaTime;
}
else
{
workingOnQueue = false;
announcementText.enabled = false;
remainingTime = 0;
if (announcementQueue.Count == 0)
{
enabled = false;
}
}
}
public void AnnounceText(string text, float time)
{
@ -33,15 +46,23 @@ public class Announcments : MonoBehaviour
enabled = true;
}
public void QueueAnnounceText(string text, float time)
{
announcementQueue.Enqueue(new Tuple<string, float>(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;

View File

@ -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<PlayerController>();
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;
}

View File

@ -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<TackleDetection>();
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);
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);
}

View File

@ -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<TackleKind, Collider> TackleResponse;
void OnTriggerEnter(Collider collider)
{
if (collider.tag != "Spike")
{
return;
}
TackleResponse.Invoke(tackleKind, collider);
}
}
public enum TackleKind { Critical, Normal }

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 3c7fe3de71657ad45a715b48cce00faa
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: