153 lines
3.9 KiB
C#
153 lines
3.9 KiB
C#
using System.Collections.Generic;
|
|
using System.Reflection;
|
|
using log4net;
|
|
using UnityEngine;
|
|
using static GravityFunctionality.GravityHelpers;
|
|
|
|
namespace GravityFunctionality
|
|
{
|
|
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);
|
|
}
|
|
|
|
|
|
}
|
|
|
|
} |