Мой сценарий, который использует raycast для нанесения урона с течением времени, заставляет Unity создавать sh. Кто-нибудь знает почему? - PullRequest
0 голосов
/ 03 мая 2020

Я создал скрипт, который со временем наносит игроку урон от игрока из лучевой трансляции, но он делает Unity cra sh, как только я попал в нужную зону, чтобы противник мог двигаться и наносить урон. Кто-нибудь знает почему?

using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;

 public class EnemyMove : MonoBehaviour
 {
     public Transform target;
     public Transform player;
     public float enemySpeed;
     public int moveTrigger = 1;
     public bool isAttacking;
     public int AttackTirgger;

     public float distanceFromPlayer;

     void Update()
     {
         distanceFromPlayer = Vector3.Distance(target.transform.position, player.transform.position);

         if (distanceFromPlayer <= 10 && moveTrigger == 1)
         {
             transform.LookAt(target);
             if (!isAttacking)
                 StartCoroutine(EnemyDamage());
         }
         if (distanceFromPlayer < 10 && moveTrigger == 1 && distanceFromPlayer > 3)
         {
             transform.Translate(Vector3.forward * enemySpeed * Time.deltaTime);
         }
     }

     IEnumerator EnemyDamage()
     {
         isAttacking = true;
         while (distanceFromPlayer <= 10)
         { // in range
             RaycastHit PlayerHit;
             if (Physics.Raycast(target.transform.position, target.transform.forward, out PlayerHit))
             {
                 Target target = PlayerHit.transform.GetComponent<Target>();
                 if (target != null)
                 {
                     GlobalHealth.playerHealth -= 1;
                     yield return new WaitForSeconds(2);
                 }
             }
         }
         isAttacking = false; // out of range
         yield return null;
     }
 }

1 Ответ

1 голос
/ 03 мая 2020

Если я попытаюсь объяснить, что делает ваш код (в псевдокоде):

if(distance_to_target < 10)
{
 lookAt(taget)
 move_forward() //so you get closer from the target
 while(distance < 10)
 {
  do_stuff() //the stuff doesn't change distance
 }
}

Когда ваше расстояние стало меньше 10, и из-за вашего transform.Translate() оно останется <10 навсегда, поэтому здесь у вас есть время (правда) → делает единство кр sh</p>

...