plantilla base para movimiento básico
This commit is contained in:
Robii Aragon
2026-02-05 05:07:55 -08:00
parent 195b696771
commit 779f2c8b20
14443 changed files with 23840465 additions and 452 deletions

View File

@@ -0,0 +1,587 @@
using System.Collections;
using System.Collections.Generic;
using GameKitController.Audio;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Events;
public class oxygenSystem : MonoBehaviour {
[Header ("Main Settings")]
[Space]
public bool oxygenSystemEnabled = true;
public float oxygenUseRate;
public float closeToEmptyOxygenAmount;
public float oxygenAmount;
public float refillOxygenRate = 18;
public float refillOxygenDelayAfterUse;
public bool oxygenObjectAlwaysActive;
public float timeToDisableOxygenObject;
public bool waitToOxygenFilledToUseAgain;
public float eventOnOxygenDepletedRate;
public bool useOxygenUIOnScreenOnAnyView;
[Space]
[Header ("UI Settings")]
[Space]
public Color regularOxygenColor;
public Color closeToEmptyOxygenColor;
public Color regularOxygenTextColor;
public Color closeToEmptyOxygenTextColor;
[Space]
[Header ("Oxygen States Settings")]
[Space]
public List<oxygenStateInfo> oxygenStateInfoList = new List<oxygenStateInfo> ();
public string oxygenStateNameByDefault = "Oxygen On Space";
[Space]
[Header ("Debug")]
[Space]
public bool oxygenEmpty;
public bool refillingOxygen;
public bool usingOxygen;
public bool oxygenRefilled = true;
public bool firstPersonActive;
public oxygenStateInfo currentOxygenStateInfo;
[Space]
[Header ("Event Settings")]
[Space]
public UnityEvent eventOnOxygenRefilled;
public UnityEvent eventOnOxygenEmpty;
public UnityEvent eventOnOxygenDepleted;
public UnityEvent eventOnOxygenActive;
public UnityEvent eventOnOxygenDeactivate;
public UnityEvent eventOnOxygenEmptyDeath;
[Space]
[Header ("Components")]
[Space]
public Image oxygenSlider;
public Text oxygenAmountText;
public GameObject oxygenObject;
public GameObject firstPersonOxygenPanel;
public Text firstPersonOxygenAmountText;
public health mainHealth;
float originalOxygenAmount;
float lastTimeOxygenRefilled;
Coroutine refillCoroutine;
bool oxygenSliderHidden;
float lastTimeOxygenDepleted;
float auxOxygenAmount;
float lastTimeOxygenSoundPlayed;
float curretnOxygenSoundRate;
float lastTimeOxygenStateDepleted;
private void InitializeAudioElements ()
{
foreach (var oxygenStateInfo in oxygenStateInfoList) {
if (oxygenStateInfo.oxygenSoundSource != null) {
oxygenStateInfo.oxygenSoundAudioElement.audioSource = oxygenStateInfo.oxygenSoundSource;
}
if (oxygenStateInfo.clipToUseOnOxygenSound != null) {
oxygenStateInfo.oxygenSoundAudioElement.clip = oxygenStateInfo.clipToUseOnOxygenSound;
}
}
}
void Start ()
{
InitializeAudioElements ();
originalOxygenAmount = oxygenAmount;
auxOxygenAmount = oxygenAmount;
if (oxygenObject.activeSelf) {
oxygenObject.SetActive (false);
}
setOxygenStateByName (oxygenStateNameByDefault);
}
void FixedUpdate ()
{
if (!oxygenSystemEnabled) {
return;
}
if (!oxygenObjectAlwaysActive) {
if (!refillingOxygen) {
if (oxygenRefilled && !oxygenSliderHidden) {
if (Time.time > lastTimeOxygenRefilled + timeToDisableOxygenObject) {
if (!oxygenSliderHidden) {
if (oxygenObject.activeSelf) {
oxygenObject.SetActive (false);
}
oxygenSliderHidden = true;
}
}
}
}
}
if (!refillingOxygen && usingOxygen) {
if (mainHealth.isDead ()) {
disableOxygenOnDeath ();
}
if (useOxygenUIOnScreenOnAnyView) {
if (!firstPersonOxygenPanel.activeSelf) {
firstPersonOxygenPanel.SetActive (true);
}
} else {
if (firstPersonActive) {
if (oxygenObject.activeSelf) {
oxygenObject.SetActive (false);
}
} else {
if (!oxygenObject.activeSelf) {
oxygenObject.SetActive (true);
}
}
}
oxygenSliderHidden = false;
oxygenAmount -= oxygenUseRate * Time.fixedDeltaTime;
oxygenAmount = Mathf.Clamp (oxygenAmount, 0, originalOxygenAmount);
if (oxygenAmount <= closeToEmptyOxygenAmount) {
oxygenSlider.color = closeToEmptyOxygenColor;
oxygenAmountText.color = closeToEmptyOxygenTextColor;
}
oxygenSlider.fillAmount = oxygenAmount / originalOxygenAmount;
if (oxygenAmountText != null) {
string oxygenAmountString = oxygenAmount.ToString ("##.0");
if (oxygenAmount == 0) {
oxygenAmountString = "0";
}
oxygenAmountText.text = oxygenAmountString;
if (useOxygenUIOnScreenOnAnyView) {
if (!firstPersonOxygenPanel.activeSelf) {
firstPersonOxygenPanel.SetActive (true);
}
firstPersonOxygenAmountText.text = oxygenAmountString;
} else {
if (firstPersonActive) {
if (!firstPersonOxygenPanel.activeSelf) {
firstPersonOxygenPanel.SetActive (true);
}
firstPersonOxygenAmountText.text = oxygenAmountString;
} else {
if (firstPersonOxygenPanel.activeSelf) {
firstPersonOxygenPanel.SetActive (false);
}
}
}
}
auxOxygenAmount = oxygenAmount;
if (oxygenAmount <= 0) {
if (!oxygenEmpty) {
eventOnOxygenEmpty.Invoke ();
currentOxygenStateInfo.eventOnOxygenEmpty.Invoke ();
}
oxygenEmpty = true;
if (Time.time > eventOnOxygenDepletedRate + lastTimeOxygenDepleted) {
eventOnOxygenDepleted.Invoke ();
lastTimeOxygenDepleted = Time.time;
}
if (currentOxygenStateInfo.killPlayerOnOxygenEmpty) {
if (currentOxygenStateInfo.useEventBeforeKillingPlayer) {
currentOxygenStateInfo.eventBeforeKillingPlayer.Invoke ();
}
mainHealth.killCharacter ();
} else {
if (Time.time > currentOxygenStateInfo.damagePlayerOnOxygenEmptyRate + lastTimeOxygenStateDepleted) {
mainHealth.takeConstantDamageWithoutShield (currentOxygenStateInfo.damagePlayerOnOxygenEmptyAmount);
lastTimeOxygenStateDepleted = Time.time;
}
}
}
if (currentOxygenStateInfo.useOxygenSound) {
if (oxygenAmount > currentOxygenStateInfo.oxygenAmountToIncreaseSoundRate) {
curretnOxygenSoundRate = currentOxygenStateInfo.oxygenSoundRate;
} else {
curretnOxygenSoundRate = currentOxygenStateInfo.oxygenSoundIncreasedRate;
}
if (Time.time > lastTimeOxygenSoundPlayed + curretnOxygenSoundRate) {
lastTimeOxygenSoundPlayed = Time.time;
if (currentOxygenStateInfo.oxygenSoundAudioElement != null) {
AudioPlayer.PlayOneShot (currentOxygenStateInfo.oxygenSoundAudioElement, gameObject);
}
}
}
}
}
void setOxygenStateByName (string oxygenStateName)
{
for (int i = 0; i < oxygenStateInfoList.Count; i++) {
if (oxygenStateInfoList[i].stateEnabled && oxygenStateInfoList[i].Name.Equals (oxygenStateName)) {
currentOxygenStateInfo = oxygenStateInfoList[i];
}
}
}
public void activateOxygenState (string oxygenStateName)
{
setOxygenStateByName (oxygenStateName);
activeOxygenState ();
}
public void disableOxygenState (string oxygenStateName)
{
setOxygenStateByName (oxygenStateName);
disableOxygenState ();
}
public void activeOxygenState ()
{
if (!oxygenSystemEnabled) {
return;
}
if (usingOxygen) {
return;
}
if (oxygenEmpty && ( waitToOxygenFilledToUseAgain || oxygenAmount <= 0 )) {
return;
}
stopRefillCoroutine ();
refillingOxygen = false;
oxygenRefilled = false;
usingOxygen = true;
eventOnOxygenActive.Invoke ();
currentOxygenStateInfo.eventOnOxygenActive.Invoke ();
}
public void disableOxygenState ()
{
if (!oxygenSystemEnabled) {
return;
}
if (!usingOxygen) {
return;
}
lastTimeOxygenDepleted = 0;
lastTimeOxygenStateDepleted = 0;
if (usingOxygen) {
refillOxygen (refillOxygenDelayAfterUse);
}
usingOxygen = false;
eventOnOxygenDeactivate.Invoke ();
if (firstPersonOxygenPanel.activeSelf) {
firstPersonOxygenPanel.SetActive (false);
}
currentOxygenStateInfo.eventOnOxygenDeactivate.Invoke ();
}
public void refillOxygen (float refillDelay)
{
stopRefillCoroutine ();
refillCoroutine = StartCoroutine (refillOxygenCoroutine (refillDelay));
}
public void stopRefillCoroutine ()
{
if (refillCoroutine != null) {
StopCoroutine (refillCoroutine);
}
}
IEnumerator refillOxygenCoroutine (float refillDelay)
{
refillingOxygen = true;
yield return new WaitForSeconds (refillDelay);
if (!waitToOxygenFilledToUseAgain) {
eventOnOxygenRefilled.Invoke ();
currentOxygenStateInfo.eventOnOxygenRefilled.Invoke ();
}
while (oxygenAmount < originalOxygenAmount) {
oxygenAmount += Time.deltaTime * refillOxygenRate;
updateOxygenState ();
yield return null;
}
if (waitToOxygenFilledToUseAgain) {
eventOnOxygenRefilled.Invoke ();
currentOxygenStateInfo.eventOnOxygenRefilled.Invoke ();
}
refillingOxygen = false;
lastTimeOxygenRefilled = Time.time;
oxygenRefilled = true;
oxygenEmpty = false;
}
public void refillOxygenDirectly ()
{
if (oxygenEmpty || usingOxygen) {
oxygenAmount = originalOxygenAmount;
updateOxygenState ();
lastTimeOxygenRefilled = Time.time;
oxygenRefilled = true;
oxygenEmpty = false;
}
}
public void increaseTotalOxygenAmount (float extraValue)
{
oxygenAmount = originalOxygenAmount + extraValue;
originalOxygenAmount = oxygenAmount;
auxOxygenAmount = oxygenAmount;
}
public void initializeOxygenAmount (float newValue)
{
oxygenAmount = newValue;
}
public void initializeOxygenUseRate (float newValue)
{
oxygenUseRate = newValue;
}
public void increaseOxygenUseRate (float newValue)
{
oxygenUseRate += newValue;
}
public void updateOxygenAmountWithoutUpdatingStatManager (int statId, float amount)
{
oxygenAmount = amount;
originalOxygenAmount = oxygenAmount;
auxOxygenAmount = oxygenAmount;
}
public void updateOxygenUseRateAmountWithoutUpdatingStatManager (int statId, float amount)
{
oxygenUseRate = amount;
}
public void getOxygen (float amount)
{
if (!waitToOxygenFilledToUseAgain) {
eventOnOxygenRefilled.Invoke ();
currentOxygenStateInfo.eventOnOxygenRefilled.Invoke ();
}
oxygenAmount += amount;
updateOxygenState ();
if (waitToOxygenFilledToUseAgain) {
eventOnOxygenRefilled.Invoke ();
currentOxygenStateInfo.eventOnOxygenRefilled.Invoke ();
}
oxygenEmpty = false;
}
void updateOxygenState ()
{
oxygenSlider.fillAmount = oxygenAmount / originalOxygenAmount;
if (oxygenAmountText != null) {
oxygenAmountText.text = Mathf.RoundToInt (oxygenAmount).ToString ();
}
if (oxygenAmount > closeToEmptyOxygenAmount) {
oxygenSlider.color = regularOxygenColor;
oxygenAmountText.color = regularOxygenTextColor;
}
if (oxygenAmount >= originalOxygenAmount) {
oxygenAmount = originalOxygenAmount;
}
auxOxygenAmount = oxygenAmount;
}
public float getOxygenAmountToLimit ()
{
return originalOxygenAmount - auxOxygenAmount;
}
public void addAuxOxygenAmount (float amount)
{
auxOxygenAmount += amount;
}
public void disableOxygenOnDeath ()
{
lastTimeOxygenDepleted = 0;
lastTimeOxygenStateDepleted = 0;
usingOxygen = false;
eventOnOxygenDeactivate.Invoke ();
currentOxygenStateInfo.eventOnOxygenDeactivate.Invoke ();
eventOnOxygenEmptyDeath.Invoke ();
}
public void setFirstPersonActiveState (bool state)
{
firstPersonActive = state;
}
public void setOxygenSystemEnabledState (bool state)
{
oxygenSystemEnabled = state;
}
public void setOxygenSystemEnabledStateFromEditor (bool state)
{
setOxygenSystemEnabledState (state);
updateComponent ();
}
void updateComponent ()
{
GKC_Utils.updateComponent (this);
GKC_Utils.updateDirtyScene ("Update Oxygen System", gameObject);
}
[System.Serializable]
public class oxygenStateInfo {
[Header ("Main Settings")]
[Space]
public string Name;
public bool stateEnabled = true;
public float damagePlayerOnOxygenEmptyRate;
public float damagePlayerOnOxygenEmptyAmount;
public bool killPlayerOnOxygenEmpty;
[Space]
[Header ("Events Settings")]
[Space]
public UnityEvent eventOnOxygenActive;
public UnityEvent eventOnOxygenDeactivate;
[Space]
public UnityEvent eventOnOxygenEmpty;
public UnityEvent eventOnOxygenRefilled;
[Space]
public bool useEventBeforeKillingPlayer;
public UnityEvent eventBeforeKillingPlayer;
[Space]
[Header ("Sounds Settings")]
[Space]
public bool useOxygenSound = true;
public float oxygenSoundRate = 2;
public float oxygenAmountToIncreaseSoundRate = 15;
public float oxygenSoundIncreasedRate = 1;
public AudioSource oxygenSoundSource;
public AudioClip clipToUseOnOxygenSound;
public AudioElement oxygenSoundAudioElement;
}
}