C# “我怎么能?”;加上“;是否将这些名称转换为我要更新的方法/变量?
在我的新游戏中,我有几种不同的动物,可以从特定的围场中添加和移除。代码按预期工作,但它是非常重复和冗长的。目前,我正在使用(多个)switch语句从保存动物信息的可编写脚本的对象中获取一个名为itemName的字符串 正如你在我下面的代码中所看到的,有很多重复的代码很难看鉴于每种情况下的代码块除了动物名称字符串外都是相同的,是否有一种建议的方法来减少和改进这一点?我在整个项目中以相同的方式使用多个switch语句,这将减少数百行 我对编程比较陌生。在浏览文档时,我认为字符串插值可能是实现这一点的方法,但无法弄清楚如何使它实际引用正确的变量(如保存文件中的int) 本质上,我想做的是使用C# “我怎么能?”;加上“;是否将这些名称转换为我要更新的方法/变量?,c#,unity3d,C#,Unity3d,在我的新游戏中,我有几种不同的动物,可以从特定的围场中添加和移除。代码按预期工作,但它是非常重复和冗长的。目前,我正在使用(多个)switch语句从保存动物信息的可编写脚本的对象中获取一个名为itemName的字符串 正如你在我下面的代码中所看到的,有很多重复的代码很难看鉴于每种情况下的代码块除了动物名称字符串外都是相同的,是否有一种建议的方法来减少和改进这一点?我在整个项目中以相同的方式使用多个switch语句,这将减少数百行 我对编程比较陌生。在浏览文档时,我认为字符串插值可能是实现这一点的
项.itemName
,删除所有空格并使其全部小写,然后在需要的地方“插入”,如saveMgr.myStats.{theNewItemName}-=1代码>或类似。那么我需要6行而不是300行
这是我的密码。我留下的内容只是为了展示它现在是多么的重复
switch (item.itemName)
{
case "Albino Goat":
saveMgr.myStats.albinogoat -= 1;
specificPaddock.albinogoat += 1;
PaddockAddEvent(item.itemName, specificPaddock.albinogoat, specificPaddock, item);
UpdateStatOnAnimalAddEvent(onePercent);
break;
case "Arabian Horse":
saveMgr.myStats.arabianhorse -= 1;
specificPaddock.arabianhorse += 1;
PaddockAddEvent(item.itemName, specificPaddock.arabianhorse, specificPaddock, item);
UpdateStatOnAnimalAddEvent(onePercent);
break;
case "Bull Calf":
saveMgr.myStats.bullcalf -= 1;
specificPaddock.bullcalf += 1;
PaddockAddEvent(item.itemName, specificPaddock.bullcalf, specificPaddock, item);
UpdateStatOnAnimalAddEvent(onePercent);
break;
case "Cow Calf":
saveMgr.myStats.cowcalf -= 1;
specificPaddock.cowcalf += 1;
PaddockAddEvent(item.itemName, specificPaddock.cowcalf, specificPaddock, item);
UpdateStatOnAnimalAddEvent(onePercent);
break;
case "Merino Lamb":
saveMgr.myStats.merinolamb -= 1;
specificPaddock.merinolamb += 1;
PaddockAddEvent(item.itemName, specificPaddock.merinolamb, specificPaddock, item);
UpdateStatOnAnimalAddEvent(onePercent);
break;
case "Piglet":
saveMgr.myStats.piglet -= 1;
specificPaddock.piglet += 1;
PaddockAddEvent(item.itemName, specificPaddock.piglet, specificPaddock, item);
UpdateStatOnAnimalAddEvent(onePercent);
break;
case "Quarter Horse":
saveMgr.myStats.quarterhorse -= 1;
specificPaddock.quarterhorse += 1;
PaddockAddEvent(item.itemName, specificPaddock.quarterhorse, specificPaddock, item);
UpdateStatOnAnimalAddEvent(onePercent);
break;
case "Azteca Horse":
saveMgr.myStats.aztecahorse -= 1;
specificPaddock.aztecahorse += 1;
PaddockAddEvent(item.itemName, specificPaddock.aztecahorse, specificPaddock, item);
UpdateStatOnAnimalAddEvent(onePercent);
break;
case "Bull":
saveMgr.myStats.bull -= 1;
specificPaddock.bull += 1;
PaddockAddEvent(item.itemName, specificPaddock.bull, specificPaddock, item);
UpdateStatOnAnimalAddEvent(onePercent);
break;
case "Cow":
saveMgr.myStats.cow -= 1;
specificPaddock.cow += 1;
PaddockAddEvent(item.itemName, specificPaddock.cow, specificPaddock, item);
UpdateStatOnAnimalAddEvent(onePercent);
break;
case "Grey Goat":
saveMgr.myStats.greygoat -= 1;
specificPaddock.greygoat += 1;
PaddockAddEvent(item.itemName, specificPaddock.greygoat, specificPaddock, item);
UpdateStatOnAnimalAddEvent(onePercent);
break;
case "Merino Sheep":
saveMgr.myStats.merinosheep -= 1;
specificPaddock.merinosheep += 1;
PaddockAddEvent(item.itemName, specificPaddock.merinosheep, specificPaddock, item);
UpdateStatOnAnimalAddEvent(onePercent);
break;
case "Pig":
saveMgr.myStats.pig -= 1;
specificPaddock.pig += 1;
PaddockAddEvent(item.itemName, specificPaddock.pig, specificPaddock, item);
UpdateStatOnAnimalAddEvent(onePercent);
break;
case "Black Lamb":
saveMgr.myStats.blacklamb -= 1;
specificPaddock.blacklamb += 1;
PaddockAddEvent(item.itemName, specificPaddock.blacklamb, specificPaddock, item);
UpdateStatOnAnimalAddEvent(onePercent);
break;
case "Black Sheep":
saveMgr.myStats.blacksheep -= 1;
specificPaddock.blacksheep += 1;
PaddockAddEvent(item.itemName, specificPaddock.blacksheep, specificPaddock, item);
UpdateStatOnAnimalAddEvent(onePercent);
break;
case "Dark Horse":
saveMgr.myStats.darkhorse -= 1;
specificPaddock.darkhorse += 1;
PaddockAddEvent(item.itemName, specificPaddock.darkhorse, specificPaddock, item);
UpdateStatOnAnimalAddEvent(onePercent);
break;
case "Dorper Sheep":
saveMgr.myStats.dorpersheep -= 1;
specificPaddock.dorpersheep += 1;
PaddockAddEvent(item.itemName, specificPaddock.dorpersheep, specificPaddock, item);
UpdateStatOnAnimalAddEvent(onePercent);
break;
case "Dorper Lamb":
saveMgr.myStats.dorperlamb -= 1;
specificPaddock.dorperlamb += 1;
PaddockAddEvent(item.itemName, specificPaddock.dorperlamb, specificPaddock, item);
UpdateStatOnAnimalAddEvent(onePercent);
break;
case "Berkshire Pig":
saveMgr.myStats.berkshirepig -= 1;
specificPaddock.berkshirepig += 1;
PaddockAddEvent(item.itemName, specificPaddock.berkshirepig, specificPaddock, item);
UpdateStatOnAnimalAddEvent(onePercent);
break;
case "Berkshire Piglet":
saveMgr.myStats.berkshirepiglet -= 1;
specificPaddock.berkshirepiglet += 1;
PaddockAddEvent(item.itemName, specificPaddock.berkshirepiglet, specificPaddock, item);
UpdateStatOnAnimalAddEvent(onePercent);
break;
case "Swiss Cow":
saveMgr.myStats.swisscow -= 1;
specificPaddock.swisscow += 1;
PaddockAddEvent(item.itemName, specificPaddock.swisscow, specificPaddock, item);
UpdateStatOnAnimalAddEvent(onePercent);
break;
case "Swiss Cow Calf":
saveMgr.myStats.swisscowcalf -= 1;
specificPaddock.swisscowcalf += 1;
PaddockAddEvent(item.itemName, specificPaddock.swisscow, specificPaddock, item);
UpdateStatOnAnimalAddEvent(onePercent);
break;
}
所以,是的,代码按预期工作,但我对混乱不满意,我想了解规划这个逻辑的其他方法,特别是规划我的下一场比赛。谢谢你的阅读。你可以认为动物是一个物体。让我们进入面向对象的世界
using System;
using System.Collections.Generic;
using UnityEngine;
public class Example : MonoBehaviour
{
private void Start()
{
Item item = new Item("Albino Goat");
SaveManager saveMgr = new SaveManager(new List<Animal>() { new Animal("Albino Goat") });
Paddock specificPaddock = new Paddock();
Animal animal = saveMgr.Remove(item.Name);
specificPaddock.Add(animal);
//UpdateStatOnAnimalAddEvent(onePercent);
}
private class SaveManager
{
private List<Animal> animals = null;
public SaveManager(List<Animal> animals)
{
this.animals = animals ?? throw new ArgumentNullException(nameof(animals));
}
public Animal Remove(string animalName)
{
Predicate<Animal> match = (x) => x.Name.Equals(animalName);
if (animals.Exists(match))
{
return animals.Find(match);
}
return null;
}
}
private struct Item
{
public string Name { get; private set; }
public Item(string name)
{
Name = name ?? throw new ArgumentNullException(nameof(name));
}
}
private class Animal
{
public string Name { get; private set; }
public Animal(string name)
{
Name = name ?? throw new ArgumentNullException(nameof(name));
}
}
private class Paddock
{
private List<Animal> animals = null;
public Paddock()
{
animals = new List<Animal>();
}
public void Add(Animal animal)
{
animals.Add(animal);
Debug.LogFormat("Animal count in Paddock : {0}", animals.Count);
}
}
}
使用系统;
使用System.Collections.Generic;
使用UnityEngine;
公共课示例:单一行为
{
私有void Start()
{
项目=新项目(“白化山羊”);
SaveManager saveMgr=new SaveManager(new List(){new Animal(“白化山羊”)});
Paddock specific Paddock=新Paddock();
Animal=saveMgr.Remove(item.Name);
特殊围场。添加(动物);
//UpdateStatOnAnimalAddEvent(百分之一);
}
私有类存储管理器
{
私有列表动物=null;
公共存储管理器(列出动物)
{
this.anists=anists??抛出新的异常(nameof(anists));
}
公共动物移除(字符串animalName)
{
谓词匹配=(x)=>x.Name.Equals(animalName);
如果(动物存在(匹配))
{
返回动物。查找(匹配);
}
返回null;
}
}
私有结构项
{
公共字符串名称{get;private set;}
公共项(字符串名称)
{
Name=Name??抛出新ArgumentNullException(nameof(Name));
}
}
私家动物
{
公共字符串名称{get;private set;}
公共动物(字符串名称)
{
Name=Name??抛出新ArgumentNullException(nameof(Name));
}
}
私家围场
{
私有列表动物=null;
公共围场()
{
动物=新列表();
}
公共空间添加(动物)
{
动物。添加(动物);
LogFormat(“围场中的动物计数:{0}”,animals.count);
}
}
}
我以临时工的身份写每一门私人课
就拿我从这段代码中思考与每个对象的关系来说吧
不需要将所有动物保存为int
代码将正常工作,因此只需复制和粘贴,并尝试查看编辑器中发生了什么。如果要使用字典,则可以使用以下内容替换整个switch语句
saveMgr.myStats[item.itemName] -= 1;
specificPaddock[item.itemName] += 1;
PaddockAddEvent(item.itemName, specificPaddock[item.itemName], specificPaddock, item);
UpdateStatOnAnimalAddEvent(onePercent);
<>为了进一步的安全,还考虑创建一个EnUM AnimalType,并将字典转换成<代码>,并将其作为类对象来看待。你是在正确的轨道上,想跟随干,又名不要重复自己-祝你好运 您好,谢谢您的回复和词典建议。我知道它们是多么有用。我确实为我的项目考虑了字典,但不选择,因为我认为我会对我的保存数据进行序列化/反序列化。请注意,如果您遇到过与本机选项有关的问题。您好,谢谢您的答复和努力,在一起整理一个代码示例。我可以看出这种思考和组织方式对我的问题是多么有益。不幸的是,我不能把它放在我当前的项目中告诉你它是否有效,因为我目前的设置中有很多相互关联的东西。我将按照您提供的方式进行设置-其中有一些新概念,因此我将尝试学习和理解代码,并更好地理解OOP。@MelissaK感谢您的回复。我知道很难接受它。但这样做是值得的。请不要忘记考虑我的答案。嗯,代码>项目>名称>代码是从哪里来的?我有我的动物的脚本对象。项引用的是可编写脚本的对象。在可编写脚本的对象中,有项目名称、描述、精灵、,等等。在这种情况下,为什么不同时使用一个简单的int
项。inPaddock
和项。inStats
或类似项,因此它会自动与scriptable对象一起序列化。我现在不序列化我的scriptable对象-它们几乎只用于从以下几个地方提取信息:滚动用户界面商店。另外,不确定这是否重要,但我有将近二十个围场,所以我需要做item.inPaddock1
,item.inPaddock2
,等等,并使它们成为我的脚本对象的一部分?脚本对象与Inspector、scenes、,为了提供完整的解决方案,我们需要一个完整的代码示例