Как изменить свойства GameObject в скриптах Unity? - PullRequest
0 голосов
/ 16 января 2019

Я пытаюсь сохранить / загрузить мою игру.В методе load каждый раз, когда я изменяю свойства GameObject, эти изменения применяются, а затем вскоре возвращаются обратно.Вот мой код:

public void Load()
{
    SceneManager.LoadScene(sceneID);
    List<GameObject> rootObjects = new List<GameObject>();
    Scene scene = SceneManager.GetActiveScene();
    scene.GetRootGameObjects(rootObjects);

    int ncube = 0, npick = 0;
    for (int i = 0; i < rootObjects.Count; ++i)
    {
        GameObject obj = rootObjects[i];
        if (obj.CompareTag("Player"))
        {                                
            obj.transform.position = player.position;
            obj.transform.rotation = player.rotation;
            obj.transform.localScale = player.localScale;
        }
        else if (obj.CompareTag("Cube"))
        {
            obj.transform.position = cube[ncube].position;
            obj.transform.rotation = cube[ncube].rotation;
            obj.transform.localScale = cube[ncube].localScale;
            ++ncube;
        }
        else if (obj.CompareTag("Pickup"))
            obj.SetActive(pickup[npick++]);
        else if (obj.CompareTag("Door"))
            obj.SetActive(door);
        else if (obj.CompareTag("GreenWall"))
            obj.SetActive(greenWall);
    }
}

Эти изменения применяются к GameObject, однако они сразу прерываются.Как я могу решить эту проблему?

Скрипт, содержащий эти строки кода, не является компонентом GameObject.

Редактировать 1: Полный код обновлен.

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Проблема в том, что я думаю

Scene scene = SceneManager.GetActiveScene();
scene.GetRootGameObjects(rootObjects);

получает объекты со сцены до полной загрузки сцены, поэтому они сбрасываются.

Из Документа

При использовании SceneManager.LoadScene загрузка не происходит сразу, она завершается в следующем кадре. Такое полусинхронное поведение может вызвать заикание кадра и может привести к путанице, поскольку загрузка не завершается немедленно.


Полагаю, вам лучше использовать SceneManager.sceneLoaded и делать там что-то вроде

public void Load()
{
    SceneManager.LoadScene(sceneID);
}

И, возможно, в дополнительном компоненте сцены:

void OnEnable()
{
    SceneManager.sceneLoaded += OnSceneLoaded;
}

void OnSceneLoaded(Scene scene, LoadSceneMode mode)
{
    // your stuff here
}

void OnDisable()
{
    SceneManager.sceneLoaded -= OnSceneLoaded;
}

хотя мы не знаем / не видим откуда player, cube[ncube] и т. Д. ...

для переноса значений между сценами, вы должны использовать ScriptableObjects

0 голосов
/ 16 января 2019

Возможно, проблема в том, что SceneManager.LoadScene завершается в следующем кадре . Смотрите документацию: https://docs.unity3d.com/ScriptReference/SceneManagement.SceneManager.LoadScene.html

Там написано:

При использовании SceneManager.LoadScene загрузка не происходит немедленно, это завершается в следующем кадре. Это полуасинхронный поведение может вызвать заикание кадра и может привести к путанице, потому что нагрузка не завершается немедленно.

Вы изменяете значения в пределах одного кадра, поэтому они перезаписываются при завершении загрузки сцены. Ко мог использовать событие, чтобы предотвратить такое поведение: https://docs.unity3d.com/ScriptReference/SceneManagement.SceneManager-sceneLoaded.html

...