private void CreateActiveUnitAttackCells() { Example1Unit myActiveUnit = (Example1Unit)_activeUnit; int range = myActiveUnit.attackRange; for (int y = myActiveUnit.y - range; y <= myActiveUnit.y + range; y++) { if (y < 0 || y > _map.mapHeight - 1) { continue; } for (int x = myActiveUnit.x - range; x <= myActiveUnit.x + range; x++) { if (x < 0 || x > _map.mapWidth - 1) { continue; } int dist = SrpgGameUtils.CalcSimpleDistance(x, y, myActiveUnit.x, myActiveUnit.y); if (dist > range) { continue; } Example1Cell cell = (Example1Cell)_map.InstantiateCellIntoLayer(_cellLayer, cellPrefab, x, y); cell.SetStateToAttackable(); _activeUnitCells.Add(cell); } } }
public override void AI_RunActiveUnit() { Example1Unit myActiveUnit = (Example1Unit)_activeUnit; if (myActiveUnit.State == Example1Unit.CustomState.ReadyToMove) { int minDist = int.MaxValue; _targetUnit = null; foreach (SrpgUnit unit in _playerUnits) { int dist = SrpgGameUtils.CalcSimpleDistance(myActiveUnit, unit); if (dist < minDist) { minDist = dist; _targetUnit = (Example1Unit)unit; } } if (minDist == 1) { myActiveUnit.SetState(Example1Unit.CustomState.ReadyToAttack); ClearActiveUnitCells(); CreateActiveUnitAttackCells(); } else { minDist = int.MaxValue; SrpgCell targetCell = null; foreach (SrpgCell cell in _activeUnitCells) { int dist1 = SrpgGameUtils.CalcSimpleDistance(cell.x, cell.y, _activeUnit.x, _activeUnit.y); int dist2 = SrpgGameUtils.CalcSimpleDistance(cell.x, cell.y, _targetUnit.x, _targetUnit.y); int distSum = dist1 + dist2; if (distSum < minDist) { minDist = distSum; targetCell = cell; } } MoveActiveUnit(targetCell); } } else if (myActiveUnit.State == Example1Unit.CustomState.ReadyToAttack) { int dist = SrpgGameUtils.CalcSimpleDistance(myActiveUnit, _targetUnit); if (dist <= myActiveUnit.attackRange) { Attack(myActiveUnit, _targetUnit); } else { myActiveUnit.SetState(Example1Unit.CustomState.End); ClearActiveUnit(); } } }
private void CreateActiveUnitMoveCells() { Example1Unit myActiveUnit = (Example1Unit)_activeUnit; int range = myActiveUnit.moveRange; for (int y = myActiveUnit.y - range; y <= myActiveUnit.y + range; y++) { if (y < 0 || y > _map.mapHeight - 1) { continue; } for (int x = myActiveUnit.x - range; x <= myActiveUnit.x + range; x++) { if (x < 0 || x > _map.mapWidth - 1) { continue; } if (SrpgGameUtils.CalcSimpleDistance(x, y, myActiveUnit.x, myActiveUnit.y) > range) { continue; } List <SrpgAStarNode> closedNodes = null; if (!MakeUnitMovePath_AStar(myActiveUnit, x, y, out closedNodes, range)) { continue; } Example1Cell cell = (Example1Cell)_map.InstantiateCellIntoLayer(_cellLayer, cellPrefab, x, y); if (myActiveUnit.player) { cell.SetStateToMovable(); } else { cell.SetEnemyStateToMovable(); } _activeUnitCells.Add(cell); } } }
protected override bool OnUnitClicked(object sender, EventArgs e) { if (!base.OnUnitClicked(sender, e)) { return(false); } Example1Unit clickedUnit = (Example1Unit)sender; if (clickedUnit == null) { Debug.LogError("unit is null"); return(false); } if (_activeUnit == null) { if (clickedUnit.player) { Debug.Assert(clickedUnit.State != Example1Unit.CustomState.ReadyToMove && clickedUnit.State != Example1Unit.CustomState.ReadyToAttack); if (clickedUnit.State == Example1Unit.CustomState.Idle) { ChangeActiveUnit(clickedUnit); clickedUnit.SetState(Example1Unit.CustomState.ReadyToMove); } } else { ChangeActiveUnit(clickedUnit); } } else if (_activeUnit == clickedUnit) { if (_activeUnitAnimating) { return(false); } if (_activeUnit.player) { if (clickedUnit.State == Example1Unit.CustomState.ReadyToMove) { clickedUnit.SetState(Example1Unit.CustomState.ReadyToAttack); ClearActiveUnitCells(); CreateActiveUnitAttackCells(); } else if (clickedUnit.State == Example1Unit.CustomState.ReadyToAttack) { clickedUnit.SetState(Example1Unit.CustomState.End); ClearActiveUnit(); } } } else // myActiveUnit != null { if (_activeUnitAnimating) { return(false); } if (_activeUnit.player) { Example1Unit myActiveUnit = (Example1Unit)_activeUnit; if (myActiveUnit.State == Example1Unit.CustomState.ReadyToMove) { if (clickedUnit.player) { clickedUnit.SetState(Example1Unit.CustomState.ReadyToMove); } myActiveUnit.SetState(Example1Unit.CustomState.Idle); ChangeActiveUnit(clickedUnit); } else if (myActiveUnit.State == Example1Unit.CustomState.ReadyToAttack) { if (!clickedUnit.player) { if (SrpgGameUtils.CalcSimpleDistance(_activeUnit, clickedUnit) <= myActiveUnit.attackRange) { Attack(myActiveUnit, clickedUnit); } } } } else { clickedUnit.SetState(Example1Unit.CustomState.ReadyToMove); ChangeActiveUnit(clickedUnit); } } return(true); }