Space-Smash-Out/Assets/Scripts/GravityChanger.cs

154 lines
4.0 KiB
C#

using System.Collections.Generic;
using System.Reflection;
using log4net;
using UnityEngine;
using static GravityFunctionality.GravityHelpers;
namespace GravityFunctionality
{
[ExecuteInEditMode]
public class GravityChanger : MonoBehaviour
{
private static ILog Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private static Transform _nimbleZoneTransform;
public GameObject RenderedZoneObject;
public ParticleSystem GravityEffect;
[SerializeField]
private List<GravityColorEntry> GravityColors = new();
private Dictionary<Gravity, Color> _gravityColors =
new Dictionary<Gravity, Color>
{
{Gravity.DownGravity, Color.green },
{Gravity.UpGravity, Color.magenta },
{Gravity.NoGravity, Color.red },
{Gravity.InwardsGravity, Color.blue },
{Gravity.OutwardsGravity, Color.yellow },
};
[SerializeField]
private Gravity _gravity = Gravity.NoGravity;
private AffectingForcesManager _forcesManager;
private MeshRenderer meshRenderer;
private Material material;
void Awake()
{
if (_forcesManager == null)
{
_forcesManager = GameObject.FindGameObjectWithTag("ForceManager").
GetComponent<AffectingForcesManager>();
}
foreach (GravityColorEntry entry in GravityColors)
{
_gravityColors[entry.gravity] = entry.color;
}
meshRenderer = RenderedZoneObject.GetComponent<MeshRenderer>();
_nimbleZoneTransform = gameObject.transform;
ApplyZoneColor(meshRenderer);
#if UNITY_EDITOR
if (!Application.isPlaying) return;
#endif
material = meshRenderer.material;
}
void Start()
{
SetGravityEffect();
GravityEffect.Play();
}
private void SetGravityEffect()
{
var velocityLifetime = GravityEffect.velocityOverLifetime;
var main = GravityEffect.main;
var emission = GravityEffect.emission;
switch (_gravity)
{
default:
case Gravity.DownGravity:
velocityLifetime.y = -1f;
main.startLifetime = 1.5f;
main.startSpeed = 0f;
velocityLifetime.speedModifier = 5f;
velocityLifetime.orbitalX = 0f;
velocityLifetime.orbitalY = 0f;
velocityLifetime.orbitalZ = 0f;
break;
case Gravity.UpGravity:
velocityLifetime.y = 1f;
main.startLifetime = 1.5f;
main.startSpeed = 0f;
velocityLifetime.speedModifier = 5f;
velocityLifetime.orbitalX = 0f;
velocityLifetime.orbitalY = 0f;
velocityLifetime.orbitalZ = 0f;
break;
case Gravity.OutwardsGravity:
velocityLifetime.y = 0;
main.startLifetime = 1.5f;
main.startSpeed = 1f;
velocityLifetime.speedModifier = 2f;
velocityLifetime.orbitalX = 0f;
velocityLifetime.orbitalY = 0f;
velocityLifetime.orbitalZ = 0f;
break;
case Gravity.InwardsGravity:
velocityLifetime.y = 0;
main.startLifetime = 1.5f;
main.startSpeed = -1f;
velocityLifetime.speedModifier = 1.5f;
velocityLifetime.orbitalX = 0.5f;
velocityLifetime.orbitalY = 0.5f;
velocityLifetime.orbitalZ = 0.5f;
break;
case Gravity.NoGravity:
main.startSpeed = 0f;
velocityLifetime.y = 0;
velocityLifetime.orbitalX = 0.2f;
velocityLifetime.orbitalY = 0.2f;
velocityLifetime.orbitalZ = 0.2f;
main.startLifetime = 8f;
emission.rateOverTime = 5;
velocityLifetime.speedModifier = 1f;
break;
}
}
private void OnTriggerEnter(Collider collider)
{
int instanceID = collider.gameObject.GetInstanceID();
if (collider.tag == "Ship")
{
var func = GetGravityFunction(_gravity);
_forcesManager.SetGravityForInstance(instanceID, func, transform);
}
}
private void Update()
{
#if UNITY_EDITOR
if (!Application.isPlaying) return;
#endif
material.SetFloat("_ShaderTime", Time.timeSinceLevelLoad);
}
private void ApplyZoneColor(MeshRenderer renderer)
{
Color color = _gravityColors[_gravity];
MaterialPropertyBlock materialPropertyBlock = new();
materialPropertyBlock.SetColor("_BaseColor", color);
renderer.SetPropertyBlock(materialPropertyBlock);
}
}
}