I’m trying to get better at using interfaces and abstract classes, and I wanted to see if I could implement the following system. Im envisioning an abstract class NPC with several implementations: Friend, Enemy, StationaryEnemy.
I then want to try and layer on a Stats system that depends on interfaces. So let’s say we have a base IStats with several interfaces that inherit: IMovable, IDamageable. I want Friends to implement IMoveable, Enemies to implement IMoveable, IDamageable, and StationaryEnemies to implement IDamageable (for example). The idea is at the end of the day, I could query Friends Stats and find MovementSpeed. Or, I could query Enemies Stats and find MovementSpeed and Health.
Here is one way I can see doing this, but I’m sure it has flaws and I’m seeking feedback/corrections:
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
public abstract class TestCharacter : MonoBehaviour, IStat
{
public List<Stat> Stats { get; set; }
public void AddOrModifyStats(List<Stat> stats)
{
foreach (var stat in stats)
{
if (Stats.Any(x=>x.Name==stat.Name))
{
Stats.First(x=>x==stat).Value += stat.Value;
}
else
{
Stats.Add(stat);
}
}
}
}
public abstract class TestNPC : TestCharacter
{
// common properties
}
public class TestEnemy : TestNPC, IMovableTest, IDamageableTest
{
public Stat MovementSpeed { get; set; }
public Stat Health { get; set; }
private void Start()
{
AddOrModifyStats(new List<Stat>() { MovementSpeed, Health });
}
}
public class TestStationaryEnemy : TestNPC, IDamageableTest
{
public Stat Health { get; set; }
private void Start()
{
AddOrModifyStats(new List<Stat>() { Health });
}
}
public interface IStat
{
List<Stat> Stats { get; set; }
public void AddOrModifyStats(List<Stat> stats);
}
public interface IMovableTest : IStat
{
public Stat MovementSpeed { get; set; }
}
public interface IDamageableTest : IStat
{
public Stat Health { get; set; }
}
public class Stat
{
public string Name;
public string Value;
public Stat(string name, string value)
{
Name = name;
Value = value;
}
}