- Added an alternate spawn marker, since it was needed for testing anyway. - Round 1 podium name placard now has baked shading. - Fixed umbrella model's blend shape normals. - Removed a lot of unnecessary materials and textures. - KNOWN ISSUE: Winner camera in round 2 no longer follows winner. Again.
141 lines
3.6 KiB
C#
141 lines
3.6 KiB
C#
|
|
using UdonSharp;
|
|
using UnityEngine;
|
|
using VRC.SDKBase;
|
|
using VRC.Udon.Common;
|
|
|
|
|
|
public enum LightningRoundEffect
|
|
{
|
|
Thunder,
|
|
LightningStrike,
|
|
ThunderAndRain,
|
|
|
|
MAX_EFFECTS
|
|
}
|
|
|
|
|
|
[UdonBehaviourSyncMode(BehaviourSyncMode.Manual)]
|
|
public class LightningRoundEffectsController : UdonSharpBehaviour
|
|
{
|
|
[SerializeField] private AudioManager _AudioManager;
|
|
[SerializeField] private Animator _Animator;
|
|
[Space]
|
|
[SerializeField] private GameObject _LightningBolt;
|
|
[SerializeField] private ParticleSystem _LightningStrikeExplosion;
|
|
[SerializeField] private LightningStrikeStation _LightningStrikeStation;
|
|
[SerializeField] private ParticleSystem _PersonalRaincloud;
|
|
[SerializeField] private Umbrella _Umbrella;
|
|
|
|
[UdonSynced] private LightningRoundEffect _Effect = LightningRoundEffect.MAX_EFFECTS;
|
|
private LightningRoundEffect _Effect_Cached = LightningRoundEffect.MAX_EFFECTS;
|
|
|
|
|
|
public override void OnOwnershipTransferred(VRCPlayerApi Player)
|
|
{
|
|
Networking.SetOwner(Player, _LightningBolt.gameObject);
|
|
Networking.SetOwner(Player, _LightningStrikeStation.gameObject);
|
|
Networking.SetOwner(Player, _PersonalRaincloud.gameObject);
|
|
Networking.SetOwner(Player, _Umbrella.gameObject);
|
|
|
|
base.OnOwnershipTransferred(Player);
|
|
}
|
|
|
|
public override void OnDeserialization(DeserializationResult Result)
|
|
{
|
|
_PlayLightningRoundAnimation_Synced();
|
|
|
|
base.OnDeserialization(Result);
|
|
}
|
|
|
|
|
|
public void Initialise()
|
|
{
|
|
_Effect = LightningRoundEffect.MAX_EFFECTS;
|
|
_PlayLightningRoundAnimation_Synced();
|
|
RequestSerialization();
|
|
}
|
|
|
|
public void PlayLightningRoundAnimation()
|
|
{
|
|
_Effect = LightningRoundEffect.LightningStrike;//(LightningRoundEffect)Random.Range(0, (int)LightningRoundEffect.MAX_EFFECTS);
|
|
_PlayLightningRoundAnimation_Synced();
|
|
RequestSerialization();
|
|
}
|
|
private void _PlayLightningRoundAnimation_Synced()
|
|
{
|
|
if (_Effect != _Effect_Cached)
|
|
{
|
|
_Effect_Cached = _Effect;
|
|
|
|
switch (_Effect)
|
|
{
|
|
case LightningRoundEffect.Thunder:
|
|
break;
|
|
case LightningRoundEffect.LightningStrike:
|
|
_ActivateLightningStrike();
|
|
break;
|
|
case LightningRoundEffect.ThunderAndRain:
|
|
_ActivateRainAndUmbrella();
|
|
break;
|
|
default: // Deactivate everything and leave
|
|
_Animator.SetBool("Lightning", false);
|
|
_LightningBolt.SetActive(false);
|
|
_DeactivateRainAndUmbrella();
|
|
_DeactivateLightningStrike();
|
|
return;
|
|
}
|
|
|
|
_AudioManager.PlayMusic(MusicEventType.LightningRound);
|
|
_Animator.SetBool("Lightning", true);
|
|
|
|
SendCustomEventDelayedSeconds(nameof(ResetLightningRoundAnimation), 10.0f);
|
|
}
|
|
}
|
|
public void ResetLightningRoundAnimation()
|
|
{
|
|
_LightningBolt.SetActive(false);
|
|
_Animator.SetBool("Lightning", false);
|
|
}
|
|
|
|
|
|
private void _ActivateLightningStrike()
|
|
{
|
|
_LightningBolt.SetActive(true);
|
|
_LightningStrikeStation.gameObject.SetActive(true);
|
|
|
|
VRCPlayerApi ActiveHost = Networking.GetOwner(gameObject);
|
|
Vector3 Position = ActiveHost.GetPosition();
|
|
Quaternion Rotation = ActiveHost.GetRotation();
|
|
|
|
_LightningStrikeStation.transform.SetPositionAndRotation(Position, Rotation);
|
|
_LightningBolt.transform.SetPositionAndRotation(Position, Rotation);
|
|
|
|
_LightningStrikeExplosion.Play();
|
|
|
|
if (Networking.IsOwner(gameObject))
|
|
{
|
|
_LightningStrikeStation.EnterStation();
|
|
}
|
|
}
|
|
private void _DeactivateLightningStrike()
|
|
{
|
|
_LightningBolt.SetActive(false);
|
|
_LightningStrikeStation.gameObject.SetActive(false);
|
|
_LightningStrikeExplosion.Stop();
|
|
}
|
|
|
|
|
|
private void _ActivateRainAndUmbrella()
|
|
{
|
|
_Umbrella.gameObject.SetActive(true);
|
|
_Umbrella.Respawn();
|
|
_PersonalRaincloud.Play();
|
|
}
|
|
private void _DeactivateRainAndUmbrella()
|
|
{
|
|
_Umbrella.gameObject.SetActive(false);
|
|
_PersonalRaincloud.Stop();
|
|
}
|
|
}
|