TimeAttack
3 participantes
Página 1 de 1
TimeAttack
Eu utilizo o IEnumerator para fazer a transição de ataque para o "time ataque" ou existe uma maneira mais eficiente de fazer isso?
Parte do Script do inimigo que estou me debatendo pra tentar arrumar:
Estou tentando usa o IEnumerator pra controlar a transação de "attack" para "timeAttack" mas quando dou play, funciona somente na primeira vez (creio eu), ele da o time certinho mas quando ele repete o processo ele não respeita o 1.5 segundos que determinei no IEnumerator.
simplificando: quero dar um tempo do "timeAttack" para o "attack".
Parte do Script do inimigo que estou me debatendo pra tentar arrumar:
- Spoiler:
- Código:
using UnityEngine;
using System.Collections;
public enum ENEMY_STATES{
WALK,
ATTACK,
TIME_ATTACK,
DIE
}
public class EnemyBehaviour : LifeBase {
public Animator enemyAnimator;
public Rigidbody2D enemyRigid;
public float speed;
private Vector3 positionRightEnemy;
private Vector3 positionLeftEnemy;
private bool lookToRightEnemy = true;
public float attackDamage;
public float distanceToAttack;
public bool timeAttackTrue;
private ENEMY_STATES currentState;
private TutoBehaviour player;
void Start () {
base.Start ();
ChangeState (ENEMY_STATES.WALK);
player = FindObjectOfType (typeof(TutoBehaviour)) as TutoBehaviour;
positionRightEnemy = enemyAnimator.transform.localScale;
positionLeftEnemy = positionRightEnemy;
positionLeftEnemy.x *= -1;
}
// Update is called once per frame
void Update () {
base.Update ();
if(enemyRigid.velocity.x > 0)
{
lookToRightEnemy = true;
}
if(enemyRigid.velocity.x < 0)
{
lookToRightEnemy = false;
}
if(lookToRightEnemy)
{
transform.localScale = positionRightEnemy;
}
else
{
transform.localScale = positionLeftEnemy;
}
switch (currentState) {
case ENEMY_STATES.WALK:{
transform.Translate (Vector3.left * speed * Time.deltaTime);
lookToRightEnemy = false;
float currentDistanceToPlayer = Vector3.Distance (transform.position, player.transform.position);//mov
//muda de movimentação para attack
if (currentDistanceToPlayer < distanceToAttack) {
ChangeState (ENEMY_STATES.ATTACK);
enemyAnimator.SetBool ("AttackEnemy", true);//animação on
}
break;
}
case ENEMY_STATES.ATTACK:{
float currentDistanceToPlayer = Vector3.Distance (transform.position, player.transform.position);//movimentação
player.GetComponent<LifeBase>().ApplyDamage(attackDamage);
//mudar de attack para movimentação
if (currentDistanceToPlayer > distanceToAttack) {
ChangeState (ENEMY_STATES.WALK);
enemyAnimator.SetBool ("AttackEnemy", false);//animação off
enemyAnimator.SetBool ("TimeAttack", false);
} else {
if (currentDistanceToPlayer < distanceToAttack && timeAttackTrue == false) {
StartCoroutine ("TimeAttack");
}
if (timeAttackTrue == true) {
enemyAnimator.SetBool ("TimeAttack", true);
enemyAnimator.SetBool ("AttackEnemy", false);
ChangeState (ENEMY_STATES.TIME_ATTACK);
}
}
break;
}
case ENEMY_STATES.TIME_ATTACK:{
float currentDistanceToPlayer = Vector3.Distance (transform.position, player.transform.position);//movimentação
//mudar de attack para movimentação
if (currentDistanceToPlayer > distanceToAttack) {
ChangeState (ENEMY_STATES.WALK);
enemyAnimator.SetBool ("AttackEnemy", false);//animação off
enemyAnimator.SetBool ("TimeAttack", false);
}
if (currentDistanceToPlayer < distanceToAttack && timeAttackTrue == true) {
StartCoroutine ("ReturAttack");
}
if (timeAttackTrue == false) {
enemyAnimator.SetBool ("AttackEnemy", true);
enemyAnimator.SetBool ("TimeAttack", false);
ChangeState (ENEMY_STATES.ATTACK);
}
break;
}
case ENEMY_STATES.DIE:{
break;
}
}
}
IEnumerator TimeAttack () {
Debug.Log ("inicia");
yield return new WaitForSeconds (0.1f);
timeAttackTrue = true;
}
IEnumerator ReturAttack () {
Debug.Log ("volta");
yield return new WaitForSeconds (1.5f);
timeAttackTrue = false;
}
private void ChangeState (ENEMY_STATES newState){
currentState = newState;
}
protected override void OnDamage () {
}
protected override void OnDestroyIt () {
Destroy (gameObject);
}
}
Estou tentando usa o IEnumerator pra controlar a transação de "attack" para "timeAttack" mas quando dou play, funciona somente na primeira vez (creio eu), ele da o time certinho mas quando ele repete o processo ele não respeita o 1.5 segundos que determinei no IEnumerator.
simplificando: quero dar um tempo do "timeAttack" para o "attack".
Última edição por willianroma em Ter Jul 05, 2016 4:49 pm, editado 1 vez(es)
willianroma- Avançado
- PONTOS : 3194
REPUTAÇÃO : 0
Respeito as regras :
Re: TimeAttack
Tente usar Time.deltatime
JohnRambo- Moderador
- PONTOS : 5173
REPUTAÇÃO : 661
Idade : 24
Áreas de atuação : Unity;
Programação;
Música e Sonorização;
Graduado em Análise e Desenvolvimento de Sistemas;
Respeito as regras :
Re: TimeAttack
pronto, editei o codigo, ta inteiro agoraMarcosSchultz escreveu:Tem como postar o script todo para fins de teste?
willianroma- Avançado
- PONTOS : 3194
REPUTAÇÃO : 0
Respeito as regras :
Re: TimeAttack
Tem como postar o script "LifeBase" também? precisamos dele, por que este script atual herda as características do script LifeBase
Re: TimeAttack
Imaginei que ia precisar quando tava revisando o scriptMarcosSchultz escreveu:Tem como postar o script "LifeBase" também? precisamos dele, por que este script atual herda as características do script LifeBase
- Spoiler:
- Código:
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
public abstract class LifeBase : MonoBehaviour {
public Slider lifeBar;
private float currentLife;
protected void Start () {
currentLife = lifeBar.maxValue;
}
protected void Update () {
lifeBar.value = currentLife;
}
public void ApplyDamage (float damage) {
currentLife -= damage;
OnDamage ();
if (currentLife < 0.1f) {
OnDestroyIt ();
}
}
protected abstract void OnDamage ();
protected abstract void OnDestroyIt ();
}
willianroma- Avançado
- PONTOS : 3194
REPUTAÇÃO : 0
Respeito as regras :
Re: TimeAttack
kkkkkk, ainda vou precisar do script "TutoBehaviour"
Mas eu estava reparando nesta rotina:
Ela que da o tempo para a variável "timeAttackTrue" ficar verdadeira e liberar o resto das rotinas, mas o tempo dela é só 0.1
Mas eu estava reparando nesta rotina:
- Código:
IEnumerator TimeAttack () {
Debug.Log ("inicia");
yield return new WaitForSeconds (0.1f);
timeAttackTrue = true;
}
Ela que da o tempo para a variável "timeAttackTrue" ficar verdadeira e liberar o resto das rotinas, mas o tempo dela é só 0.1
Re: TimeAttack
Coloquei 0.1s pra ser o atk, assim o player só recebe 1 hit. Mas pelo que tava vendo aqui, acho que estou usando errado o "IEnumerator" ou algo assim pq ele não respeita o tempo do segundo "IEnumerator" que criei pra poder volta a atacar (ReturAttack), ele buga e o 1.5s que determinei é ignorado, algo assim.
ta bem bagunçado o codigo do "TutoBehaviour", preciso apagar algumas linhas de códigos que não estão servindo pra nada kkk
ta bem bagunçado o codigo do "TutoBehaviour", preciso apagar algumas linhas de códigos que não estão servindo pra nada kkk
- Spoiler:
- Código:
using System.Collections.Generic;
using System.Collections;
public class TutoBehaviour : MonoBehaviour {
private Rigidbody2D tutoRigid;
private Animator tutoAnimator;
public float tutoSpeedX;
public float maxTutoSpeed;
public float tutoJump;
private bool lookToRight = true;
private Vector3 positionRight;
private Vector3 positionLeft;
public Transform posicao1;
public Transform posicao2;
public bool chao;
private GameObject enemy;
//dano
public float damage;
public float distanceAttack;
public bool cooldown;
//public List<SpellsBase> magics;
//public int currentMagic;
//public float currentCooldownTime;
void Start () {
tutoRigid = GetComponent<Rigidbody2D> ();
tutoAnimator = GetComponent<Animator> ();
positionRight = tutoAnimator.transform.localScale;
positionLeft = positionRight;
positionLeft.x *= -1;
//enemy = FindObjectOfType (typeof(Enemy)) as Enemy;
cooldown = true;
}
void Update () {
Vector2 tutoDirecao = new Vector2 (Input.GetAxis ("Horizontal") * tutoSpeedX * Time.deltaTime, 0);
enemy = GameObject.FindWithTag ("Enemy");
//codigo para movimentaçao
tutoRigid.velocity = new Vector2 (tutoDirecao.x, tutoRigid.velocity.y);
if (tutoRigid.velocity.x > maxTutoSpeed) {
tutoRigid.velocity = new Vector2 (maxTutoSpeed, tutoRigid.velocity.y);
}
if (tutoRigid.velocity.x < -maxTutoSpeed) {
tutoRigid.velocity = new Vector2 (-maxTutoSpeed, tutoRigid.velocity.y);
}
//codigo para animaçao enquanto se movimenta
tutoAnimator.SetFloat ("Walk", Mathf.Abs (tutoDirecao.x));
//codigo para olhar para traz
if (tutoDirecao.x > 0) {
lookToRight = true;
}
if (tutoDirecao.x < 0) {
lookToRight = false;
}
if (lookToRight) {
transform.localScale = positionRight;
} else {
transform.localScale = positionLeft;
}
Raycast ();
Jump ();
//Attack ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//posição do inimigo
// float enemyDistance = Vector2.Distance (enemy.transform.position, transform.position);
if (cooldown == true) {
if (Input.GetKeyDown (KeyCode.K) /*&& currentCooldownTime > magics [currentMagic].cooldownTime*/) {
tutoAnimator.SetBool ("Attack", true);
StartCoroutine ("TimeAttack");
if (Vector2.Distance (transform.position, enemy.transform.position) < distanceAttack) {
if (enemy.gameObject.activeInHierarchy) {
enemy.GetComponent<LifeBase> ().ApplyDamage (damage);
}
}
} else {
tutoAnimator.SetBool ("Attack", false);
}
}
/*if (magics [currentMagic].canUseMagic) {
GameObject tempMagic = Instantiate (magics [currentMagic].gameObject, transform.position, transform.rotation) as GameObject;
tempMagic.GetComponent<SpellsBase> ().SetDirection (lookToRight);
currentCooldownTime = 0;
tutoAnimator.SetBool ("Attack", true);
} else {
tutoAnimator.SetBool ("Attack", false);
}
}
currentCooldownTime += Time.deltaTime;
*/
}
//Attack ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void Jump()
{
if(chao == true)
{
tutoAnimator.SetBool("Jump",false);
tutoAnimator.SetBool("Fall",false);
if(Input.GetButtonDown("Jump"))
{
tutoRigid.velocity = new Vector2(tutoRigid.velocity.x,tutoJump);
}
}
else
{
if(Input.GetButtonUp("Jump") && tutoRigid.velocity.y > 0)
{
tutoRigid.velocity = new Vector2 (0,tutoRigid.velocity.y/2); //Para pular conforme aperta espaço
}
if(tutoRigid.velocity.y > 0)
{
tutoAnimator.SetBool("Jump",true);
tutoAnimator.SetBool("Fall",false);
}
if(tutoRigid.velocity.y < 0)
{
tutoAnimator.SetBool("Jump",false);
tutoAnimator.SetBool("Fall",true);
}
if(tutoRigid.velocity.y == 0)
{
tutoAnimator.SetBool("Jump",false);
tutoAnimator.SetBool("Fall",false);
}
}
}
void Raycast()
{
Debug.DrawLine(posicao1.position, posicao2.position, Color.red);
if(Physics2D.Linecast(posicao1.position, posicao2.position))
{
chao = true;
}
else
{
chao = false;
}
}
void OnTriggerEnter2D(Collider2D enterDoor) {
if (enterDoor.gameObject.tag == "EnterInTheDoor") {
GameController.instance.ChangeState (GAME_STATE.NEXT);
}
}
IEnumerator TimeAttack() {
cooldown = true;
yield return new WaitForSeconds (0.1f);
cooldown = false;
yield return new WaitForSeconds (0.4f);
cooldown = true;
}
}
willianroma- Avançado
- PONTOS : 3194
REPUTAÇÃO : 0
Respeito as regras :
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos