Как лучше загружать ScriptableObjects в один сборный / несколько сборных? - PullRequest
1 голос
/ 09 мая 2019

(ScriptableObject = SO)

Недавно я пытался узнать о ScriptableObjects и создал проект в Unity, где я просто хочу отстреливать входящих врагов, которые появляются.Я настроил его так, чтобы через SO можно было создавать разных врагов, но заметил, что мне все еще нужно создать префаб для каждого врага.Поэтому, после небольшого количества удачных поисков в Google, я хотел спросить, есть ли способ загрузить определенные SO: s для каждого появившегося врага.Возможно ли во время выполнения скриптов проверить вероятность появления противника, а затем загрузить / найти конкретные данные, созданные с помощью SO: s?

1 Ответ

0 голосов
/ 09 мая 2019

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

Чтобы понять это, я могу объяснить историю SO, чтобы вы могли найти все обычные реализации.

Фаза 1 - Контейнер данных

Изначально SO был создан для хранения (не изменяемых) данных.Они могут работать как ШАБЛОНЫ.

То есть, у вас есть одно Оружие, и вы создаете его по одному на каждое оружие.Таким образом, вы можете просто прикрепить оружие к юниту.

    public class Attacker : MonoBehaviour
    {
        public Weapon weapon;

        public void Attack(IDamageGetter target) => target.GetDamage(weapon.damage);
    }

    public interface IDamageGetter
    {
       void GetDamage(int Damage);
    }

    [CreateAssetMenu(menuName = "Base Weapon")]
    public class Weapon : ScriptableObject
    {
        public int damage = 5;
    }

Вот несколько хороших руководств по SO, используемым для данных: Настройка интерфейса пользователя с объектами Scriptable

Фаза 2 - Логика SO для композиции

После фазы 1, кто-то заметил , что SO может использоваться для разных целей.Многие разработчики начали добавлять логику в SO.

    public class AttackerWithLogic : MonoBehaviour
    {
        public WeaponWithLogic weapon;

        public void Attack(IDamageGetter target) => weapon.Attack(target);
    }

    public abstract class WeaponWithLogic : ScriptableObject
    {
        public int damage = 5;

        public abstract void Attack(IDamageGetter target);
    }

Таким образом, вы можете отделить большую часть логики от монобиха и привязать любую логику к самой SO.У вас не будет одного монобиха-врага с двумя производными классами врага с осью и врага с мечом.У вас будет один монобихийный враг, и вы можете прикрепить WeapAxe или Weaponsword.

Отличным источником для понимания этой логики и применения события к ИИ является эта серия учебных пособий. Подключаемый Ai с объектами Scriptable

Фаза 3 - Реактивные объекты Scriptable

И, наконец, у нас был новый способ использования объектов Scriptable, описанный в Unite Austin 2017 .

Это более продвинутый вариант, чем другие идеи, и он требует понимания шаблона Observer и системы событий C #, но это отличный способ использовать объекты сценариев.

Это может быть использовано как spawner.

    [CreateAssetMenu(menuName = "EnemySpawner")]
    public class EnemySpawner : ScriptableObject
    {
        public event Action<Enemy> OnSpawn;

        public Enemy enemyPrefab;

        public void SpawnEnemyWithSword()
        {
            var enemy = Instantiate(enemyPrefab);
            //..
            //code to setup sword 
            //..
            OnSpawn?.Invoke(enemy);
        }

        public void SpawnEnemyWithAxe()
        {
            //any other logic with the same event
        }
    }

ТАК великолепно для реализации шаблона ООП. Я все еще не уверен, каково их будущее с новой ECS, но я надеюсь, что будетместо для них тоже.

В заключение

Я большой поклонник SO, но есть несколько случаев, когда вы хотите создать одну SO для врага,И в любом случае ТАК не должен заменять MonoBehaviours повсюду.Я бы использовал MonoBehaviour для представления врага.

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

Тем не менее вы можете реализовать SO для настройки его данных (таких как урон здоровью или оружию), для обработки части его логики (например, добавления эффекта к каждому оружию) или для обработки событиямеханики порождения.Я настоятельно рекомендую взглянуть на ссылки, которыми я поделился здесь.Выберите, с чего начать, исходя из вашего опыта, видеоролики Фазы 1 легче, а Фазы 3 - самые передовые.(В любом случае, все они достаточно просты, только последний требует понимания события из c #)

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