Grayfox90
@Grayfox90
Пушистый дядь

Открытие новых способностей персонажем в 2д игре на Юнити?

Как оптимально разработать систему скилов для 2D метроидвании на Unity, начиная с основы и постепенно расширяя возможности персонажа? Имеется следующая структура:

1. PlayerController (управление персонажем: движение, анимация, прыжки, атака; определение статуса "на земле" для контроля прыжков)
2. PlayerAbilities (управление способностями персонажа)
3. AbilityPickup (подбор способностей на уровне)
4. DoubleJump, Dash, MeleeAttack, Projectile, RangedAttack и другие способности

Цель - создать модульные скрипты для упрощения будущих изменений. Как лучше добавлять умения персонажу после подбора скила: вешать на персонажа или активировать уже существующий скрипт в иерархии? Будет ли проблемой, если персонаж имеет на себе скажем в конце игры 10 скилов, разбитых на отдельные мелкие скрипты, управляемые PlayerAbilities? Если у вас есть опыт в данной теме, прошу помочь советом по такой структуре.

P.S. Если немного отдалённо, то игра на подобии серии Ори или Hollow Knight, но намного проще конечно. Это так, к слову
  • Вопрос задан
  • 305 просмотров
Решения вопроса 2
nynceHb
@nynceHb
Я бы определил базовый ScriptableObject для способности:
public abstract class Ability : ScriptableObject
{
    public abstract void Activate(PlayerController playerController);
    public abstract void Deactivate(PlayerController playerController);
}


И затем создавал бы конкретные типы способностей:
[CreateAssetMenu(fileName = "Double Jump", menuName = "Abilities/Double Jump")]
public class DoubleJump : Ability
{
    public override void Activate(PlayerController playerController)
    {
        playerController.MaxJumpCount = 2;
    }

    public override void Deactivate(PlayerController playerController)
    {
        playerController.MaxJumpCount = 1;
    }
}


Тогда AbilityPickup выглядел бы примерно так:
[RequireComponent(typeof(PlayerController))]
public class AbilityPickup : MonoBehaviour
{
    private PlayerController playerController;
    private List<Ability> activeAbilities = new List<Ability>();
    
    private void Awake()
    {
        playerController = GetComponent<PlayerController>();
    }

    private void OnTriggerEnter(Collider collider)
    {
        if (collider.TryGetComponent(out AbilityContainer abilityContainer))
            AddAbility(abilityContainer.Ability);
    }

    public void AddAbility(Ability ability)
    {
        ability.Activate(playerController);
        activeAbilities.Add(ability);
    }
}


Где то в мире будет лежать объект с компонентом:
public class AbilityContainer : MonoBehaviour
{
    [SerializeField] private Ability ability;
    public Ability Ability => ability;
}
Ответ написан
Комментировать
@oblakooblako
Прочитать про архитектуру. MVP, ECS конкретно в юнити. Ознакомиться с различными готовыми библиотеками для инъекций и связывания unirx, zenject.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
GavriKos
@GavriKos Куратор тега Unity
Как лучше добавлять умения персонажу после подбора скила: вешать на персонажа или активировать уже существующий скрипт в иерархии?


Лучше вообще не наследовать абилити от MonoBehaviour - делайте систему способностей простыми классами.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы