C# 计算所有现有公民的更好方法?

C# 计算所有现有公民的更好方法?,c#,unity3d,C#,Unity3d,我已经开始制作一个简单的城市建设者游戏,本着宙斯/波塞冬的精神,但要简单得多。我已经准备好网格系统,并且能够添加房屋和道路。昨天,我开始用一种简单的方式添加公民,也就是说,无论何时创建一座房子,都会创建5个人,并直接从地图的一个边缘移动到特定的房子。一旦他们到达了那所特殊的房子,我就认为他们成为了公民,并把他们添加到房子的居民名单中,也加入到城市居民名单中。 因此,每个house实例都有一个人员列表,而我的包含游戏所有信息的Game类也有一个人员列表 要简化它,请如下所示: Game.cs pu

我已经开始制作一个简单的城市建设者游戏,本着宙斯/波塞冬的精神,但要简单得多。我已经准备好网格系统,并且能够添加房屋和道路。昨天,我开始用一种简单的方式添加公民,也就是说,无论何时创建一座房子,都会创建5个人,并直接从地图的一个边缘移动到特定的房子。一旦他们到达了那所特殊的房子,我就认为他们成为了公民,并把他们添加到房子的居民名单中,也加入到城市居民名单中。 因此,每个house实例都有一个人员列表,而我的包含游戏所有信息的Game类也有一个人员列表

要简化它,请如下所示:

Game.cs

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来运行每一帧。谢谢,我没有想过要这样做,这非常有效:)谢谢