Лучший способ сосчитать всех существующих граждан? - PullRequest
0 голосов
/ 30 сентября 2018

Я начал делать простую игру для строителей городов в духе Зевса / Посейдона, но гораздо проще.У меня есть готовая система сетки и возможность добавлять дома и дороги.Вчера я начал просто добавлять граждан, то есть каждый раз, когда создается дом, создаются 5 человек, и они перемещаются непосредственно от одного края карты к этому конкретному дому.Как только они доберутся до этого конкретного дома, я считаю, что они стали гражданами, и добавлю их в список жителей дома, а также в список жителей города.

Для этого каждый экземпляр дома имеетList of Human и мой класс Game, который содержит всю информацию об игре, также имеют один List of human.

Для упрощения это выглядит так:

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;
    }
}

House.cs

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>();
    }
}

HumanEntity.cs

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);
            }
        }
    }
}

И это работаеткак и ожидалось, но мне интересно, если бы один список людей по домам в дополнение к глобальному списку в игровом классе не был немного излишним, и был ли, возможно, более элегантный способ добиться этого в классе Game,может быть, что-то более «дружественное к Unity», если можно так сказать, поскольку я не очень много знаю о возможностях Unity.Есть ли у вас какие-либо советы о том, что делать, это нормально, чтобы сохранить это так или есть более элегантный способ?

Ответы [ 2 ]

0 голосов
/ 30 сентября 2018

Опираясь на идею Эверта ...

Игра:

public class Game {
    private static Game instance; // this is a singleton
    public static int currentAmount { get; set; }

    //rest of class
}

Дом:

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++;
    }
}

UpdateLoop:

// 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)
                ((House)human.Target).AddHuman(human);
        }
        else {
            float step = speed * Time.deltaTime;
            transform.position = Vector3.MoveTowards(transform.position, targetPosition, step);
        }
    }
}

ЕслиДля проверки емкости дома необходимо изменить метод AddHuman на тип возврата bool, выполнить проверку емкости внутри и узнать, был ли он успешно добавлен.

Вы также можете добавить метод RemoveHuman, который будет подсчитывать количество людей.вниз через Game.currentAmount -;

Что касается списка в Game, он действительно зависит от контекста.Список в вашем игровом классе может быть полезен для проведения различий между блуждающими людьми и людьми, которые находятся в доме, если это необходимо.(Блуждающие люди в списке игр, размещенные в списке домов)

0 голосов
/ 30 сентября 2018

Быстрый и подходящий способ узнать, сколько человек будет иметь статический счетчик для класса 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.Это увеличивается, когда сущность достигает дома.Оно уменьшается, когда объект уничтожается, если объект был размещен.Он также сбрасывается при необходимости вместе с общим счетчиком.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...