我正在开始开发一个冒险游戏/RPG的漫长过程,我希望得到一些关于我正在开发的资源系统的评论。它的工作原理是,一个资源对于世界上的每一个资源都是通用的。每个资源都有一个名称、一个随机产量和一个随机质量。因此,我已经为每个资源将具有的泛型属性和函数创建了一个接口。
public interface IResource{
string Name {get;set;}
string Quality {get;set;}
int Yield{get;set;}
string ConvertQualityToString();
int GetResourceYield();
}然后在实际的资源基类中实现接口。
public class Resource : MonoBehaviour, IResource{
public string Name { get; set; }
public string Quality { get; set; }
public int Yield { get; set; }
public string ConvertQualityToString(){
var val = Random.Range(0, 3);
string quality;
switch (val){
case 1:
quality = "Good";
break;
case 2:
quality = "Great";
break;
default:
quality = "Poor";
break;
}
return quality;
}
public int GetResourceYield(){
var val = Random.Range(1, 25);
return val;
}
}最后,我创建特定的资源本身,并将其附加到检查器中的游戏对象。
public class Granite : Resource{
void Start(){
Name = "Granite";
Quality = ConvertQualityToString();
Yield = GetResourceYield();
}
}这是运行这个系统的正确方法吗?显然,当我在启动时记录值时,Yield和Quality是随机的,并且我创建的每个资源对象的Name都是正确的。有更好的方法吗?有什么需要我改变的吗?提前谢谢。
发布于 2018-10-19 14:50:37
几个注意事项:
IResource属性都有公共设置程序。您完全确定其他代码应该能够修改这些代码吗?我建议让这些只读,除非你有具体的理由不这样做。ConvertQualityToString和GetResourceYield看起来像内部助手方法。让它们成为IResource接口的一部分会创建一个非常令人困惑的API:resource.Yield和resource.GetResourceYield()之间有什么区别?按照代码的结构方式,我希望这些方法是protected。string是Quality的好类型吗?如果您有固定数量的质量,enum是一个更强类型和描述性的选择。如果不同的质量有不同的特性,那么也许Quality类更有意义。尽量避免编写“输入错误”的代码。ConvertQualityToString为每种质量提供了33%的机会。同样,GetResourceYield总是在1到25之间产生收益。你确定这适用于所有资源和任何情况吗?质量和产量是否应该由Resource实例本身决定?例如,如果一些敌人应该有更高的机会放弃高质量的资源呢?或者,如果你想提供玩家升级来提高平均资源产量,那该怎么办?Granite类的意义是什么?其中没有自定义逻辑,而且资源名称本身足以区分不同的资源。ConvertQualityToString中,不需要这个本地quality变量:您可以让每个case直接返回一个值(这也允许您删除那些break语句)。ConvertQualityToString是一个奇怪的名字:它并没有真正转换任何东西。不准确和令人困惑的名称往往会使代码更难以使用。https://codereview.stackexchange.com/questions/205897
复制相似问题