- Home /
[Turn-based] button OnClick() event to ends unit action
Hi,
I am trying to create a turn-based strategy game, and I have attached EndUnitAction() method on a "Wait" button which will end the unit's turn and select the next available unit.
However, when I clicked the "Wait" button when selecting the first unit (Player1), it will loop through the Units array and ends all my units action immediately instead of selecting the next unit (which should be Player2).
QS) Is there anyway for me to assign the method to a controller and get the Player's name or ID into EndUnitAction(), something like sender object? Or is there a better way to do this?
//Unit Class
public void EndUnitAction() {
if (!isActiveAndEnabled)
return;
// Player 2 & 3 gets affected when player 1 ends turn
hasMoved = true;
hasAttacked = true;
GameManager.instance.SwitchPlayer();
}
// Game Manager class (overloaded method called by EndUnitAction)
public void SwitchPlayer() {
// If is enemyTurn, disallow switching to player units.
if (enemyTurn)
return;
for (int i = 0; i < units.Length; i++) {
if (units[i].isHostile == false)
{
if (units[i].hasMoved == false || units[i].hasAttacked == false) {
nextUnit = units[i];
SwitchPlayer(nextUnit);
break;
}
}
}
}
/// <summary>
/// Switch to a player by providing the Unit instance
/// </summary>
public void SwitchPlayer(Unit newUnit) {
// If is enemyTurn, disallow switching to player units.
if (enemyTurn)
return;
DisableAllPlayers();
unit = newUnit;
unit.tileX = (int)newUnit.transform.position.x;
unit.tileY = (int)newUnit.transform.position.y;
TileMap.instance.mapUnit = unit;
CameraManager.instance.SelectCharacter(unit);
RefreshCharacterInfo();
spotlight.transform.position = unit.transform.position;
GameManager.instance.spotlight.enabled = true;
unit.enabled = true;
}
By default it should not be able to end a unit's turn when it is disabled, but since I am looping the SwitchPlayer() function which will enable the new unit, Player2 and Player3 action ended immediately as well, so I am suspecting that the onClick events actually triggers "Player1.Unit.EndUnitAction" > "Player2.Unit.EndUnitAction" > "Player3.Unit.EndAction" in sequence.
Thanks in advance for any advise.