Space-Smash-Out/Assets/Scripts/Managers/AffectingForcesManager.cs
Jakob Feldmann 5278d5ba81 feat: ship particle effects, base properties, gravity fix
All ships now have their own properties, which are modifiers for the base ship properties.
The base behaviour of all ships can now be easily changed, while the individual differences are still respected.

Ship states now trigger particle emissions & effects. This is still messy and mixed with
sounds. Will be overhauled once ship state machine is introduced.

To calculate gravity you now need to specify the gravity source transform.
2024-05-05 17:48:27 +02:00

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 IntroduceImpulseForce(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 GetImpulseForInstance(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;
}
}