@Korsakovlev

Почему я не могу привязать к врагу родителя?

Код:
public void Spawn(int maxe) // кол-во противников максимальное
    {
        while (maxe > enemes)
        {
            float x = Random.Range(x1, x2);
            float y = Random.Range(y1, y2);
            float z = 1f; // Если игра в 2d, то z = 1f;
            GameObject gm = Instantiate(enemy1, new Vector3(x, y, z), Quaternion.identity) as GameObject;
            gm.transform.SetParent(gameObject.transform);
            enemes++;
        }
        enemes = 0;
    }

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

Setting the parent of a transform which resides in a Prefab Asset is disabled to prevent data corruption (GameObject: 'Enemes1_0(Clone)').
UnityEngine.Transform:SetParent (UnityEngine.Transform)
EnemesSpawn:Spawn (int) (at Assets/Scripts/Objects/EnemesSpawn.cs:24)

Если я запускаю спавн врагов на самом 1 уровне, все норм, на 2 выдает выше описанное, не могу понять почему.
Может проблема в том, что у меня Enemyspawn - ребенок DontDestroyOnLoad, но другого вариант не удалять объекты я найти не смог.
  • Вопрос задан
  • 97 просмотров
Пригласить эксперта
Ответы на вопрос 2
freeExec
@freeExec
Участник OpenStreetMap
Там же по-английски написано, нельзя переносить объект в префаб, это его сломает.
Т.е. виноват не сам код, а то что ты его запускаешь на префабе.
Ответ написан
@Dafeds
Согласен с freeExec. Создай на сцене пустышку и повешай туда скрипт. И если тебе надо сохранить расположение врагов при переходе на другой уровень(сцену), лучше используй MoveGameObjectToScene().
Этот скрипт на пустышку.
[SerializeField] private int m_maxEnemies;
    [SerializeField] private GameObject m_Enemy;

    private void Start()
    {
        SpawnEnemies(m_maxEnemies);    
    }
    private void SpawnEnemies(int max)
    {
        for (int enemy = 0; enemy < max; enemy++)
        {
            float x = Random.Range(-8, 8);
            float y = Random.Range(-5, 5);
            float z = 1f;
            GameObject childObject = Instantiate(m_Enemy, new Vector3(x,y,z),Quaternion.identity);
            childObject.transform.SetParent(gameObject.transform);
        }
    }


Этот можешь на камеру закинуть. И метод SwapScenes() вызывать по какому-либо триггеру/событию.
[SerializeField] private GameObject m_Spawner;
[SerializeField] private string m_sceneName;

public void SwapScenes()
    {
        StartCoroutine(LoadYourAsyncScene());
    }
    IEnumerator LoadYourAsyncScene()
    {
        Scene currentScene = SceneManager.GetActiveScene();
        AsyncOperation asyncLoad = SceneManager.LoadSceneAsync(m_sceneName, LoadSceneMode.Additive);
        while (!asyncLoad.isDone)
        {
            yield return null;
        }
        SceneManager.MoveGameObjectToScene(m_Spawner, SceneManager.GetSceneByName(m_sceneName));
        SceneManager.UnloadSceneAsync(currentScene);
    }

P.S. Лучше имя сцены прописать в скрипте, чтобы в инспекторе не допустить ошибки.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы