Files
Deroc_Virtual_3D/Assets/FPS/Scripts/Gameplay/OverheatBehavior.cs
T
Alex38Lyon 878ea46cac update
2025-06-03 12:00:47 +02:00

115 lines
4.1 KiB
C#

using UnityEngine;
using System.Collections.Generic;
using Unity.FPS.Game;
namespace Unity.FPS.Gameplay
{
public class OverheatBehavior : MonoBehaviour
{
[System.Serializable]
public struct RendererIndexData
{
public Renderer Renderer;
public int MaterialIndex;
public RendererIndexData(Renderer renderer, int index)
{
this.Renderer = renderer;
this.MaterialIndex = index;
}
}
[Header("Visual")] [Tooltip("The VFX to scale the spawn rate based on the ammo ratio")]
public ParticleSystem SteamVfx;
[Tooltip("The emission rate for the effect when fully overheated")]
public float SteamVfxEmissionRateMax = 8f;
//Set gradient field to HDR
[GradientUsage(true)] [Tooltip("Overheat color based on ammo ratio")]
public Gradient OverheatGradient;
[Tooltip("The material for overheating color animation")]
public Material OverheatingMaterial;
[Header("Sound")] [Tooltip("Sound played when a cell are cooling")]
public AudioClip CoolingCellsSound;
[Tooltip("Curve for ammo to volume ratio")]
public AnimationCurve AmmoToVolumeRatioCurve;
WeaponController m_Weapon;
AudioSource m_AudioSource;
List<RendererIndexData> m_OverheatingRenderersData;
MaterialPropertyBlock m_OverheatMaterialPropertyBlock;
float m_LastAmmoRatio;
ParticleSystem.EmissionModule m_SteamVfxEmissionModule;
void Awake()
{
var emissionModule = SteamVfx.emission;
emissionModule.rateOverTimeMultiplier = 0f;
m_OverheatingRenderersData = new List<RendererIndexData>();
foreach (var renderer in GetComponentsInChildren<Renderer>(true))
{
for (int i = 0; i < renderer.sharedMaterials.Length; i++)
{
if (renderer.sharedMaterials[i] == OverheatingMaterial)
m_OverheatingRenderersData.Add(new RendererIndexData(renderer, i));
}
}
m_OverheatMaterialPropertyBlock = new MaterialPropertyBlock();
m_SteamVfxEmissionModule = SteamVfx.emission;
m_Weapon = GetComponent<WeaponController>();
DebugUtility.HandleErrorIfNullGetComponent<WeaponController, OverheatBehavior>(m_Weapon, this, gameObject);
m_AudioSource = gameObject.AddComponent<AudioSource>();
m_AudioSource.clip = CoolingCellsSound;
m_AudioSource.outputAudioMixerGroup = AudioUtility.GetAudioGroup(AudioUtility.AudioGroups.WeaponOverheat);
}
void Update()
{
// visual smoke shooting out of the gun
float currentAmmoRatio = m_Weapon.CurrentAmmoRatio;
if (currentAmmoRatio != m_LastAmmoRatio)
{
m_OverheatMaterialPropertyBlock.SetColor("_EmissionColor",
OverheatGradient.Evaluate(1f - currentAmmoRatio));
foreach (var data in m_OverheatingRenderersData)
{
data.Renderer.SetPropertyBlock(m_OverheatMaterialPropertyBlock, data.MaterialIndex);
}
m_SteamVfxEmissionModule.rateOverTimeMultiplier = SteamVfxEmissionRateMax * (1f - currentAmmoRatio);
}
// cooling sound
if (CoolingCellsSound)
{
if (!m_AudioSource.isPlaying
&& currentAmmoRatio != 1
&& m_Weapon.IsWeaponActive
&& m_Weapon.IsCooling)
{
m_AudioSource.Play();
}
else if (m_AudioSource.isPlaying
&& (currentAmmoRatio == 1 || !m_Weapon.IsWeaponActive || !m_Weapon.IsCooling))
{
m_AudioSource.Stop();
return;
}
m_AudioSource.volume = AmmoToVolumeRatioCurve.Evaluate(1 - currentAmmoRatio);
}
m_LastAmmoRatio = currentAmmoRatio;
}
}
}