Ссылка на систему заменяемых способностей в Unity/C#C#

Место общения программистов C#
Ответить
Anonymous
 Ссылка на систему заменяемых способностей в Unity/C#

Сообщение Anonymous »

Поэтому я пытаюсь создать заменяемую систему способностей в единстве с основным классом способностей и каждой способностью, унаследованной от него, чтобы оказывать свой уникальный эффект. Мне трудно применить способности к игроку после того, как он их выбрал.
В настоящее время основной код способности:

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

        public abstract class Ability : MonoBehaviour
{
public int id = -1;
public string abilityName = string.Empty;
public string description = string.Empty;

enum AbilityState { Ready, Casting, Cooldown}
AbilityState state = AbilityState.Ready;

public float cooldown = 0f;

public bool castDone = false;

public bool castIFrames = false;
public bool castLockMove = false;

public void TryCast()
{
if (state == AbilityState.Ready)
{
StartCoroutine(Cast());
StartCoroutine(UseAbility());
}
}

IEnumerator Cast()
{
state = AbilityState.Casting;
if (castLockMove)
{
//disable movement
}
if (castIFrames)
{
//disbale hit collider
}
yield return new WaitUntil(() => castDone = true);
//make sure things are back on
StartCoroutine(CooldDown());
}

IEnumerator CooldDown()
{
state = AbilityState.Cooldown;
yield return new WaitForSeconds(cooldown);
state = AbilityState.Ready;
}

public abstract IEnumerator UseAbility();

public void RemoveThis()
{
Destroy(this);
}
}
При такой конкретной имплантации:

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

        public Test_Dash()
{
id = 1;
abilityName = "Dash";
description = "Quick move forwards";
cooldown = 4f;
castIFrames = true;
}

float dashFactor;
Vector2 direction;

public override IEnumerator UseAbility()
{
castDone = false;
yield return null;
while (PlayerClass.playerObject.GetComponent
().moveInfo != Vector2.zero)
{
yield return null;
}
direction = PlayerClass.playerObject.GetComponent().moveInfo;
StartCoroutine(Dash());
}

IEnumerator Dash()
{
PlayerClass.playerObject.GetComponent().AddForce(direction * dashFactor * 0.3f);
yield return null;
PlayerClass.playerObject.GetComponent().AddForce(direction * dashFactor * 0.9f);
yield return null;
PlayerClass.playerObject.GetComponent().AddForce(direction * dashFactor * 1f);
castDone = true;
}
}
Затем мне нужно применить способность к игроку:

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

    public class Abilities
{
public Ability abl1;
public Ability abl2;
public Ability abl3;
public Ability abl4;
}
Есть ли другой способ сделать это без создания отдельного игрового объекта для каждой способности или одного игрового объекта со всеми способностями, поскольку оба этих метода кажутся очень неуклюжими и из них можно легко выйти руки. Извините за весь блок кода, я просто пытаюсь сделать мой вопрос и контекст как можно более ясными.

Подробнее здесь: https://stackoverflow.com/questions/792 ... ty-c-sharp
Ответить

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

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

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

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

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