Перейдите по списку, чтобы проверить, верно ли значение bool в ScriptableObject. - PullRequest
0 голосов
/ 04 апреля 2019

У меня есть персонаж Scriptable Object 'Character', и у него есть Bool IsMale.У меня также есть Scriptable объект 'Team', и у него есть список персонажей из класса объектов Scriptable.Теперь я хочу создать в Team Class собственный метод для циклического прохождения по этому списку и проверки, сколько символов мужского пола, а сколько нет.

Character.cs

 using UnityEngine;

 // Personal Attributes
 public string firstName;
 public string middleName;
 public string lastName;
 public string fullName;

 public bool isMale;

Team.cs

 using UnityEngine;

 public List<Character> characters;

 // For adding ten players.
 public void AddPlayer(Character p1, p2, p3, p4, p5, p6, p7, p8, p9, p10)
 {
 characters.Add(p1);
 characters.Add(p2);
 characters.Add(p3);
 characters.Add(p4);
 characters.Add(p5);
 characters.Add(p6);
 characters.Add(p7);
 characters.Add(p8);
 characters.Add(p9);
 characters.Add(p10);
 }
 // I want to loop through these ten characters in the list and tell how many are males and how many are not

Опять же, я хочу создать в Team Class собственный метод для циклического прохождения по этому списку и проверки, сколько символов - мужское, а сколько - нет.

Длявопросы в комментариях @derHugo Character.cs

using UnityEngine;
using System;

[CreateAssetMenu()]
public class Character : ScriptableObject
{
    // Personal Attributes
    public string firstName;
    public string middleName;
    public string lastName;
    public string fullName;

    public bool isMale;

    private int age;
    public int personalMoney;

    public Sprite image;

    // Game Attributes
    public int totalRuns;
    public int salary;

    public enum characterTypes { PlayerCharacter, Manager, Player, Staff };
    public characterTypes characterType;
    public enum battingHands { LeftHanded, RightHanded };
    public battingHands battingHand;
    public enum bowlingHands { LeftHanded, RightHanded };
    public bowlingHands bowlingHand;
    public enum battingMentalities { Aggressive, Balanced, Defensive };
    public battingMentalities battingMentality;
    public enum bowlingMentalities { Aggressive, Balanced, Defensive };
    public bowlingMentalities bowlingMentality;

    // Skills
    // Technical Skills
    public int technical; // Overall Technical
    public int judgement; // Batting
    public int agility; // Running, Low means if player accidentaly falls down, the time he will take to get back up
    public int cardioFitness; // Injury
    public int muscleFitness; // Injury and Hitting Power
    public int runSpeed; // Running
    public int strength; // Hitting Power

    // Methods
    // Personal Attributes Methods
    public void CalculateAge(DateTime dateOfBirth)
    {
        age = 0;
        age = DateTime.Now.Year - dateOfBirth.Year;
        if (DateTime.Now.DayOfYear < dateOfBirth.DayOfYear)
            age = age - 1;
    }

    // Starting Game Methods Required
    public void SetCharacterType(characterTypes cT)
    {
        Debug.Log("Setting Character Type for " + fullName);

        cT = characterType;

        if (cT == characterTypes.PlayerCharacter)
        {
            Debug.Log(fullName + " is a Player Character");
        }
        else if (cT == characterTypes.Manager)
        {
            Debug.Log(fullName + " is a Manager");
        }
        else if (cT == characterTypes.Player)
        {
            Debug.Log(fullName + " is a Player");
        }
        else if (cT == characterTypes.Staff)
        {
            Debug.Log(fullName + " is a Staff");
        }
        else
        {
            Debug.Log("No Character Type");
        }
    }
    public void TechnicalAverage()
    {
        technical = (judgement + agility + cardioFitness + muscleFitness + runSpeed + strength / 600) * 100;
    }
}

1 Ответ

1 голос
/ 04 апреля 2019

Вы можете, например, использовать 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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...