示例#1
0
        public void AddToScene(Transform team1, Transform team2)
        {
            for (var x = 0; x < Attacker.Units.Length; x++)
            {
                var battleUnit = Attacker.Units[x];
                if (battleUnit == null)
                {
                    continue;
                }
                var clientUnit = new ClientUnit(battleUnit.UnitReference);
                clientUnit.AddToScene();
                clientUnit.GetGameObject().transform.SetParent(team1.GetChild(x).transform);
                clientUnit.GetGameObject().transform.localPosition = Vector3.zero;
                clientUnit.GetGameObject().GetComponent <SpriteRenderer>().flipX = true;
                Attacker.Units[x].UnitReference = clientUnit;
            }

            for (var x = 0; x < Defender.Units.Length; x++)
            {
                var battleUnit = Defender.Units[x];
                if (battleUnit == null)
                {
                    continue;
                }
                var clientUnit = new ClientUnit(battleUnit.UnitReference);
                var unitObj    = clientUnit.AddToScene();
                unitObj.transform.SetParent(team2.GetChild(x).transform);
                unitObj.transform.localPosition = Vector3.zero;
                unitObj.GetComponent <SpriteRenderer>().flipX = false;
                Defender.Units[x].UnitReference = clientUnit;
            }
        }
    public void WaitForAction()
    {
        ActingUnit = Battle.CurrentActingUnit.UnitReference as ClientUnit;
        ActingUnit.Sprites.PlayAnimation(Sprite3D.WALK, true, 100, ActionDelaySeconds);
        var obj = ActingUnit.GetGameObject();

        _originalPos = obj.transform.position;
        obj.transform.DOLocalMove(new Vector3(ReadyDistanceMoved, 0, 0), ActionDelaySeconds);
        NextAction = DateTime.Now + TimeSpan.FromSeconds(ActionDelaySeconds);
        Log.Debug($"[Battle] {ActingUnit} waiting for action to handle it in {GetNextActionDelaySeconds()} seconds");
    }
    public TimeSpan DrawBattleAction(BattleAction action)
    {
        Log.Debug($"[Battle] Handling {action} for {ActingUnit}");
        if (action is AttackAction)
        {
            var attackAction = (AttackAction)action;
            var result       = (AttackActionResult)action.Result;
            var attackerID   = attackAction.UnitID;
            if (attackerID == ActingUnit.Id)
            {
                // Attack Animation
                ActingUnit.Sprites.PlayAnimation(Sprite3D.ATTACK, false, 100, ActionDelaySeconds);
                ActingUnit.GetGameObject().transform.DOLocalMove(new Vector3(ReadyDistanceMoved + AttackDistanceMoved, 0, 0), ActionDelaySeconds);

                // Taking Damage
                var defender             = Battle.FindUnit(attackAction.DefenderID);
                var damageAnimationDelay = ActionDelaySeconds / 2;
                Awaiter.WaitFor(TimeSpan.FromSeconds(ActionDelaySeconds / 2), () => {
                    // Swing anim
                    defender.Sprites.PlayAnimation(Sprite3D.HURT, true, 0, ActionDelaySeconds);

                    // Damage Effects
                    DrawDamage(defender, result.Damage);
                    var seq = DOTween.Sequence();
                    seq.Append(defender.GetGameObject().transform.DOMoveX(defender.GetGameObject().transform.position.x - 0.1f, damageAnimationDelay / 2));
                    seq.Append(defender.GetGameObject().transform.DOMoveX(defender.GetGameObject().transform.position.x, damageAnimationDelay / 2));
                    seq.onComplete += () => {
                        Awaiter.WaitFor(TimeSpan.FromMilliseconds(600), () =>
                        {
                            ActingUnit.GetGameObject().transform.DOMoveX(_originalPos.x, damageAnimationDelay);
                            ActingUnit.Sprites.PlayAnimation(Sprite3D.JUMP, true, 100, damageAnimationDelay);
                            WaitForAction();
                        });
                    };
                });
                return(TimeSpan.FromSeconds(10));
            }
        }
        return(TimeSpan.FromSeconds(10));
    }
    private void DrawDamage(ClientUnit unit, int damage)
    {
        DamageText.text = damage.ToString();
        var pos = Camera.main.WorldToScreenPoint(unit.GetGameObject().transform.position);

        DamageText.transform.parent.parent.position = pos;
        var hpBar = DamageText.transform.parent;

        hpBar.gameObject.SetActive(true);
        hpBar.GetComponent <HealthBar>().SetPct(80);
        DamageText.gameObject.SetActive(true);
        var seq = DOTween.Sequence();

        seq.Append(DamageText.transform.DOMoveY(DamageText.transform.position.y + 30, 0.2f));
        seq.Append(DamageText.transform.DOMoveY(DamageText.transform.position.y, 0.2f));
        seq.Append(DamageText.transform.DOMoveY(DamageText.transform.position.y - 10, 0.1f));
        seq.Append(DamageText.transform.DOMoveY(DamageText.transform.position.y, 0.1f));
        seq.onComplete += () => {
            Awaiter.WaitFor(TimeSpan.FromSeconds(0.4), () => {
                DamageText.gameObject.SetActive(false);
                hpBar.gameObject.SetActive(false);
            });
        };
    }