Exemple #1
0
    IEnumerator Damage_Coroutine(Example1Unit attackUnit, Example1Unit damageUnit)
    {
        float damage = attackUnit.offence * UnityEngine.Random.Range(0.8f, 1.2f) -
                       damageUnit.defence * UnityEngine.Random.Range(0.3f, 0.5f);

        damageUnit.GetDamage((int)damage);

        yield return(new WaitForSeconds(_unitMoveTime / _unitMoveFrame * 2f));

        if (damageUnit.hp > 0)
        {
            damageUnit.BeginIdleAnimation();
        }
        else
        {
            if (damageUnit.player)
            {
                _playerUnits.Remove(damageUnit);
            }
            else
            {
                _enemyUnits.Remove(damageUnit);
            }
            Destroy(damageUnit.gameObject);
        }
    }
Exemple #2
0
    public override bool InitUnits()
    {
        GameObject   playerUnitObj = Instantiate(unitPrefab, _unitLayer.transform);
        Example1Unit playerUnit    = playerUnitObj.GetComponent <Example1Unit>();

        playerUnit.Init(playerUnitSprite, playerUnitAnimCtrl);
        AddUnit(playerUnit, 7, 5, 0.9f, true);

        playerUnitObj = Instantiate(unitPrefab, _unitLayer.transform);
        playerUnit    = playerUnitObj.GetComponent <Example1Unit>();
        playerUnit.Init(playerUnitSprite, playerUnitAnimCtrl);
        AddUnit(playerUnit, 13, 5, 0.9f, true);

        GameObject   enemyUnitObj = Instantiate(unitPrefab, _unitLayer.transform);
        Example1Unit enemyUnit    = enemyUnitObj.GetComponent <Example1Unit>();

        enemyUnit.Init(enemyUnitSprite, enemyUnitAnimCtrl);
        AddUnit(enemyUnit, 7, 15, 0.9f, false);

        enemyUnitObj = Instantiate(unitPrefab, _unitLayer.transform);
        enemyUnit    = enemyUnitObj.GetComponent <Example1Unit>();
        enemyUnit.Init(enemyUnitSprite, enemyUnitAnimCtrl);
        AddUnit(enemyUnit, 13, 15, 0.9f, false);

        return(true);
    }
Exemple #3
0
    IEnumerator Attack_Coroutine(Example1Unit attackUnit, Example1Unit damageUnit)
    {
        _activeUnitAnimating = true;

        Vector3 attackVec        = damageUnit.transform.position - attackUnit.transform.position;
        Vector3 attackDir        = attackVec.normalized;
        float   attackMaxDist    = attackVec.magnitude / 2.0f;
        Vector3 attackUnitOrigin = attackUnit.transform.position;

        int   halfFrame     = _unitMoveFrame / 2;
        float eachFrameTime = _unitMoveTime / _unitMoveFrame;

        for (int framei = 0; framei < _unitMoveFrame; framei++)
        {
            float ratio = (halfFrame - Math.Abs(halfFrame - framei)) / (float)halfFrame;
            if (ratio == 1.0f)
            {
                StartCoroutine(Damage_Coroutine(attackUnit, damageUnit));
            }
            float attackDist = attackMaxDist * ratio;
            attackUnit.transform.position = attackUnitOrigin + attackDir * attackDist;
            yield return(new WaitForSeconds(eachFrameTime));
        }

        if ((attackUnit.transform.position - attackUnitOrigin).magnitude > 0.0f)
        {
            attackUnit.transform.position = attackUnitOrigin;
        }

        _activeUnitAnimating = false;

        attackUnit.SetState(Example1Unit.CustomState.End);
        ClearActiveUnit();
    }
Exemple #4
0
    public override void OnActiveUnitMoveEnd()
    {
        Example1Unit myActiveUnit = (Example1Unit)_activeUnit;

        myActiveUnit.SetState(Example1Unit.CustomState.ReadyToAttack);
        CreateActiveUnitAttackCells();
    }
Exemple #5
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);
            }
        }
    }
Exemple #6
0
    protected override bool OnTileClicked(object sender, EventArgs e)
    {
        if (!base.OnTileClicked(sender, e))
        {
            return(false);
        }

        if (_activeUnit == null || _activeUnitAnimating)
        {
            return(false);
        }

        Example1Unit myActiveUnit = (Example1Unit)_activeUnit;

        if (_activeUnit.player)
        {
            if (myActiveUnit.State == Example1Unit.CustomState.ReadyToMove)
            {
                myActiveUnit.SetState(Example1Unit.CustomState.Idle);
                ClearActiveUnit();
            }
        }
        else
        {
            ClearActiveUnit();
        }

        return(true);
    }
Exemple #7
0
    protected override bool OnCellClicked(object sender, EventArgs e)
    {
        if (!base.OnCellClicked(sender, e))
        {
            return(false);
        }

        if (_activeUnit == null || !_activeUnit.player || _activeUnitAnimating)
        {
            return(false);
        }

        Example1Cell cell = (Example1Cell)sender;

        if (cell == null)
        {
            Debug.LogError("cell is null");
            return(false);
        }

        Example1Unit myActiveUnit = (Example1Unit)_activeUnit;

        if (myActiveUnit.State == Example1Unit.CustomState.ReadyToMove)
        {
            MoveActiveUnit(cell);
        }

        return(true);
    }
Exemple #8
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();
            }
        }
    }
Exemple #9
0
 public override void AI_ChooseEnemyUnit()
 {
     foreach (SrpgUnit unit in _enemyUnits)
     {
         if (!unit.IsEnd())
         {
             Example1Unit myUnit = (Example1Unit)unit;
             myUnit.SetState(Example1Unit.CustomState.ReadyToMove);
             ChangeActiveUnit(myUnit);
             break;
         }
     }
 }
Exemple #10
0
    public override bool MakeUnitMovePath(SrpgUnit unit, int destX, int destY, out List <SrpgNode> path)
    {
        path = new List <SrpgNode>();

        Example1Unit         myUnit      = (Example1Unit)unit;
        List <SrpgAStarNode> closedNodes = null;

        if (!MakeUnitMovePath_AStar(myUnit, destX, destY, out closedNodes, myUnit.GetMaximumRange()))
        {
            return(false);
        }

        path = closedNodes.Cast <SrpgNode>().ToList();

        return(true);
    }
Exemple #11
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);
            }
        }
    }
Exemple #12
0
 private void Attack(Example1Unit attackUnit, Example1Unit damageUnit)
 {
     StartCoroutine(Attack_Coroutine(attackUnit, damageUnit));
 }
Exemple #13
0
 private void ChangeActiveUnit(Example1Unit newUnit)
 {
     _activeUnit = newUnit;
     ClearActiveUnitCells();
     CreateActiveUnitMoveCells();
 }
Exemple #14
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);
    }