Как организовать вложенные классы в качестве ссылок в Unity?

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

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

public class Items {
    public class Equipment {
        public class Weapons {
            public Item Sword = new Item();
            Sword.name = "Sword";
            Sword.cost = 1;
        }
    }
}

затем базовый класс Item, например

public class Item {
    public string name;
    public int cost;
}

Я могу сказать, что это ужасная практика, особенно исходя из проблем, которые у меня были, но мне нравится идея использования ссылки, такой как Items.Equipment.Weapons.Sword, и я привык использовать это из API, который я ранее использовал.

Я готов полностью все изменить, мне просто нужны советы. Спасибо.

Я думаю, что мой главный вопрос (был), как лучше всего организовать вложенные классы, чтобы они могли легко быть ссылками из других скриптов?

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


person Jacob Lamattina    schedule 07.03.2019    source источник
comment
Почему бы не использовать пространства имен или это невозможно? в Юнити?   -  person Llama    schedule 07.03.2019
comment
Какой результат вы ищете? Есть ли конкретная причина, по которой вы хотите, чтобы каждый элемент был своего собственного уникального класса? Вам нужен способ заставить это работать в вашем примере с вложенным классом или вам нужны общие рекомендации?   -  person Ben Rubin    schedule 07.03.2019
comment
Да, у меня были некоторые трудности с его использованием в Unity. Может быть, я просто делаю это неправильно.   -  person Jacob Lamattina    schedule 07.03.2019
comment
Вложенные классы предназначены только для организации доступа к элементам, во всяком случае, на данный момент. Так что в конечном итоге я хотел бы иметь возможность использовать эти предметы. Я хотел бы иметь возможность сделать что-то вроде Player.Inventory.addItem(Items.Equipment.Weapons.Sword);   -  person Jacob Lamattina    schedule 07.03.2019
comment
Вы можете использовать свойства С# для достижения того, чего хотите.   -  person Tengku Fathullah    schedule 07.03.2019
comment
Исходя из вашего примера, пространства имен звучат как правильный ответ (и они поддерживаются Unity ). Тем не менее, я думаю, что ваш вопрос, вероятно, будет помечен как слишком широкий или основанный на мнении. Можете ли вы отредактировать, чтобы сосредоточиться на конкретных трудностях, с которыми вы столкнулись при работе с вложенными классами и/или пространствами имен?   -  person xander    schedule 07.03.2019
comment
пространства имен были решением, я просто использовал их неуместно. Пространство имен предшествует классу и требует класс внутри них для тела. Я не понял. Спасибо, парни   -  person Jacob Lamattina    schedule 07.03.2019


Ответы (1)


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

Думайте о ScriptableObject как о наборе свойств (имя предмета, стоимость, сила атаки, сила защиты и т. д.). Для каждого элемента в вашей игре вы создаете экземпляр ScriptableObject. Затем эти экземпляры ScriptableObject становятся активами в вашем проекте Unity, точно так же, как префаб или спрайт. Это означает, что вы можете перетаскивать их в своем проекте и назначать полям в MonoBehaviours. Это приведет к тому, что вы сможете назначать снаряжение персонажу, перетаскивая его из окна «Проект» в Инспектор.

Вот пример того, как это будет выглядеть

Item.cs

public class Item : ScriptableObject
{
    public string name;
    public int cost;
    public Sprite image;
}

Оборудование.cs

public class Equipment : Item
{
    public Slots slot;
}

public enum Slots
{
    Body,
    DoubleHanded,
    Hands,
    Head,
    Feet,
    Legs,
    LeftHand,
    RightHand
}

Оружие.cs

// CreateAssetMenu is what lets you create an instance of a Weapon in your Project
// view.  Make a folder for your weapons, then right click inside that folder (in the 
// Unity project view) and there should be a menu option for Equipment -> Create Weapon
[CreateAssetMenu(menuName = "Equipment/Create Weapon")]
public class Weapon : Equipment
{
    public int attackPower;    
    public int attackSpeed;
    public WeaponTypes weaponType;
}

public enum WeaponTypes
{
    Axe,
    Bow,
    Sword
}

Armor.cs

[CreateAssetMenu(menuName = "Equipment/Create Armor")]
public class Armor : Equipment
{
    public int defensePower;
}

Теперь создайте в своем проекте кучу оружия и доспехов.

введите здесь описание изображения

Одна вещь, которая делает ScriptableObjects приятным, заключается в том, что вы можете редактировать их в своем Инспекторе, вместо того, чтобы делать это через код (хотя вы тоже можете это делать).

введите здесь описание изображения

Теперь к вашему «персонажу» MonoBehaviour добавьте некоторые свойства снаряжения этого персонажа.

public class Character : MonoBehaviour
{
    public Armor bodyArmor;
    public Armor headArmor;
    public Weapon weapon;
}

Теперь вы можете назначать свое оружие и доспехи своему персонажу в Инспекторе.

введите здесь описание изображения

Вы, вероятно, захотите что-то более адаптированное к вашим потребностям, чем мой пример, но это основы. Я рекомендую потратить некоторое время на изучение ScriptableObjects. Прочитайте документы Unity, на которые я ссылался ранее, или посмотрите видео на YouTube.

Одной из сильных сторон Unity является то, что он позволяет выполнять большую часть проектирования и настройки через редактор, а не через код, и ScriptableObjects усиливает это.

person Ben Rubin    schedule 07.03.2019
comment
Это потрясающе. Именно то, что мне было нужно! Я чувствую, что это очень поможет мне. Спасибо! - person Jacob Lamattina; 07.03.2019