Как я могу создать игровые объекты в Unity (C#) вместе с целым числом? - PullRequest
0 голосов
/ 03 апреля 2020

Я пытаюсь получить очки здоровья для созданных врагов моей игры. Сначала враги были просто уничтожены, как только их поразил один выстрел.

Я думал, что добавление нового класса, просто держащего HP экземпляра префаба, будет работать, но я не знаю, как написать это правильно , Либо это «stati c», а затем я знаю, как вызвать его из класса контроллера пули, но он не создан, и для всех созданных врагов сохраняется то же значение int, либо это не «stati c», а затем Я не знаю, как вызвать его из других классов.

Вот код, который используется в данный момент для контроллера пули:

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

public class BulletController : MonoBehaviour
{
    private Transform bullet;
    public float speed;
    // Start is called before the first frame update
    void Start()
    {
        bullet = GetComponent<Transform>();
    }
    void FixedUpdate()
    {
        bullet.position += transform.up * speed;
        if (bullet.position.y >= 10)
            Destroy(gameObject);
    }
    void OnTriggerEnter2D(Collider2D other)
    {
        if (other.tag == "Enemy")
        {
            Enemy4HP.health--;
            Destroy(gameObject);
            if (Enemy4HP.health < 1)
            {
                Destroy(other.gameObject);
                PlayerScore.playerScore++;
            }
        }
        if (other.tag == "Enemy2")
        {
            Enemy10HP.health--;
            Destroy(gameObject);
            if (Enemy10HP.health <1)
            {
                Destroy(other.gameObject);
                PlayerScore.playerScore++;
            }
        }

    }
}

и для двух классов здоровья:

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

public class Enemy4HP : MonoBehaviour
{
    public int health = 4;
    // Start is called before the first frame update
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {

    }
}

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

public class Enemy10HP : MonoBehaviour
{
    public int health = 10;
    // Start is called before the first frame update
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {

    }
}

И вот как создаются экземпляры врагов:

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

public class EnemyController : MonoBehaviour
{
    private Transform enemyHolder;
    public float speed;
    public GameObject shot;
    public GameObject enemy;
    public GameObject enemy2;
    public Text winText;
    int secCount;
    float timer = 0;
    public float fireRate = 0.997f;
    public int enemyCount;
    // Start is called before the first frame update
    void Start()
    {
        enemyCount = 0;
        secCount = 0;
        enemyHolder = GetComponent<Transform>();
        winText.enabled = false;
        InvokeRepeating("MoveEnemy", 0f, 0.016f);
    }
    private List<GameObject> allSpawns = new List<GameObject>();

    void MoveEnemy()
    {
        float xPosition = Random.Range(-11f, 11f);
        int enemyType = Random.Range(0, 8);
        secCount = Random.Range(2, 4);
        timer += Time.deltaTime;
        if (timer >= secCount && enemyCount < 25)
        {
            if (enemyType > 0)
            {
                GameObject spawned = Instantiate(enemy, new Vector3(xPosition, 6, 0), Quaternion.identity);
                allSpawns.Add(spawned);
            }
            else
            {
                GameObject spawned = Instantiate(enemy2, new Vector3(xPosition, 6, 0), Quaternion.identity);
                allSpawns.Add(spawned);
            }
            enemyCount++;
            timer = timer - secCount;
        }
        foreach (GameObject thisEnemy in allSpawns)
        {
            if (thisEnemy !=null)
            {
                thisEnemy.transform.position += new Vector3(0, -1 * speed * Time.deltaTime, 0);
            }
        }
        if (PlayerScore.playerScore == 25)
        {
            timer = 0;
            CancelInvoke();
            InvokeRepeating("MoveEnemy2", 0f, 0.016f);
        }
    }
 ...

Возвращает «Ссылка на объект требуется для поля non_stati c ...». Что я могу сделать? Спасибо.

1 Ответ

1 голос
/ 03 апреля 2020

Самый простой и быстрый. Вместо 2 классов с 2 разными числами сделайте 1 с названием EnemyHP. Добавьте компонент в префабы противника и на префабе в инспекторе установите для здоровья компонента значение 4 для противника 1 и 10 для противника 2. Затем:

void OnTriggerEnter2D(Collider2D other)
{
    //you can probably just make both enemy the same tag.
    if (other.tag == "Enemy" || other.tag == "Enemy2")
    {
        //get the Hp component of the specific enemy.
        EnemyHP hpComponent = other.gameObject.GetComponent<EnemyHP>();
        hpComponent.health--;
        Destroy(gameObject);
        if (hpComponent.health < 1)
        {
            Destroy(other.gameObject);
            PlayerScore.playerScore++;
        }
    }

}
...