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 GravityColors = new(); private Dictionary _gravityColors = new Dictionary { {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(); } foreach (GravityColorEntry entry in GravityColors) { _gravityColors[entry.gravity] = entry.color; } meshRenderer = RenderedZoneObject.GetComponent(); _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); } } }