C# 计算所有现有公民的更好方法?
我已经开始制作一个简单的城市建设者游戏,本着宙斯/波塞冬的精神,但要简单得多。我已经准备好网格系统,并且能够添加房屋和道路。昨天,我开始用一种简单的方式添加公民,也就是说,无论何时创建一座房子,都会创建5个人,并直接从地图的一个边缘移动到特定的房子。一旦他们到达了那所特殊的房子,我就认为他们成为了公民,并把他们添加到房子的居民名单中,也加入到城市居民名单中。 因此,每个house实例都有一个人员列表,而我的包含游戏所有信息的Game类也有一个人员列表 要简化它,请如下所示: Game.csC# 计算所有现有公民的更好方法?,c#,unity3d,C#,Unity3d,我已经开始制作一个简单的城市建设者游戏,本着宙斯/波塞冬的精神,但要简单得多。我已经准备好网格系统,并且能够添加房屋和道路。昨天,我开始用一种简单的方式添加公民,也就是说,无论何时创建一座房子,都会创建5个人,并直接从地图的一个边缘移动到特定的房子。一旦他们到达了那所特殊的房子,我就认为他们成为了公民,并把他们添加到房子的居民名单中,也加入到城市居民名单中。 因此,每个house实例都有一个人员列表,而我的包含游戏所有信息的Game类也有一个人员列表 要简化它,请如下所示: Game.cs pu
public class Game {
private static Game instance; // this is a singleton
private int currentAmount; //this is the value I'm using to display the number of citizens on screen
private List<Human> humen;
public List<Human> Humen
{
get { return humen; }
set
{
humen = value;
currentAmount = humen != null ? humen.Count : 0;
}
}
public void AddHuman(Human human)
{
humen.Add(human);
currentAmount = humen.Count;
}
/// <summary>
/// Private constructor to ensure it's only called when we want it
/// </summary>
private Game()
{
humen = new List<Human>();
}
public static void setGame(Game game)
{
instance = game;
}
/// <summary>
/// Returns the instance, creates it first if it does not exist
/// </summary>
/// <returns></returns>
public static Game getInstance() {
if (instance == null)
instance = new Game();
return instance;
}
}
public class House : Building {
public static int CAPACITY = 5;
private List<Human> habitants;
public List<Human> Habitants
{
get { return habitants; }
set { habitants = value; }
}
public House() {
habitants = new List<Human>();
}
}
public class HumanEntity : MonoBehaviour {
private Human human;
private float speed;
public Human Human
{
get { return human; }
set { human = value; }
}
// Use this for initialization
void Start () {
speed = Random.Range(5.0f, 10.0f);
}
// Update is called once per frame
void Update () {
if (human != null)
{
Vector3 targetPosition = human.Target.GameObject.transform.position;
if (transform.position.Equals(targetPosition)) {
if (!human.HasAHouse)
{
human.HasAHouse = true;
Game.getInstance().AddHuman(human); // here I'm adding the human to the list of citizens
((House)human.Target).Habitants.Add(human); // here I'm adding it to the house list of habitants
}
}
else {
float step = speed * Time.deltaTime;
transform.position = Vector3.MoveTowards(transform.position, targetPosition, step);
}
}
}
}
这正如预期的那样,但我想知道,在游戏类中,除了一个全局列表之外,还有一个人类列表是否有点过火,如果有一种更优雅的方式来实现这一点,那么在游戏类中,也许有一种更“团结友好”的方式,如果我可以这么说的话,因为我对团结的能力知之甚少。您对该怎么做有什么建议吗?保持这种方式可以吗?还是有一种更优雅的方式?快速而适当的方式来知道有多少人会在HumanEntity类上有一个静态计数器:
public class HumanEntity : MonoBehaviour
{
public static int HousedHuman { get; private set; }
public static int HumanCount { get; private set; }
void Awake() { HumanCount++; }
void OnDestroy()
{
HumanCount--;
if(human.HasAHouse == true){ HousedHuman--; }
}
public static void ResetCounter() { HouseHuman = HumanCount = 0; }
void Update () {
if (human != null)
{
Vector3 targetPosition = human.Target.GameObject.transform.position;
if (transform.position.Equals(targetPosition)) {
if (!human.HasAHouse)
{
HouseHuman++; // Added
human.HasAHouse = true;
// Rest of code
}
}
// Rest of code
}
}
}
添加新实例时,计数器增加;销毁实例时,计数器减少
您可以通过HumanEntity.HumanCount访问。您将无法在HumanEntity类之外的其他地方设置它
确保在开始/离开场景时重置计数器
编辑:根据评论,我为HousedHuman添加了第二个静态计数器。当实体到达房屋时,该值增加。当实体被销毁时,如果实体被封装,则该值会降低。它还可以在需要时与整个计数器一起重置。快速而适当的方法来了解在HumanEntity类上有多少人将拥有一个静态计数器:
public class HumanEntity : MonoBehaviour
{
public static int HousedHuman { get; private set; }
public static int HumanCount { get; private set; }
void Awake() { HumanCount++; }
void OnDestroy()
{
HumanCount--;
if(human.HasAHouse == true){ HousedHuman--; }
}
public static void ResetCounter() { HouseHuman = HumanCount = 0; }
void Update () {
if (human != null)
{
Vector3 targetPosition = human.Target.GameObject.transform.position;
if (transform.position.Equals(targetPosition)) {
if (!human.HasAHouse)
{
HouseHuman++; // Added
human.HasAHouse = true;
// Rest of code
}
}
// Rest of code
}
}
}
添加新实例时,计数器增加;销毁实例时,计数器减少
您可以通过HumanEntity.HumanCount访问。您将无法在HumanEntity类之外的其他地方设置它
确保在开始/离开场景时重置计数器
编辑:根据评论,我为HousedHuman添加了第二个静态计数器。当实体到达房屋时,该值增加。当实体被销毁时,如果实体被封装,则该值会降低。它还可以在需要时与整个计数器一起重置。基于埃弗茨的想法 游戏: 众议院:
public class House : Building {
public static int CAPACITY = 5;
private List<Human> habitants;
public List<Human> Habitants
{
get { return habitants; }
set { habitants = value; }
}
public House() {
habitants = new List<Human>();
}
public void AddHuman(Human human)
{
human.HasAHouse = true;
habitants.Add(human);
Game.currentAmount++;
}
}
如果需要检查房屋容量,可以将AddHuman方法更改为bool返回类型,在内部执行容量检查,并返回是否已成功添加
您还可以添加一个RemoveHuman方法,该方法将通过Game.currentAmount--对人进行倒计时
至于游戏中的列表,它实际上取决于上下文。如果需要这种行为,游戏类中的列表可以用于区分流浪者和居住者。(游戏列表中的流浪人类,居住在居住列表中)基于埃弗茨的想法 游戏: 众议院:
public class House : Building {
public static int CAPACITY = 5;
private List<Human> habitants;
public List<Human> Habitants
{
get { return habitants; }
set { habitants = value; }
}
public House() {
habitants = new List<Human>();
}
public void AddHuman(Human human)
{
human.HasAHouse = true;
habitants.Add(human);
Game.currentAmount++;
}
}
如果需要检查房屋容量,可以将AddHuman方法更改为bool返回类型,在内部执行容量检查,并返回是否已成功添加
您还可以添加一个RemoveHuman方法,该方法将通过Game.currentAmount--对人进行倒计时
至于游戏中的列表,它实际上取决于上下文。如果需要这种行为,游戏类中的列表可以用于区分流浪者和居住者。(游戏列表中的流浪者,居住在居住列表中)计数应该代表房屋内外的人数,还是仅仅代表房屋内的人数?编辑:如果所有人都是人类,埃弗特的答案是正确的。两者都是,但只有在他们到达房屋后,他们才被分配到至少一次(换句话说,如果他们没有房屋,他们就不被视为公民,因为我计划稍后添加移除房屋的可能性)这个数字应该代表房屋内外的人数,还是仅仅代表房屋内的人数?编辑:如果所有人都是,埃弗特的答案是正确的。两者都是,但只有在他们到达房子后,他们才被分配到至少一次(换句话说,如果他们没有房子,他们就不被视为公民,因为稍后我计划添加移除房子的可能性)谢谢,看起来很棒!唯一的问题是,我不想在它们被创建后立即将它们添加到总计数中,但只有当它们到达分配给它们的房子时,才可以这样调整它吗?我编辑了,所以有一个HouseHuman计数器。当更新定义的人离建筑足够近时,它会增加。对于小的改进,我会检查距离检查,以便有一些误差,因为计算机中的浮点值不精确。另外,您可以每秒运行一次检查,而不是使用InvokeRepeating来运行每个帧。谢谢,我没有想过要这样做,它工作得很好:)谢谢您提供的提示,我也将尝试实现它。谢谢,看起来很棒!唯一的问题是,我不想在它们被创建后立即将它们添加到总计数中,但只有当它们到达分配给它们的房子时,才可以这样调整它吗?我编辑了,所以有一个HouseHuman计数器。当更新定义的人离建筑足够近时,它会增加。对于小的改进,我会检查距离检查,以便有一些误差,因为计算机中的浮点值不精确。另外,您可以每秒运行一次检查,而不是使用InvokeRepeating来运行每一帧。谢谢,我没有想过要这样做,这非常有效:)谢谢