Как сделать мои клонированные игровые объекты глобальными, чтобы я мог использовать их вне функции в Unity? - PullRequest
0 голосов
/ 28 декабря 2018

Я только недавно вошел в Unity 3D и сейчас работаю над одним из моих первых собственных проектов.Для игры, которую я создаю, мне нужна функция spawner, которая порождает клона противника, как только противник падает с платформы.Вот код, который у меня сейчас есть:

using UnityEngine;

public class spawner : MonoBehaviour
{
    public GameObject enemyPrefab;
    public float spawnHeight = 0.75f;

    // Start is called before the first frame update
    void Start()
    {
        spawnEnemy();
    }

    // Update is called once per frame
    void Update()
    {
        if (enemyClone.transform.position.y < -10)
        {
            Destroy(enemyClone);
            spawnEnemy();
        }
    }

    public void spawnEnemy()
    {
        var enemyPosition = new Vector3(Random.Range(-5, 5), spawnHeight, Random.Range(-5, 5));
        var enemyClone = Instantiate(enemyPrefab, enemyPosition, Quaternion.identity);
    }
}

Функция spawnEnemy сама по себе работает нормально, так как она создает врага в начале игры, но дальнейшие враги не появляются.Я получаю сообщение: «Assets \ spawner.cs (21,21): ошибка CS0103: имя« врагаClone »не существует в текущем контексте».

Я понимаю, почему я получаю сообщение, донОднако не знаю, как сделать врага Clone глобально доступным.

Спасибо всем заранее,

Безунил

Ответы [ 2 ]

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

Нерест GameObject по требованию стоит дорого.Вместо того, чтобы вызывать его каждый раз, вы должны объединить GameObject.

public class Spawner : MonoBehaviour {
    public Enemy enemyPrefab;
    public List<Enemy> enemyPool;
    public const SPAWN_HEIGHT = 0.75f;

    // Start is called before the first frame update
    void Start()
    {
        enemyPool = new List<Enemy>();
        spawnEnemy();
    }

    // Update is called once per frame
    public void Despawn(Enemy deadEnemy)
    {
        deadEnemy.gameObject.SetActive(false);
        enemyPool.Add(deadEnemy);
    }

    public void spawnEnemy() {
        Enemy newEnemy;
        if (enemyPool.Count > 0) {
            newEnemy = enemyPool[0];
            enemyPool.Remove(0);
        } else {
            newEnemy = Instantiate(enemyPrefab);
        }
        newEnemy.Init(this);

        newEnemy.position =  new Vector3(Random.Range(-5, 5), SPAWN_HEIGHT, Random.Range(-5, 5));
        newEnemy.gameObject.SetActive(true);
    }
}

public class Enemy : MonoBehaviour {
    private Spawner spawner;
    private const float DEATH_POSITION_Y = -10;

    public void Init(Spawner spawner) {
        this.spawner = spawner;
    }

    void Update() {
        if (transform.position.y < DEATH_POSITION_Y) {
            spawner.Despawn(this);
        }
    }
}
0 голосов
/ 28 декабря 2018

В функции spawnEnemy() вы говорите var enemyClone = Instantiate(...);.враговый клон - это локальная переменная, которую можно использовать только внутри функции spawnEnemy, или, по крайней мере, так вы ее написали.

Если вы хотите использовать вражеский клон вне функции spawnEnemy, вынеобходимо объявить переменную врагиСлоун вне функции.(Пример ниже будет работать, если вы не хотите, чтобы врага-клон был доступен другим GameObjects)

using UnityEngine;

public class spawner : MonoBehaviour
{
    public GameObject enemyPrefab;
    public float spawnHeight = 0.75f;

    private GameObject enemyClone //Added to allow enemyClone to be used anywhere in the class

    // Start is called before the first frame update
    void Start()
    {
        spawnEnemy();
    }

    // Update is called once per frame
    void Update()
    {
        if (enemyClone.transform.position.y < -10)
        {
            Destroy(enemyClone);
            spawnEnemy();
        }
    }

    public void spawnEnemy()
    {
        var enemyPosition = new Vector3(Random.Range(-5, 5), spawnHeight, Random.Range(-5, 5));
        enemyClone = Instantiate(enemyPrefab, enemyPosition, Quaternion.identity);
    }
}

Теперь, если вы хотите, чтобы врага-клон был доступен другим GameObjects, вам нужно сделать enemyClone переменная public вместо private.Если вы не хотите, чтобы он отображался в инспекторе, добавьте [HideInInspector] над объявлением врага-клона, как показано ниже:

[HideInInspector]
public GameObject enemyClone;

Ваша проблема основана на scope.Возможно, вы захотите исследовать это, важно знать.

Область действия переменной определяет ее видимость для остальной части программы.

http://www.blackwasp.co.uk/CSharpVariableScopes.aspx http://www.informit.com/articles/article.aspx?p=1609145&seqNum=4

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