Я начал делать простую игру для строителей городов в духе Зевса / Посейдона, но гораздо проще.У меня есть готовая система сетки и возможность добавлять дома и дороги.Вчера я начал просто добавлять граждан, то есть каждый раз, когда создается дом, создаются 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.Есть ли у вас какие-либо советы о том, что делать, это нормально, чтобы сохранить это так или есть более элегантный способ?