Использовать или не использовать ScrtiptableObects? [закрыто]

Просто вставьте свой код в MS Word, выберите его -> затем щелкните правой кнопкой мыши -> Нумерация. В этом случае MS Word будет интерпретировать ваш код как маркер / нумерованный список.

Вот экраны:

Screen1 .

Screen2 .

0
задан Petro Koval 5 March 2019 в 14:55
поделиться

1 ответ

Думайте о ScriptableObjects как о классе C # с только свойствами и без методов. Они используются в качестве контейнера данных, который можно назначить компонентам игровых объектов через редактор Unity.

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

public class EnemyAI : MonoBehaviour
{
    // The ScriptableObject asset that is assigned through the Unity editor
    public EnemyInfo enemyInfo;

    private EnemyBehavior currentBehavior;

    void Update()
    { 
        // If this agent has no behavior assigned or it has completed its 
        // previous behavior, choose a new behavior and assign it to this
        // agent
        if (this.currentBehavior == null)
        {
           if (Random.Range(0, 1) <= this.enemyInfo.aggressiveness)
           {
              if (this.enemyInfo.weaponType == "melee")
              {
                 this.currentBehavior = new ChargePlayerBehavior();
              }
              else if (this.enemyInfo.weaponType == "ranged")
              {
                 this.currentBehavior = new ShootPlayerBehavior();
              }
              else
              {
                 throw new Exception("This enemy needs a weapon to attack with!")
              }
           }
           else
           {
              this.currentBehavior = new AvoidPlayerBehavior();
           }
        }

        this.currentBehavior.Update();
    }
}

public class EnemyInfo : ScriptableObject
{
   public float aggressiveness;
   public string weaponType;
   // other fields - max health, speed, etc.
}

Затем вы создаете ресурс EnemyInfo в своем проекте для каждого типа поведения врага. Например:

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

Затем для каждого префаба противника вы можете подключить один из этих трех EnemyInfo активов в его [ 115] поле, и это будет диктовать, как действует враг.

Итак, вы в основном удаляете все поля, которые у вас есть в EnemyAI MonoBehaviour (агрессивность, тип оружия и т. Д.) - и, возможно, максимальное здоровье, скорость и т. Д. В вашем основном Enemy сценарии - - и перемещение этих полей в ScriptableObject. Или вы можете создать один тип ScriptableObject для параметров искусственного интеллекта противника и один тип ScriptableObject для статистики противника. Таким образом, вы можете делить параметры ИИ между несколькими врагами с разной статистикой.

Даже если ваши значения уникальны для всех врагов, вы на самом деле ничего не теряете (за исключением, может быть, дополнительной работы по созданию ресурсов ScriptableObject). Вы просто помещаете свои вражеские поля данных в ScriptableObject, а не как поля в MonoBehaviour. И в будущем вы можете обнаружить, что хотите повторно использовать поведение противника, например, иметь стандартного солдата и элитного солдата, каждый из которых имеет одинаковые характеристики ИИ.

Преимущества

  • Если у вас есть несколько разных врагов, и вы хотите, чтобы все они действовали как снайпер, вы перетаскиваете актив «снайпер» в их поле enemyInfo. Теперь, если вы решите, что снайпер должен быть более агрессивным, вы можете изменить актив «снайпера» aggressiveness в редакторе Unity, и он будет применяться ко всем врагам снайперского типа. Альтернативой было бы проходить каждого врага снайперского типа индивидуально и менять всю их агрессивность. Может быть, вы пропустите несколько префабов или, может быть, вы случайно установите разные значения для разных врагов типа снайпер. Вы даже можете сделать это во время тестирования игрового процесса.
  • Вы можете переключать поведение противника во время игры, просто назначая ему другой актив ScriptableObject в редакторе Unity во время игры.
  • Если у вас есть несколько сценариев противника, которым нужен доступ к одним и тем же данным противника, вы можете назначить этот актив EnemyInfo каждому сценарию, вместо того, чтобы иметь несколько разных сценариев для одного врага, у каждого из которых есть свой собственный MaxHealth ], WeaponType и т. Д. Или наличие сценариев, которые все ссылаются друг на друга для доступа к полям.
  • Вы можете стать частью крутого детского клуба ScriptableObjects.

Это очень хорошая презентация о ScriptableObjects

0
ответ дан derHugo 5 March 2019 в 14:55
поделиться
Другие вопросы по тегам:

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