Как правильно продолжить добавление нескольких скриптов в GameObject - PullRequest
1 голос
/ 31 марта 2019

Мой проект единства растет, и я немного напуган.

Я создал Player, у которого есть масса сценариев, которые работают вместе.(Это будет еще больше в последнее время.) Вот как это выглядит.

enter image description here

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

Некоторые из них:

public class BasicCharacter : MonoBehaviour
{
    protected static Rigidbody2D rb2d;
    protected static CharacterRenderer characterRenderer;
    protected static Vector2 directionLookingAt;
    protected static Vector2 movement;
    protected static Vector2 attackPos;

    protected static bool hasDashedAttack = false;
    protected static bool hasFinalizerAttack = false;
    protected static bool isUsingMovementSkills = false;
    protected static bool isStringingAttacks = false;
    ...

Это пример того, как я называю некоторые из этих переменных условием для выполнения некоторых других действий:

private GameObject GetAttackAnimation()
    {
        if(hasFinalizerAttack)
        {
            return empoweredAttackVFX;
        }
        else if (hasDashedAttack)
        {
            return dashedAttackVFX;
        }
        else if (isAttackCharged)
        {
            return chargedAttackVFX;
        }
        return basicAttackVFX;
    }

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

У меня есть несколько вопросов:

Нужен ли мне PlayerManager, который отслеживаетвозможные варианты поведения?

Есть ли способ не добавлять каждый сценарий к игровому объекту, чтобы он выглядел чище?

Устойчив ли сценарий BasicCharacter?

1 Ответ

3 голосов
/ 01 апреля 2019

Определенные части вашего персонажа можно сделать немного более модульными с помощью ScriptableObjects (https://unity3d.com/learn/tutorials/modules/beginner/live-training-archive/scriptable-objects), они не обязательно снижают уровень сложности (игры сложны, вы должны это принять), но они может помочь, по крайней мере, снять загромождение с вашего контроллера проигрывателя и распределить вашу функциональность по различным, более автономным классам, которые удобно встроены в редакторы Unity, позволяя вам перетаскивать их и, что более важно, редактировать их отдельно от префаба основного игрока, что позволяет избежать проблемы «огромной стены данных сценария».

В этом случае, например, я бы разделил данные о способностях и данные о баффах / малусах в ScriptableObjects. Вы можете настроить там любую иерархию классов, которую хотите, и изменить их как отдельные игровые ресурсы для своего основного игрока (если вы вложите достаточно работы, вы даже можете сделать их достаточно модульными, чтобы работать как с врагами, так и с вашим игроком, что довольно мило). удобно!)

После того, как вы настроили свои объекты сценариев, вы можете дать им некоторую базовую функциональность, такую ​​как «OnTick», «OnTakeDamage», «OnActivate» и т. Д., И т. Д., Даже если у вас есть внутреннее состояние, например «IsSkillActive» и т. Д., Тогда вы просто сохраняете их в виде списков или словарей на вашем объекте игрока, и перебирать их. Быстрый псевдокод может быть:

bool canInput = true;
foreach(Ability in Abilities)
{
 if (Ability.IsSkillActive())
 {
  canInput = false; //still in the middle of an active ability
  break;
 }
}
if (canInput)
{
 //Do allow player to have input here.
}

Или вы могли бы иметь:

class DamageOverTimeDebuff : ScriptableObject
{
 int damagePerTick = 1;

 OnTick(PlayerObject afflictedPlayer)
 {
  afflictedPlayer.TakeDamage(1);
 }
}

Таким образом, вы можете сделать способности и эффекты более модульными и построить своего игрока по составу, вместо того, чтобы использовать операторы if для каждого отдельного сценария.

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

Это всего лишь одна из возможных стратегий, проблема, которую вы описываете, заключается в том, что с каждой игрой приходится сталкиваться и решать ее по-разному. Возможно, ScriptableObjects могут помочь вам разделить ваши функциональные возможности на что-то более крупное, возможно, они будут просто дополнительным образцом, который встанет у вас на пути. Это зависит от конкретных потребностей вашей игры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...