using System; using System.Collections.Generic; using UnityEngine; public class AffectingForcesManager : MonoBehaviour { public enum Zone { NimbleZone, OutsideZone, UninitializedZone } private readonly Dictionary impulseForces = new(); private readonly Dictionary> currentGravity = new(); private readonly Dictionary currentGravitySource = new(); private readonly Dictionary zoneInhabitants = new(); public Zone GetZoneOfInstance(int id) { if (!zoneInhabitants.ContainsKey(id)) { return Zone.UninitializedZone; } return zoneInhabitants[id]; } public void IntroduceForce(int instanceID, Vector3 force) { if (!impulseForces.ContainsKey(instanceID)) { impulseForces[instanceID] = force; } else { impulseForces[instanceID] += force; } } public void SetZoneForInstance(int instnaceID, Zone zone) { zoneInhabitants[instnaceID] = zone; } public void SetGravityForInstance(int instanceID, Func gravityFunction, Transform gravitySource) { currentGravity[instanceID] = gravityFunction; currentGravitySource[instanceID] = gravitySource; } public Vector3 GetForceForInstance(int instanceID) { if (impulseForces.ContainsKey(instanceID)) { return impulseForces[instanceID]; } return new Vector3(); } public Func GetGravityForInstance(int instanceID) { if (currentGravity.ContainsKey(instanceID)) { return currentGravity[instanceID]; } return new Func((gravitySource, target) => new Vector3()); } public Transform GetGravitySourceForInstance(int instanceID) { if (currentGravitySource.ContainsKey(instanceID)) { return currentGravitySource[instanceID]; } return transform; } }