Space-Smash-Out/Assets/Scripts/Managers/AffectingForcesManager.cs

72 lines
1.8 KiB
C#

using System;
using System.Collections.Generic;
using UnityEngine;
public class AffectingForcesManager : MonoBehaviour
{
public enum Zone { NimbleZone, OutsideZone, UninitializedZone }
private readonly Dictionary<int, Vector3> impulseForces = new();
private readonly Dictionary<int, Func<Transform, Transform, Vector3>> currentGravity = new();
private readonly Dictionary<int, Transform> currentGravitySource = new();
private readonly Dictionary<int, Zone> 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<Transform, Transform, Vector3> 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<Transform, Transform, Vector3> GetGravityForInstance(int instanceID)
{
if (currentGravity.ContainsKey(instanceID))
{
return currentGravity[instanceID];
}
return new Func<Transform, Transform, Vector3>((gravitySource, target) => new Vector3());
}
public Transform GetGravitySourceForInstance(int instanceID)
{
if (currentGravitySource.ContainsKey(instanceID))
{
return currentGravitySource[instanceID];
}
return transform;
}
}