Files
2026-03-04 10:03:45 +08:00

193 lines
5.3 KiB
C#

using System.Collections.Generic;
namespace UnityEngine.AzureSky
{
public class AzureEffectsController : MonoBehaviour
{
public WindZone windZone;
public AudioSource lightRainAudioSource;
public AudioSource mediumRainAudioSource;
public AudioSource heavyRainAudioSource;
public AudioSource lightWindAudioSource;
public AudioSource mediumWindAudioSource;
public AudioSource heavyWindAudioSource;
public Material defaultRainMaterial;
public Material heavyRainMaterial;
public Material snowMaterial;
public Material rippleMaterial;
public ParticleSystem lightRainParticle;
public ParticleSystem mediumRainParticle;
public ParticleSystem heavyRainParticle;
public ParticleSystem snowParticle;
[SerializeField]
private Collider m_particlesTriggerCollider;
public float lightRainIntensity;
public float mediumRainIntensity;
public float heavyRainIntensity;
public float snowIntensity;
public Color rainColor = Color.white;
public Color snowColor = Color.white;
public float lightRainSoundFx;
public float mediumRainSoundFx;
public float heavyRainSoundFx;
public float lightWindSoundFx;
public float mediumWindSoundFx;
public float heavyWindSoundFx;
public float windSpeed;
public float windDirection;
private ParticleSystem.EmissionModule m_particleEmission;
private ParticleSystem.TriggerModule m_particleTrigger;
private ParticleSystem.SubEmittersModule m_particleSubEmitters;
public List<AzureThunderSettings> thunderSettingsList = new List<AzureThunderSettings>();
private void Start()
{
UpdateParticlesMaterials();
}
private void Update()
{
UpdateParticlesMaterials();
if (Application.isPlaying)
{
SoundEffectController(lightRainSoundFx, lightRainAudioSource);
SoundEffectController(mediumRainSoundFx, mediumRainAudioSource);
SoundEffectController(heavyRainSoundFx, heavyRainAudioSource);
SoundEffectController(lightWindSoundFx, lightWindAudioSource);
SoundEffectController(mediumWindSoundFx, mediumWindAudioSource);
SoundEffectController(heavyWindSoundFx, heavyWindAudioSource);
ParticleEffectController(lightRainIntensity * 4000f, lightRainParticle);
ParticleEffectController(mediumRainIntensity * 4000f, mediumRainParticle);
ParticleEffectController(heavyRainIntensity * 2000f, heavyRainParticle);
ParticleEffectController(snowIntensity * 1000f, snowParticle);
windZone.windMain = windSpeed;
windZone.transform.rotation = Quaternion.Euler(new Vector3(0f, Mathf.Lerp(-180f, 180f, windDirection) + 180f, 0f));
}
}
private void SoundEffectController(float volume, AudioSource sound)
{
sound.volume = volume;
if (volume > 0f)
{
if (!sound.isPlaying)
{
sound.Play();
}
}
else if (sound.isPlaying)
{
sound.Stop();
}
}
private void ParticleEffectController(float intensity, ParticleSystem particle)
{
m_particleEmission = particle.emission;
m_particleEmission.rateOverTimeMultiplier = intensity;
if (intensity > 0f)
{
if (!particle.isPlaying)
{
particle.Play();
}
}
else if (particle.isPlaying)
{
particle.Stop();
}
}
private void UpdateParticlesMaterials()
{
defaultRainMaterial.SetColor("_TintColor", rainColor);
heavyRainMaterial.SetColor("_TintColor", rainColor);
snowMaterial.SetColor("_TintColor", snowColor);
rippleMaterial.SetColor("_TintColor", rainColor);
}
public void InstantiateThunderEffect(int index)
{
AzureThunderEffect component = Object.Instantiate(thunderSettingsList[index].thunderPrefab, thunderSettingsList[index].position, thunderSettingsList[index].thunderPrefab.rotation).GetComponent<AzureThunderEffect>();
component.audioClip = thunderSettingsList[index].audioClip;
component.audioDelay = thunderSettingsList[index].audioDelay;
component.lightFrequency = thunderSettingsList[index].lightFrequency;
}
public void SetParticlesSubEmittersModuleState(bool value)
{
m_particleSubEmitters = lightRainParticle.subEmitters;
m_particleSubEmitters.enabled = value;
m_particleSubEmitters = mediumRainParticle.subEmitters;
m_particleSubEmitters.enabled = value;
m_particleSubEmitters = heavyRainParticle.subEmitters;
m_particleSubEmitters.enabled = value;
m_particleSubEmitters = snowParticle.subEmitters;
m_particleSubEmitters.enabled = value;
}
public void SetParticlesTriggerModuleState(bool value)
{
m_particleTrigger = lightRainParticle.trigger;
m_particleTrigger.enabled = value;
m_particleTrigger = mediumRainParticle.trigger;
m_particleTrigger.enabled = value;
m_particleTrigger = heavyRainParticle.trigger;
m_particleTrigger.enabled = value;
m_particleTrigger = snowParticle.trigger;
m_particleTrigger.enabled = value;
}
public void SetParticlesTriggerCollider(Collider collider)
{
m_particlesTriggerCollider = collider;
m_particleTrigger = lightRainParticle.trigger;
m_particleTrigger.SetCollider(0, collider);
m_particleTrigger = mediumRainParticle.trigger;
m_particleTrigger.SetCollider(0, collider);
m_particleTrigger = heavyRainParticle.trigger;
m_particleTrigger.SetCollider(0, collider);
m_particleTrigger = snowParticle.trigger;
m_particleTrigger.SetCollider(0, collider);
}
public Collider GetParticlesTriggerCollider()
{
return m_particlesTriggerCollider;
}
}
}