コード例 #1
0
    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);
            }
        }
    }
コード例 #2
0
    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();
            }
        }
    }
コード例 #3
0
    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);
            }
        }
    }
コード例 #4
0
    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);
    }