using System; using UnityEngine; using static AffectingForcesManager; public class NimbleZoneDetection : MonoBehaviour { [SerializeField] private static float gravityFactor = 30f; [SerializeField] private Gravities outsideGravityFunction = Gravities.NoGravity; [SerializeField] private Zone zone = Zone.NimbleZone; public AffectingForcesManager forcesManager; public enum Gravities { DownGravity, NoGravity, InwardsGravity, OutwardsGravity } private Func[] gravityFunctions = { DownGravity, NoGravity, InwardsGravity, OutwardsGravity }; private static Func NoGravity = new Func(position => new Vector3()); private static Func DownGravity = new Func(position => Vector3.down * gravityFactor); private static Func InwardsGravity = new Func (position => new Vector3(position.x, position.y, 0).normalized * -gravityFactor); private static Func OutwardsGravity = new Func (position => new Vector3(position.x, position.y, 0).normalized * gravityFactor); public Func GetGravityFunction(Gravities gravity) { return gravityFunctions[(int)gravity]; } private void OnTriggerEnter(Collider collider) { int instanceID = collider.gameObject.GetInstanceID(); forcesManager.SetGravityForInstance(instanceID, NoGravity); forcesManager.SetZoneForInstance(instanceID, zone); } private void OnTriggerExit(Collider collider) { int instanceID = collider.gameObject.GetInstanceID(); forcesManager.SetGravityForInstance(instanceID, GetGravityFunction(outsideGravityFunction)); forcesManager.SetZoneForInstance(instanceID, Zone.OutsideZone); } }