Почему список преобразований внутри класса удаляется, когда экземпляр класса копируется в список? - PullRequest
1 голос
/ 24 марта 2020

У меня есть проблема в Unity (или, может быть, C#), которая очень странная для меня. Вот виртуальный класс:

public abstract class ActionTaken : MonoBehaviour {
    protected char type;
    protected Transform minionTakingAction;
    public abstract void activate();
}

И этот виртуальный класс является родителем того, который меня интересует:

public class AbilityTaken : ActionTaken
{
    public int index;
    List<Transform> selectedFriendlyMinions;
    List<Transform> selectedEnemyMinions;
    List<Transform> selectedTiles;
    public override void activate()
    {
        //The value here is 0 !!! And it should be 1...
        Debug.Log(selectedEnemyMinions.Count);
        if (selectedFriendlyMinions.Count == 0 && selectedEnemyMinions.Count == 0 && selectedTiles.Count == 0 )
        {
            minionTakingAction.GetComponentInParent<AbilitiesActivation>().activateAbility(index);
        }
        else
        {
            minionTakingAction.GetComponentInParent<AbilitiesActivation>().activateAbility(index, selectedFriendlyMinions, selectedEnemyMinions, selectedTiles);
        }
    }

    public AbilityTaken(Transform _minionTakingAction, int abilityIndex, List<Transform> _selectedFriendlyMinions, List<Transform> _selectedEnemyMinions, List<Transform> _selectedTiles) 
    {
        type = 'S'; 
        minionTakingAction = _minionTakingAction;
        index = abilityIndex;
        selectedEnemyMinions = _selectedEnemyMinions;
        selectedFriendlyMinions = _selectedFriendlyMinions;
        selectedTiles = _selectedTiles;
        //The value here is 1 !!!
        Debug.Log(selectedEnemyMinions.Count);
    }
    public AbilityTaken(Transform _minionTakingAction, int abilityIndex)
    {
        type = 'S';
        minionTakingAction = _minionTakingAction;
        index = abilityIndex;
        selectedFriendlyMinions = new List<Transform>();
        selectedEnemyMinions = new List<Transform>();
        selectedTiles = new List<Transform>();
    }
}

Как видно в комментариях, значение selectedEnemyMinions список Transforms меняет конструктор (значение счетчика: 1) на функцию «activ ()» (значение счетчика: 0), без каких-либо изменений. Все, что я делаю, это: 1. Я создаю новый экземпляр AbilityTaken, дающий конструктору список врага MinionSelection с 1 элементом. 2. Я добавляю в список возможность. 3. Я вызываю activ () из LateUpdate ()

AbilityTaken abilityTaken = new AbilityTaken(minionTakingAction, gameMaster.abilitySelected,
                       // value of enemyMinionSelected.Count here is 1
 new List<Transform>(), gameMaster.enemyMinionsSelected, new List<Transform>());
List<ActionsTaken> actionsTaken = new List<ActionTaken>();
actionsTaken.Add(abilityTaken);

private void LateUpdate()
{
    if (!actionInProgress &&
        actionsTaken.Count>0)
    {
        ActionTaken currentAction = actionsTaken[0];
        currentAction.activate();
    }
}
*. 1009 * Если вы можете сказать мне, почему добавление экземпляра класса в список и доступ к этому экземпляру приведет к тому, что член списка преобразований изменит свое значение, это было бы здорово. С другой стороны, значение переменной-члена "index" не изменяется (оно всегда равно 1). Я попытался изменить списки на publi c, но это не помогло, как ожидалось.

Ответы [ 2 ]

1 голос
/ 24 марта 2020

Если вы можете сказать мне, почему добавление экземпляра класса в List и доступ к этому экземпляру приведет к тому, что член списка преобразований изменит свое значение, это было бы здорово.

Это не так , В этом нет ничего плохого, это не изменит текущие значения AbilityTaken.

Есть что-то еще, то есть проблема в другом. Например, Debug.Log(selectedEnemyMinions); не печатает Count .

0 голосов
/ 24 марта 2020

Я тщательно отладил свой код и обнаружил, что проблема в том, что я даю конструктору параметры ActionTaken (а именно List), которые меняются после назначения в конструкторе ActionTaken. Затем я выполняю некоторый код, который изменяет первый список преобразований, но из-за того, что C# не копирует значение, а ссылается на присвоенное значение, список преобразований изменяется при изменении первого назначенного значения.

void function()
{
//Some code here
      AbilityTaken abilityTaken = new AbilityTaken(minionTakingAction, gameMaster.abilitySelected, new List<Transform>(), gameMaster.enemyMinionsSelected, new List<Transform>())
//Here we go in the constructor and everything seems fine
// ! Some code here that changes gameMaster.enemyMinionsSelected. The class object doesn't copy the List of Transforms, but references it's address and when it changes, the reference in ActionTaken also changes.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...