Как заполнить значения базы Enum по типуC#

Место общения программистов C#
Ответить
Anonymous
 Как заполнить значения базы Enum по типу

Сообщение Anonymous »

Я пытаюсь создать систему способностей персонажа в Unity.
В системе у меня есть различные классы и интерфейсы, все из которых присущи пустому интерфейсу «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;
}

}

}
Эти классы имеют различные поля типов данных float и int, которые система использует для расчета того, как работает способность (т. е. урон, дальность ближнего боя, разброс, область действия, скорость снаряда и т. д.). В каждом из этих полей используется настраиваемый атрибут «Изменяемый».
У меня есть интерфейс «Статистика» для хранения и расчета чисел характеристик персонажей (т. е. 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; }

}

}
}
У меня также есть класс «Модификатор», который может принимать собственное число с плавающей запятой «ModRatio» и некоторое число из класса «Stat» и увеличивать значения любых «модифицируемых» полей в любом классе. который реализует IAbilitySystem всякий раз, когда это значение вызывается чем-то другим.

Код: Выделить всё

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
}
*/
}

}
}

Я хотел бы настроить эту систему так, чтобы класс «Модификатор» можно было использовать в общих чертах (т. е.: Modifier где T: IAbilitySystem).
Я думаю, что это позволит мне создать перечисление в «Модификаторе» с именем «Цель модификатора», которое может динамически заполняться всеми именами полей с атрибутом «Изменяемый», относящимся к печатать «Т». Это позволило бы мне хранить все модификаторы для определенного типа «Способностей» в одном списке (

Код: Выделить всё

List mods
), а не иметь список для каждого поля, которое можно изменить, и следить за тем, чтобы каждый мод находился в правильном списке. Это также позволит мне продолжать масштабировать систему до любого количества IAbilitySystem, не создавая при этом слишком много спагетти.
Моя конечная цель — иметь возможность создавать разные способности как объекты, допускающие сценарии в единстве, и иметь возможность использовать инспектор для назначения базовых значений и с легкостью редактировать любые модификаторы. Мне нравится, как Unity может перечислить все возможные значения поля перечисления в раскрывающемся меню.
Я хотел бы знать, на правильном ли я пути к решению или есть ли это лучший способ реализации такой системы.
Кроме того, мне бы хотелось, чтобы «Модификатор» также мог иметь собственный список «Модификаторов» (т. е.: использование статистики для настроить ModRatio Модификатор).
Я создал базовую версию со всеми классами и интерфейсами.

Подробнее здесь: https://stackoverflow.com/questions/792 ... se-on-type
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»