public override IEnumerator ExecuteEffect(GameObject target, Vector3 startPosition, float characterSpeed, BaseBattleStateMachine characterStateMachine) { #pragma warning disable 0219 GameObject attackAnimEffect = null; if (animationPrefab != null) { attackAnimEffect = Instantiate(animationPrefab, target.transform, false); } #pragma warning restore 0219 yield return(new WaitForSeconds(WaitUntilFinished(characterStateMachine, target))); BaseBattleStateMachine targetStateMachine = target.GetComponent <BaseBattleStateMachine>(); if (targetStateMachine != null) { FloatingTextController.CreateFloatingText(item.value.ToString(), target.transform, textColor); item.UseItem(targetStateMachine.character); if (targetStateMachine is CharacterStateMachine) { targetStateMachine.UpdateHeroPanel(); } } #if UNITY_EDITOR Debug.Log("Used in battle"); #endif yield return(null); }
//Retorna tiempo de espera hasta finalizar el ataque protected float WaitUntilFinished(BaseBattleStateMachine characterStateMachine, GameObject target, Vector3 damagePosition) { if (animationPrefab != null) { GameObject attackAnimEffect = Instantiate(animationPrefab, target.transform, false); // Si el enemigo es muy grande (se incluye la posición del daño) la animación no aparece en el centro. if (damagePosition != Vector3.zero) { attackAnimEffect.transform.localPosition = damagePosition; attackAnimEffect.transform.localScale = attackAnimEffect.transform.localScale * 2; } if (characterStateMachine is CharacterStateMachine) { attackAnimEffect.GetComponent <SpriteRenderer>().flipX = true; } return(attackAnimEffect.GetComponent <AttackAnimation>().GetAnimationLength()); } else { return(0.5f); } }
protected IEnumerator CastMagic(GameObject target, BaseBattleStateMachine stateMachine) { if (stateMachine is CharacterStateMachine) { ((CharacterStateMachine)stateMachine).animator.SetBool("usingMagic", true); } yield return(new WaitForSeconds(WaitUntilFinished(stateMachine, target))); //Aplicar efecto stateMachine.DoDamage(true); if (stateMachine is CharacterStateMachine) { ((CharacterStateMachine)stateMachine).animator.SetBool("usingMagic", false); } }
public override IEnumerator ExecuteEffect(GameObject target, Vector3 startPosition, float characterSpeed, BaseBattleStateMachine characterStateMachine) { yield return(CastMagic(target, characterStateMachine)); characterStateMachine.character.charStats.currentMagicPoints -= attackCost; if (characterStateMachine is CharacterStateMachine) { characterStateMachine.UpdateHeroPanel(); } yield return(null); // } }
public override IEnumerator ExecuteEffect(GameObject target, Vector3 startPosition, float characterSpeed, BaseBattleStateMachine characterStateMachine) { // Si el character animator es null if (characterAnimator == null) { characterAnimator = characterStateMachine.gameObject.GetComponent <Animator>(); } if (target.GetComponent <CharacterStateMachine>() != null && characterAnimator != null && !characterAnimator.GetBool("attack")) { characterAnimator.SetBool("attack", true); // Hay que asegurarse de que el animator no está dentro de una transición while (characterAnimator.GetCurrentAnimatorClipInfo(0).Length == 0) { yield return(null); } yield return(new WaitForSeconds(WaitUntilFinished(characterAnimator))); yield return(new WaitForSeconds(WaitUntilFinished(characterStateMachine, target))); //Aplicar efecto characterStateMachine.DoDamage(); characterAnimator.SetBool("attack", false); } }
public override IEnumerator ExecuteEffect(GameObject target, Vector3 startPosition, float characterSpeed, BaseBattleStateMachine characterStateMachine) { #if UNITY_EDITOR Debug.Log("Used in battle"); #endif yield return(null); }
public virtual IEnumerator ExecuteEffect(GameObject target, Vector3 startPosition, float characterSpeed, BaseBattleStateMachine characterStateMachine) { if (characterStateMachine.character != null) { character = characterStateMachine.character; } else { character = characterStateMachine.GetComponent <Character>(); } if (target.GetComponent <CharacterStateMachine>() == null || characterStateMachine is EnemyStateMachine) { Character targetChar = target.GetComponent <Character>(); // Vector2 modifier = targetChar.minAttackerDistance; //if (characterStateMachine is EnemyStateMachine) // modifier.x = -modifier.x; // Vector3 enemyPosition = new Vector3(target.transform.position.x + modifier.x, target.transform.position.y + modifier.y, target.transform.position.z); Vector3 targetPosition = targetChar.targetAttack.transform.position; Vector3 enemyPosition = new Vector3(targetPosition.x + character.attackPositionOffset.x, targetPosition.y + character.attackPositionOffset.y, targetPosition.z); while (MoveTowardsEnemy(enemyPosition, characterStateMachine.gameObject, characterSpeed)) { yield return(null); } Vector3 damagePosition = Vector3.zero; GameObject obj = Helper.FindChildWithTag(characterStateMachine.transform, "DamagePosition"); // En el caso de tener posición donde recibir el daño se utilizará esta para mostrar la animación y el texto del daño if (obj != null) { damagePosition = obj.transform.position; } //Esperar yield return(new WaitForSeconds(WaitUntilFinished(characterStateMachine, target, damagePosition))); //Aplicar efecto characterStateMachine.DoDamage(damagePosition); //Mover a posicion inicial // Vector3 firstPosition = startPosition; while (MoveTowardsEnemy(startPosition, characterStateMachine.gameObject, characterSpeed)) { yield return(null); } } else { if (target != null && characterStateMachine is CharacterStateMachine) { yield return(new WaitForSeconds(WaitUntilFinished(characterStateMachine, target))); } else { yield return(new WaitForSeconds(0.5f)); } //Aplicar efecto characterStateMachine.DoDamage(); } }
protected float WaitUntilFinished(BaseBattleStateMachine characterStateMachine, GameObject target) { return(WaitUntilFinished(characterStateMachine, target, Vector3.zero)); }