Сопрограммы и триггеры - PullRequest
0 голосов
/ 17 марта 2019

Моя проблема в том, что я делаю игру с единством, и что я хочу сделать, так это то, что когда враг в моей игре сталкивается с препятствием, он наносит x урона каждую секунду.

Есть коллайдери сценарий здоровья на «настольном» препятствии, а также коллайдер и сценарий для передвижения и нападения на врага.

Враг останавливается при столкновении с предметом стола и наносит урон!но ущерб постоянен ... Я пробовал сопрограммы и Invoke, но все результаты одинаковы;10 урона за триггерное обнаружение, а не за секунду.

Вот сценарии:

Движение врага и атака:

private Animator anim;
public GameObject Desk;
private DeskHealth deskHealth;
//private bool inQueue = false;
private bool collidingWithDesk;
public float timeAfterStart;
[Range(0,10)]
public float attackSpeedEnemy = 1f;

[Range(10,100)]
public float walkSpeed;

[SerializeField] float damageDealtToDesk = 10f;


void Start () {
    anim = GetComponent<Animator>();  
    deskHealth = GetComponent<DeskHealth>();
    collidingWithDesk = false;
}

void Update()
{
    if (collidingWithDesk == false)
    {
        enemyIsWalking();
    }
}

void enemyIsWalking()
{
    transform.Translate(0, 0, (-walkSpeed * Time.deltaTime));
}

IEnumerator enemyIsAttacking()
{
    var deskHealth = Desk.GetComponent<DeskHealth>();
    deskHealth.DealDamageToDesk(damageDealtToDesk);
    yield return new WaitForSeconds(5f);        
}

void OnTriggerStay(Collider otherCollider)
{
    if (otherCollider.tag == "Desk")
    { 
        collidingWithDesk = true;
        transform.Translate(0, 0, 0);
        anim.Play("enemyHit");
        StartCoroutine(enemyIsAttacking());
    }
}

здоровье стола:

[SerializeField] float deskHealth;
Animator anim;

public void DealDamageToDesk(float deskDamage)

{
    deskHealth -= deskDamage;
    if (deskHealth <= 0)
    {
        print("am ded");
        //anim.Play("deskDestroyed");
    }
}

1 Ответ

1 голос
/ 17 марта 2019

Для того, что говорит доктор: «OnTriggerStay вызывается один раз за обновление физики для каждого другого Коллайдера, который касается триггера». Что означает, что ваш код:

if (otherCollider.tag == "Desk")
{ 
    collidingWithDesk = true;
    transform.Translate(0, 0, 0);
    anim.Play("enemyHit");
    StartCoroutine(enemyIsAttacking());
}

будет вызываться при каждом обновлении, а затем приостанавливаться на 5 секунд из-за yield return new WaitForSeconds(5f); Вы должны использовать OnColliderEnter, или может быть лучше использовать OnTriggerEnter, потому что это будет вызвано один раз. Затем измените значение внутри вызова WaitForSeconds на 1, если вы хотите, чтобы это происходило один раз в секунду.

Также, как указано в Draco18s, ваша доходность ничего не ждет. Вы должны сделать что-то подобное:

IEnumerator enemyIsAttacking()
{
    var deskHealth = Desk.GetComponent<DeskHealth>();
    while(collidingWithDesk)
    {
        deskHealth.DealDamageToDesk(damageDealtToDesk);
        yield return new WaitForSeconds(1f);        
    }
}

void OnTriggerExit(Collider otherCollider)
{
    if (otherCollider.tag == "Desk")
    { 
        collidingWithDesk = false;
        // rest of your code
    }
}
...