Files
FueraDeEscala/Assets/Game Kit Controller/Scripts/Player/Extra Movements/swimTriggerSystem.cs
Robii Aragon fd87a6ffd5 add ckg
plantilla base para movimiento básico
2026-02-05 05:07:55 -08:00

304 lines
7.6 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class swimTriggerSystem : MonoBehaviour
{
[Header ("Main Settings")]
[Space]
public string tagToCheck;
public bool swimZoneActive = true;
public bool updateSurfaceTransformDynamically;
[Space]
[Header ("Vehicle Settings")]
[Space]
public bool checkVehiclesOnEnteringWater;
public bool disableVehiclesInteractionOnEnterWater;
public bool ejectPassengersOnVehicleOnEnterWater;
public bool explodeVehiclesAfterXTime;
public float timeToExplodeVehiclesAfterXTime;
public bool setVehicleGravityForce;
public float newVehicleGravityForce;
public bool reduceVehicleSpeedOnEnterWater;
public float reducedVehicleSpeedMultiplier;
public LayerMask vehicleLayerToCheck;
[Space]
[Space]
public bool checkVehiclesOnExitingWater;
[Space]
[Header ("Remote Events Settings")]
[Space]
public bool useRemoteEvents;
public bool useRemoteEventOnSwimStart;
public List<string> remoteEventNameListOnSwimStart = new List<string> ();
public bool useRemoteEventOnSwimEnd;
public List<string> remoteEventNameListOnSwimEnd = new List<string> ();
[Space]
[Header ("Debug")]
[Space]
public List<GameObject> vehicleDetectedList = new List<GameObject> ();
public bool showGizmo;
public Color gizmoColor = Color.red;
public float gizmoRadius = 0.1f;
[Space]
[Header ("Components")]
[Space]
public Transform swimZoneTransform;
public waterSurfaceSystem mainWaterSurfaceSystem;
public Collider mainTrigger;
GameObject currentPlayer;
void OnTriggerEnter (Collider col)
{
checkTriggerInfo (col, true);
}
void OnTriggerExit (Collider col)
{
checkTriggerInfo (col, false);
}
public void checkTriggerInfo (Collider col, bool isEnter)
{
if (!swimZoneActive) {
return;
}
if (!col.gameObject.CompareTag (tagToCheck)) {
if (isEnter) {
if (checkVehiclesOnEnteringWater) {
GameObject objectToCheck = col.gameObject;
if ((1 << objectToCheck.layer & vehicleLayerToCheck.value) == 1 << objectToCheck.layer) {
GameObject vehicleGameObject = applyDamage.getVehicle (objectToCheck);
if (vehicleGameObject != null) {
regularVehicleOnWater currentRegularVehicleOnWater = vehicleGameObject.GetComponent<regularVehicleOnWater> ();
if (currentRegularVehicleOnWater != null) {
Collider mainVehicleCollider = currentRegularVehicleOnWater.getMainCollider ();
if (mainVehicleCollider != col) {
return;
}
}
if (vehicleDetectedList.Contains (vehicleGameObject)) {
return;
} else {
vehicleDetectedList.Add (vehicleGameObject);
}
}
if (disableVehiclesInteractionOnEnterWater) {
applyDamage.setVehicleInteractionTriggerState (objectToCheck, false);
}
if (ejectPassengersOnVehicleOnEnterWater) {
applyDamage.ejectAllPassengersFromVehicle (objectToCheck);
}
if (explodeVehiclesAfterXTime) {
applyDamage.activateSelfDestructionOnVehicleExternally (objectToCheck, timeToExplodeVehiclesAfterXTime);
}
if (setVehicleGravityForce) {
applyDamage.setNewVehicleGravityForce (objectToCheck, newVehicleGravityForce);
}
if (reduceVehicleSpeedOnEnterWater) {
applyDamage.setReducedVehicleSpeed (objectToCheck, reducedVehicleSpeedMultiplier);
}
checkRemoteEvents (true, objectToCheck);
}
}
} else {
if (checkVehiclesOnExitingWater) {
GameObject objectToCheck = col.gameObject;
if ((1 << objectToCheck.layer & vehicleLayerToCheck.value) == 1 << objectToCheck.layer) {
GameObject vehicleGameObject = applyDamage.getVehicle (objectToCheck);
if (vehicleGameObject != null) {
regularVehicleOnWater currentRegularVehicleOnWater = vehicleGameObject.GetComponent<regularVehicleOnWater> ();
if (currentRegularVehicleOnWater != null) {
Collider mainVehicleCollider = currentRegularVehicleOnWater.getMainCollider ();
if (mainVehicleCollider != col) {
return;
}
}
if (!vehicleDetectedList.Contains (vehicleGameObject)) {
return;
} else {
vehicleDetectedList.Remove (vehicleGameObject);
}
}
if (setVehicleGravityForce) {
applyDamage.setOriginalGravityForce (objectToCheck);
}
checkRemoteEvents (false, objectToCheck);
}
}
}
return;
}
if (isEnter) {
currentPlayer = col.gameObject;
playerComponentsManager currentPlayerComponentsManager = currentPlayer.GetComponent<playerComponentsManager> ();
if (currentPlayerComponentsManager != null) {
externalControllerBehavior swimExternalControllerBehavior = currentPlayerComponentsManager.getSwimExternalControllerBehavior ();
if (swimExternalControllerBehavior != null) {
swimSystem currentSwimSystem = swimExternalControllerBehavior.GetComponent<swimSystem> ();
if (mainTrigger == null) {
mainTrigger = GetComponent<Collider> ();
}
currentSwimSystem.addSwimTrigger (mainTrigger);
currentSwimSystem.setSwimZoneTransform (swimZoneTransform);
currentSwimSystem.setSwimTrigger (mainTrigger);
if (updateSurfaceTransformDynamically) {
currentSwimSystem.setCurrentWaterSurfaceSystem (mainWaterSurfaceSystem);
}
currentSwimSystem.setSwimSystemActivestate (true);
checkRemoteEvents (true, currentPlayer);
}
}
} else {
currentPlayer = col.gameObject;
playerComponentsManager currentPlayerComponentsManager = currentPlayer.GetComponent<playerComponentsManager> ();
if (currentPlayerComponentsManager != null) {
externalControllerBehavior swimExternalControllerBehavior = currentPlayerComponentsManager.getSwimExternalControllerBehavior ();
if (swimExternalControllerBehavior != null) {
swimSystem currentSwimSystem = swimExternalControllerBehavior.GetComponent<swimSystem> ();
if (mainTrigger == null) {
mainTrigger = GetComponent<Collider> ();
}
currentSwimSystem.removeSwimTrigger (mainTrigger);
if (currentSwimSystem.isSwimTriggerListEmpty ()) {
currentSwimSystem.setSwimSystemActivestate (false);
currentSwimSystem.setSwimZoneTransform (null);
currentSwimSystem.setSwimTrigger (null);
currentSwimSystem.setCurrentWaterSurfaceSystem (null);
}
checkRemoteEvents (false, currentPlayer);
}
}
}
}
void checkRemoteEvents (bool state, GameObject objectToCheck)
{
if (!useRemoteEvents) {
return;
}
if (state) {
if (useRemoteEventOnSwimStart) {
remoteEventSystem currentRemoteEventSystem = objectToCheck.GetComponent<remoteEventSystem> ();
if (currentRemoteEventSystem != null) {
for (int i = 0; i < remoteEventNameListOnSwimStart.Count; i++) {
currentRemoteEventSystem.callRemoteEvent (remoteEventNameListOnSwimStart [i]);
}
}
}
} else {
if (useRemoteEventOnSwimEnd) {
remoteEventSystem currentRemoteEventSystem = objectToCheck.GetComponent<remoteEventSystem> ();
if (currentRemoteEventSystem != null) {
for (int i = 0; i < remoteEventNameListOnSwimEnd.Count; i++) {
currentRemoteEventSystem.callRemoteEvent (remoteEventNameListOnSwimEnd [i]);
}
}
}
}
}
//Draw gizmos
void OnDrawGizmos ()
{
if (!showGizmo) {
return;
}
if (GKC_Utils.isCurrentSelectionActiveGameObject (gameObject)) {
DrawGizmos ();
}
}
void OnDrawGizmosSelected ()
{
DrawGizmos ();
}
void DrawGizmos ()
{
if (showGizmo) {
if (swimZoneTransform != null) {
Gizmos.color = gizmoColor;
Vector3 position = swimZoneTransform.position;
Gizmos.DrawSphere (position, gizmoRadius);
Debug.DrawRay (position, transform.position, Color.white);
}
}
}
}