我在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>();
}
}
您可以在注释中看到,Transforms的selectedEnemyMinions列表的值从构造函数(计数值:1)更改为“ activate()”函数(计数值:0),而我没有对其进行任何更改。我要做的就是:1.我创建一个新的AbilityTaken实例,向构造函数提供一个带有1个元素的敌人MinionSelection列表2.我将能力加入到列表中3.我从LateUpdate()
调用activate()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();
}
}
[如果您能告诉我为什么将类实例添加到List并访问该实例会导致成员Transforms列表更改其值,那太好了。另一方面,成员变量“ index”的值不变(始终为1)。我尝试将列表更改为公共列表,但这并没有达到预期的效果。
[如果您能告诉我为什么将类实例添加到List并访问该实例会导致成员Transforms列表更改其值,那会很棒。
不是。这样做没有错,它不会更改AbilityTaken的当前值。
还有其他情况,也就是说,问题出在其他地方。例如,Debug.Log(selectedEnemyMinions);
没有打印Count。
我彻底调试了代码,发现这里的问题是我给了在ActionTaken构造函数中赋值后更改的ActionTaken参数(即List)的构造函数。然后,我执行一些代码来更改第一个转换列表,但是由于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.
}