Предмет выпадает после вражеской смерти - PullRequest
0 голосов
/ 14 декабря 2018

Вот пересмотренный код, который почти полностью функционирует.Я прокомментировал, где находятся последние пару ошибок.По сути, randNum вызывается каждый кадр, потому что этот код находится внутри функции обновления.Когда враг умирает, значение HP равно 0, и мне, возможно, нужно перезагрузить вражеский HP до значения, превышающего 0. Однако это лучший подход?Потому что это может изменить мои другие враги Hp?

Вторая проблема: когда враг умирает, все остальные враги этого типа порождают предмет.Как мне починить его там, где он появляется только у умершего врага?Я думаю, потому что моя переменная Epos захватила компоненты всех врагов, это проблема.Я думаю, что мне нужен лучший подход?

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


public class ItemDrop : MonoBehaviour
{
  [SerializeField]
  private GameObject[] itemList; // Stores the game items
  private int itemNum; // Selects a number to choose from the itemList
  private int randNum; // chooses a random number to see if loot os dropped- Loot chance
  private Transform Epos; // enemy position


private void Start()
{

    Epos = GetComponent<Transform>();
    Debug.Log(itemList);
}
private void Update()
{
    if(EnemyDMG.enemyHP <= 0)
    {



        // This number get's called non-stop after enemy dies
        // This causes non-stop item drops
        // I need to know the logic to make this code happen only once per kill
            randNum = Random.Range(0, 101); // 100% total for determining loot chance;
            Debug.Log("Random Number is " + randNum);

        // The code below runs now and instantiates objects
        // However, all of the similar enemies that are alive drop items
         // at their location. I need to know how to make an item drop
        // only at the lace the enemy was killed
        if(randNum >= 95) // Star Tablet drop itemList[2] currently
        {

            itemNum = 2;// grabs the star tab
            Instantiate(itemList[itemNum], Epos.position, Quaternion.identity);


        }
        else if(randNum > 75 && randNum < 95) // Extra life drop itemList[1] currently
        {

            itemNum = 1;// grabs the star tab
            Instantiate(itemList[itemNum], Epos.position, Quaternion.identity);

        }
        else if(randNum > 40 && randNum <= 75)// Health Heart drop itemList[0] currently
        {

            itemNum = 0;// grabs the star tab
            Instantiate(itemList[itemNum], Epos.position, Quaternion.identity);

        }
    }
  }


 }

1 Ответ

0 голосов
/ 15 декабря 2018

Таким образом, чтобы заставить код работать, мне пришлось удалить код изнутри Update ().Затем я создал функцию и вставил в нее свой код DropItem ().Затем мне пришлось полностью удалить враг HP <= 0 из кода.</p>

Следующим шагом было войти в мой сценарий EnemyDamage, создать новую переменную private ItemDrop getItem, и, наконец, внутри OnCollisionEnter2D () я добавил быструю проверку ItemDrop после смерти врага.Исходный код ниже.

Окончательный законченный и рабочий код:

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


 public class ItemDrop : MonoBehaviour
 {
 [SerializeField]
private GameObject[] itemList; // Stores the game items
private int itemNum; // Selects a number to choose from the itemList
private int randNum; // chooses a random number to see if loot os dropped- Loot chance
private Transform Epos; // enemy position


private void Start()
{
   // itemList = CamFollow.itemListPass;
    Epos = GetComponent<Transform>();
    Debug.Log(itemList);
}

public void DropItem()
{



        randNum = Random.Range(0, 101); // 100% total for determining loot chance;
        Debug.Log("Random Number is " + randNum);


        if (randNum >= 95) // Star Tablet drop itemList[2] currently
        {
            itemNum = 2;// grabs the star tab
            Instantiate(itemList[itemNum], Epos.position, Quaternion.identity);


        }
        else if (randNum > 75 && randNum < 95) // Extra life drop itemList[1] currently
        {

            itemNum = 1;// grabs the star tab
            Instantiate(itemList[itemNum], Epos.position, Quaternion.identity);

        }
        else if (randNum > 40 && randNum <= 75)// Health Heart drop itemList[0] currently
        {

            itemNum = 0;// grabs the star tab
            Instantiate(itemList[itemNum], Epos.position, Quaternion.identity);

        }


}// End of drop item

}

*********************************** Теперь в моем скрипте EnemyDMG: (НИЖЕ) ************************************

 public class EnemyDMG : MonoBehaviour
{
  private int enemyHP;
  private ItemDrop getItem;

private void Start()
{
    enemyHP = Random.Range(50, 200);
    getItem = GetComponent<ItemDrop>();


       }

      // Below this code is inside of a simple OnCollisionEnter2D() function
     // The enemy damage is calculated inside of this same function
     // so I decided not to add any source code not directly relevant to my question
        if(enemyHP <= 0)
        {
            if (getItem != null)
            {
                getItem.DropItem();
                Debug.Log("Dropped an Item " + getItem);
            }
            Destroy(gameObject);

        }
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...