我要制作某种武器清单,当然要对它们进行硬编码,这样它们就无法被攻击或修改而无需特殊的东西。而我只是想知道是否有更快的方法:
public Firearm(string WeaponName, int WeaponId, float Damage, FireType WeaponFireType, float FireRate, float ReloadTime, int MaxClip, bool InfiniteAmmo)
{
weaponName = WeaponName;
weaponID = WeaponId;
damage = Damage;
weaponFireType = WeaponFireType;
fireRate = FireRate;
reloadTime = ReloadTime;
maxClip = MaxClip;
infiniteAmmo = InfiniteAmmo;
}
然后是这个:(这只是一个例子,我不会在实际的脚本中这样做。
void InitializeWeapons()
{
var allFirearms = new List<Firearm>();
allFirearms.Add(new Firearm(
"Pistol",
0, 12.5f, Firearm.FireType.SemiAutomatic,
1.2f, 1.5f, 12, true
));
}
有不同的方法吗?什么东西更清洁,更容易看到发生了什么?
编辑:有点糟透,我不能把你们全部作为批准的答案,因为他们都帮助我学习了一些东西等等。我只是选择我决定使用的那个。我将完成代码并批准我使用过的代码。
答案 0 :(得分:3)
也许试试Fluent Builder pattern?模式并非没有缺陷,但它确实使复杂的对象创建更具可读性。 首先,您需要添加WeaponBuilder类:
public class WeaponBuilder
{
private string name;
private int damage;
private int fireRate;
public WeaponBuilder CreateWeapon(string name)
{
this.name = name;
return this;
}
public WeaponBuilder WithDamage(int damage)
{
this.damage = damage;
return this;
}
public WeaponBuilder WithFireRate(int fireRate)
{
this.fireRate = fireRate;
return this;
}
public Weapon Build()
{
return new Weapon(name, damage, fireRate);
}
}
然后你就像这样创造你的武器:
var weapon = new WeaponBuilder()
.CreateWeapon("AK-47")
.WithDamage(100)
.WithFireRate(50)
.Build();
答案 1 :(得分:1)
添加在迭代中读取配置文件的代码并创建所需的对象。
缺点: 您需要花一些时间来创建配置文件。
优点: 一旦拥有它,代码将变为更清晰和可扩展,为将来可能的扩展和解决方案打开。
答案 2 :(得分:1)
您可以使用T4 Text Template:
您的代码可能很难看,但数据文件将更易于维护,您甚至可以使用数据库或共享文件来存储数据。
要使用它,请在Visual Studio中创建扩展名为.tt的文件。看起来像这样:
以下代码未经过测试
<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ output extension=".cs" #>
namespace Foo {
class Bar {
static void InitBar() {
<#
// Create an object for every line:
// Create an object for every line:
var lines = File.ReadAllLines("testfile");
foreach(var line in lines) {
<#= var newObject = new Weapon("#> line <#= "); #>
}
#>
}
}
}