2014-01-27 4 views
0

Как структурировать элементы (как есть разные типы элементов) в организованном и легко управляемом виде.Классическая обработка RPG Обработка

Моя идея - иметь ItemManager, который загружает все предметы и сохраняет их. Однако, это я был не уверен. Только оружие имеет минимальный и максимальный урон. Только доспехи имеют доспехи. Должен ли я хранить их все как предмет?

С наследием я могу решить это (я думаю!).

ItemManager.cs

using UnityEngine; 
using System.Collections; 
using System.Collections.Generic; 

public class ItemManager : MonoBehaviour { 

    private static List<Item> items; 

    public ItemManager() { 
     items = new List<Item>(); 
    } 

    void Awake() {  
     DontDestroyOnLoad (this); 

     // load all items from file 
    } 

    public static int Length { 
     get {return items.Count;} 
    } 

    public static Item Item (int index) { 
     return items [index]; 
    } 
} 

Item.cs

using UnityEngine; // only used for debug purposes 

public class Item : MonoBehaviour { // : MonoBehaviour are for debug purposes 

    private string _name; 
    private string _desc; 

    private int _maxQuantity; // quest items wont have one 

    private int _category; 
    private bool _dropable; // quest items wont have one 
    private int _price; // quest items wont have one 

    public Item() { 
     _name = string.Empty; 
     _desc = string.Empty; 

     _quantity = 0; 
     _maxQuantity = 0; 

     _category = 0; 
     _dropable = false; 
     _price = 0; 
    } 

#region Setters and Getters 
    public string Name { 
     get {return _name;} 
     set {_name = value;} 
    } 

    public string Desc { 
     get {return _desc;} 
     set {_desc = value;} 
    } 

    public int MaxQuantity { 
     get {return _maxQuantity;} 
     set {_maxQuantity = value;} 
    } 

    public int Category { 
     get {return _category;} 
     set {_category = value;} 
    } 

    public bool Dropable { 
     get {return _dropable;} 
     set {_dropable = value;} 
    } 

    public int Price { 
     get {return _price;} 
     set {_price = value;} 
    } 
#endregion 
} 

// enum used to identify categories by name 
public enum ItemCategory { 
    Miscellaneous, 
    Quest, 
    Consumable, 
    Weapon, 
    Armor, 
    Gem, 
    Resource, 
}; 

Я вообще (попробуйте!) Использовать _ в качестве префикса, если переменная имеет поглотитель и/или сеттера ,

Хранение «экземпляров» предметов будет производиться на уровне персонажа/партии. Удерживание Позиция и Количество.

С этим в начале я сталкиваюсь с множеством проблем с тем, как обращаться с фактическим хранением и доступом к переменным.

Как я могу на самом деле обернуть процесс хранения и загрузки элементов?

+1

Этот вопрос не соответствует теме, потому что он принадлежит http://codereview.stackexchange.com/ –

+0

Я взял его http://codereview.stackexchange.com, когда у вас есть код для проверки? Я не знаю, мне нужно знать, как реально реализовать код для его работы. – Emz

+0

просто сделайте это, и вы увидите. – GameAlchemist

ответ

1

Только оружие имеет минимальный и максимальный урон. Только доспехи имеют доспехи. Должен ли я хранить их все как предмет?

Вы можете задать другой класс для Weapons и Armors, которые унаследованы из Item class.Make вашего Item класса abstract, и определить общие свойства внутри него.

И только, чтобы получить и установить переменную не нужно свойство как это:

public string Desc { 
    get {return _desc;} 
    set {_desc = value;} 
} 

Вместо этого используйте auto-implemented свойства, если у вас нет другой логики, когда вы получать и устанавливать свою ценность:

public string Desc { get; set; } 
+0

В моем менеджере товаров у меня должен быть список для каждой категории товаров? На доспехах и оружии я должен сохранить, в какой слот они принадлежат? Например, если у меня есть шлем или плащ, я бы сохранил это в классе брони? – Emz

+0

@Emz, вы можете хранить Доспехи и Оружие в списке , потому что они наследуют класс Item, в вашей функции процесса проверяют тип элемента с помощью метода GetType, если это Armor, а затем бросает его в Armor '(Armor) item'. то вы можете делать то, что хотите. –

+0

У меня есть 2 предмета, Меч и Шлем, Меч имеет 2 урона. Шлем имеет 2 доспеха. Должен ли я сделать следующее: 'ItemWeapon weapon = new ItemWeapon();' 'weapon.damage = 2;' 'items.Add (weapon);'. Тогда, чтобы получить урон, я буду использовать typecast (с проверкой, если я полагаю)? Как будет повреждаться в моем списке предметов? – Emz

1

Я бы с интерфейсы: Один базовый интерфейс для общей вещи, как ID, имя и т.д. и другие интерфейсы для оружия/брони и т.д. Затем вы можете проверить во время выполнения, интерфейсы реализован могут действовать accoridngly (т.е. отображать урон или броню). Основным преимуществом над наследованием является легкость композиции и возможность делать утиную печать, например. есть что-то, что является стулом, и оружие при необходимости.

+0

Я прочитал две статьи о том, как реализовать интерфейсы, поддерживающие утиную печать, похоже, что в базе есть что-то вроде наследования? С той разницей, что я храню элементы в разных списках в зависимости от их типа? – Emz

+0

НЕТ, вы не храните элементы в разных списках. У вас есть один Список , который содержит все вещи, похожие на предметы. Некоторые элементы имеют интерфейс, который описывает другое поведение, такое как повреждение и т. Д. Когда пользователь выбирает такой элемент, qou может выполнять дополнительные действия в зависимости от точного интерфейса (ов): –

+0

Как tipp: прочитайте HEAD first Design patterns - это действительно помогает которые такие понятия. –

Смежные вопросы