В системе у меня есть различные классы и интерфейсы, все из которых присущи пустому интерфейсу «IAbilitySystem».< /p>
Код: Выделить всё
using System;
using System.Collections.Generic;
using UnityEngine;
namespace TenkayCode
{
namespace Systems
{
public interface IAbility : IAbilitySystem
{
[Modifiable]
string Name { get; }
[Modifiable]
float BaseCooldown { get; }
[Modifiable]
int BaseCharges { get; }
void Action() { }
}
public interface IReloadableAbility : IAbility
{
[Modifiable]
float ReloadSpeed { get; }
[Modifiable]
int MaxAmmo { get; }
[Modifiable]
int AmmoPerReload { get; }
void Reload() { }
List Modifiers { get; }
}
public interface IOverheatAbility : IAbility
{
[Modifiable]
float MaxHeat { get; }
[Modifiable]
float HeatReduceRate { get; }
void Cooling() { }
void Heating() { }
List Modifiers { get; }
}
[CreateAssetMenu(menuName = "Assets/Ability")]
public class TenkayAbility : ScriptableObject, IAbility
{
String AbilityName;
float AbilityCooldown;
int AbilityCharges;
public string Name => AbilityName;
public float BaseCooldown => AbilityCooldown;
public int BaseCharges => AbilityCharges;
}
}
}
У меня есть интерфейс «Статистика» для хранения и расчета чисел характеристик персонажей (т. е. HP персонажа, Сила, % недостающей маны). , уровень и т. д.)
Код: Выделить всё
using System;
using System.Collections.Generic;
using UnityEngine;
namespace TenkayCode
{
namespace Systems
{
public interface IStat : IAbilitySystem
{
[Modifiable]
int BaseValue { get; }
void getBonusFromEquipment() { }
void getBonusFromBuffs() { }
}
public interface IResourceStat : IStat
{
[Modifiable]
float BaseRegenRate { get; }
List Modifiers { get; }
}
}
}
Код: Выделить всё
using System.Reflection.Emit;
using System.ComponentModel;
using System;
using UnityEngine;
using System.Reflection;
namespace TenkayCode
{
namespace Systems
{
[AttributeUsage(validOn: AttributeTargets.Field | AttributeTargets.Property)]
public sealed class ModifiableAttribute : Attribute
{
public ModifiableAttribute() { }
}
public class IModifier where T : IAbilitySystem
{
IStat ModifierStat;
[Modifiable]
float ModRatio;
/*im pretty sure this is wrong*/
// List RatioModifiers { get; }
/*this is the part where Im stuck at...
enum ModifierTarget {
// The names of all the fields and properties of type which have the Modifiable Atribute
}
*/
}
}
}
Я думаю, что это позволит мне создать перечисление в «Модификаторе» с именем «Цель модификатора», которое может динамически заполняться всеми именами полей с атрибутом «Изменяемый», относящимся к печатать «Т». Это позволило бы мне хранить все модификаторы для определенного типа «Способностей» в одном списке (
Код: Выделить всё
List modsМоя конечная цель — иметь возможность создавать разные способности как объекты, допускающие сценарии в единстве, и иметь возможность использовать инспектор для назначения базовых значений и с легкостью редактировать любые модификаторы. Мне нравится, как Unity может перечислить все возможные значения поля перечисления в раскрывающемся меню.
Я хотел бы знать, на правильном ли я пути к решению или есть ли это лучший способ реализации такой системы.
Кроме того, мне бы хотелось, чтобы «Модификатор» также мог иметь собственный список «Модификаторов» (т. е.: использование статистики для настроить ModRatio Модификатор).
Я создал базовую версию со всеми классами и интерфейсами.
Подробнее здесь: https://stackoverflow.com/questions/792 ... se-on-type
Мобильная версия