Вы можете, например, использовать Linq Count для этого (я бы лучше использовал свойства здесь, но вы могли бы сделать то же самое, используя методы конечно.):
using System.Linq;
public int Males
{
get
{
return characters != null ? characters.Count(c => c.isMale) : 0;
}
}
public int Females
{
get
{
return characters != null ? characters.Count(c => !c.isMale) : 0;
}
}
Выбудет просто использовать это значение, например,
Debug.LogFormat(this, "Males: {0}, Females: {1}", Males, Females);
Подсказка : даже если Инспектор Unity автоматически инициализирует List
и поля массива, которые вы должны всегда делать вместе с определением, например
public List<Character> characters = new List<Character>(10);
просто для того, чтобы быть уверенным, что при вызове Add
никогда не будет null
, и убедитесь, что в качестве значения по умолчанию установлено то, что вы ожидаете, что List будет иметь значение Count позже.
Или же вы можете использовать
Character[] characters = new Character[10];
, так как вы все равно не хотите, чтобы размер был динамическим.( Обратите внимание , однако, что Инспектор в Unity всегда переопределяет эти определения)
Причина, по которой это лучше: List
в фоновом режиме сохраняет значения в массиве в любом случае.Добавляя элементы с помощью Add
, он каждый раз проверяет, достаточно ли массив все еще достаточно велик, а если нет, расширяет его до двойного размера (см. здесь )
public void AddPlayer(Character p1, p2, p3, p4, p5, p6, p7, p8, p9, p10)
{
characters.Add(p1); // characters has now capacity 4
characters.Add(p2);
characters.Add(p3);
characters.Add(p4);
characters.Add(p5); // characters reallocated and has now capacity 8
characters.Add(p6);
characters.Add(p7);
characters.Add(p8);
characters.Add(p9); // characters reallocated and has now capacity 16
characters.Add(p10);
}
, поэтому вы видите, используя Add
10 или 11 раз всегда выделяет больше памяти, чем фактически необходимо.
Я бы сделал
// hide because if you do it via the method you probably don't
// want to add items via Inspector which would get overwritten later anyway
[HideInInspector] public Character[] characters = new Character[10];
public void AddPlayer(Character p1, p2, p3, p4, p5, p6, p7, p8, p9, p10)
{
characters[0] = p1;
characters[1] = p2;
characters[2] = p3;
characters[3] = p4;
characters[4] = p5;
characters[5] = p6;
characters[6] = p7;
characters[7] = p8;
characters[8] = p9;
characters[9] = p10;
}
, за исключением того, что нет большой разницы между доступом или изменением значений в массиве илиСписок.
Для установки всех значений, которые вам нужны для каждого символа, вы можете / должны использовать правильный конструктор (хотя я бы изменил название):
[Serializable]
public class Character
{
// Personal Attributes
public string firstName;
public string middleName;
public string lastName;
public string fullName;
public bool isMale;
public Character(string _firstName, string _middleName, string _lastName, bool _isMale)
{
firstName = _firstName;
middleName = _middleName;
lastName = _lastName;
fullName = string.Format("{0} {1} {2}", firstName, middleName, lastName);
isMale = _isMale;
}
}