C# 经典RPG项目处理

C# 经典RPG项目处理,c#,structure,C#,Structure,如何以有组织且易于管理的方式组织项目(因为有不同类型的项目) 我的想法是有一个ItemManager来加载并存储所有项目。然而,这是我不确定的。只有武器有最小和最大伤害。只有盔甲才有盔甲。我真的应该将它们全部存储为项目吗 有了传统,我可以解决这个问题(我想!) ItemManager.cs using UnityEngine; using System.Collections; using System.Collections.Generic; public class ItemManager

如何以有组织且易于管理的方式组织项目(因为有不同类型的项目)

我的想法是有一个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];
    }
}
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时,我通常(尝试!)使用u作为前缀

项目的“实例”存储将在角色/团队级别完成。保存项目和数量

以此为起点,我必须解决许多问题,即如何处理变量的实际存储和访问

我实际上如何包装物品的存储和装载过程

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

您可以为继承自
物品
类的
武器
盔甲
定义另一个类。将您的
物品
类抽象化,并在其中定义公共属性

只需获取并设置一个变量,您不需要这样的属性:

public string Desc {
    get {return _desc;}
    set {_desc = value;}
}
如果在获取和设置值时没有不同的逻辑,请使用属性:

public string Desc { get; set; }

我会使用接口:一个基本接口用于常见的东西,如ID、名称等,其他接口用于武器/装甲等。 然后,您可以在运行时测试实现了哪些接口,并且可以相应地进行操作(即显示伤害或护甲值)。
与继承相比,它的主要优点是易于组合,并且可以进行duck类型输入,例如,在需要时可以使用椅子和武器。

这个问题似乎与主题无关,因为它属于我,我认为它是在您需要检查代码时提出来的?我不需要,我需要知道如何实际实现代码才能让它工作。只要这样做,你就会看到。@KonradKokosa:我想CR.SE只用于工作代码。在我的项目管理器中,我应该有一个每类项目的列表?在盔甲和武器上,我应该保存它们属于哪个插槽?例如,如果我有头盔或斗篷,我会将其存储在装甲类?@Emz中,你可以将盔甲和武器存储在列表中,因为它们将从物品类继承,在你使用GetType方法对物品类型进行函数检查时,如果它是盔甲,则将其投射到盔甲
(盔甲)物品
像那样。然后你可以做你想做的。我有2件物品,剑和头盔,剑有2点伤害。头盔有2件盔甲。我应该做以下事情<代码>项目武器=新项目武器()
武器。伤害=2
物品。添加(武器)。那么为了得到损坏,我将使用typecast(我想是带有if检查的)?如何将损害纳入我的物品清单?这将花费比我想象的更多的时间来做出决定,但我感谢您添加了另一层信息。一旦我决定接受答案,我会回来接受(如果我选择的话)。我希望有一种魔药能解决我所有的问题。为什么我没有更多的时间?--我读了两篇关于如何实现支持duck类型的接口的文章,它在基础上似乎与继承差不多?不同的是,我根据项目的类型将项目存储在不同的列表中?不,您没有将项目存储在不同的列表中。您有一个列表,其中包含与项目类似的所有内容。一些物品有一个描述其他行为(如损坏等)的界面。当用户选择这样的物品时,qou可以根据确切的界面执行其他操作:作为tipp:do read HEad first设计模式-这确实有助于理解这些概念。那个654页的?我从来没想过有人会买它,那个链接是我发现的第一个东西。不过谢谢,我会读的。这意味着做出决定所需的时间比我想象的要多,但我感谢您添加了另一层信息。一旦我决定接受答案,我会回来接受(如果我选择的话)。我希望有一种魔药能解决我所有的问题。为什么我没有更多的时间--