经典RPG项目处理

时间:2014-01-27 18:17:20

标签: c# structure

如何以有条理且易于管理的方式构建项目(因为有不同类型的项目)。

我的想法是让一个ItemManager加载所有项目并存储它们。但是,这是我不确定的。只有武器才有最小和最大伤害。只有盔甲才有盔甲。我真的应该将它们全部存储为Item吗?

凭借传承,我可以解决这个问题(我想!)。

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,
};

我通常(尝试!)当变量具有getter和/或setter时使用_作为前缀。

存储项目的“实例”将在角色/队伍级别完成。持有项目数量

以此作为开始,我遇到了很多关于如何处理变量的实际存储和访问的问题。

如何实际包装物品存储和加载过程?

2 个答案:

答案 0 :(得分:1)

  

只有武器才有最小伤害和最大伤害。只有盔甲才有盔甲。我真的应该将它们全部存储为Item吗?

您可以为从Weapons类继承的ArmorsItem定义另一个类。创建Itemabstract,并在其中定义公共属性它

只是为了得到并设置一个变量,你不需要像这样的属性:

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

如果在获取和设置值时没有不同的逻辑,请使用auto-implemented属性:

public string Desc { get; set; }

答案 1 :(得分:1)

我会使用Interfaces:一个基本接口,用于常见的东西,如ID,名称等,以及其他用于武器/装甲等的接口。 然后,您可以在运行时测试实现哪些接口可以按行动(即显示损坏或护甲值)。 遗传的主要好处是组合的容易性和鸭子打字的可能性,例如有一些东西是椅子和需要的武器。