Unity, Calling Resources.Load из другого потока - PullRequest
0 голосов
/ 06 ноября 2019

Я сделал префаб для создания экземпляров в игре.

Но потому что я хочу, чтобы он создавался "за кулисами", что означает создание всех этих нескольких копий префабов ", пока игрок что-то делаетelse ".

Поэтому я поместил код, генерирующий префаб," в другой поток ".

Но Unity сказал мне, что" Load может быть вызвана только из основного потока. "

Я пытался переместить код в сопрограмму, но, к сожалению, сопрограмма работает в "основном потоке"!

Или, может быть, я должен сказать, что они не выполняют несколько сопрограмм "параллельно и одновременно"!

Так может ли кто-нибудь быть таким добрым и научить меня, что мне делать!?

Очень признателен!

Коды: (В случае необходимости, хотя я нене думаю, что это пойдет на пользу)

void Start()
{
    Thread t = new Thread(Do);

    t.Start();
}

private void Do()
{
    for(int i=0;i<1000;i++)
    {
        GameObject RaceGO = (GameObject)(Resources.Load("Race"));

        RaceGO.transform.SetParent(Content);
    }
}

1 Ответ

1 голос
/ 06 ноября 2019

Я не могу проверить этот код atm, но, думаю, вы поняли идею.

GameObject raceGameObject;
// Start "Message" can be a coroutine
IEnumerator Start()
{
    // Load the resource "Race" asynchronously
    var request = Resources.LoadAsync<GameObject>("Race");
    while(!request.IsDone) {
        yield return request;
    }
    raceGameObject = request.asset;
    Do();
}

private void Do()
{
    // Instantiating 1000 gameobjects is nothing imo, if yes split it then, with a coroutine
    for(int i=0;i<1000;i++)
    {
        GameObject RaceGO = Instantaite(raceGameObject);
        RaceGO.transform.SetParent(Content);
    }
}

Также я не рекомендую это, вам просто нужно сделать поле public Gameobject myGameObj;, присвоить ему значениев редакторе просто сделайте это:

// Assign this inside the editor
public GameObject Race;

void Start()
{
    Do();
}

private void Do()
{
    // Instantiating 1000 gameobjects is nothing imo, if yes split it then, with a coroutine
    for(int i=0;i<1000;i++)
    {
        GameObject RaceGO = Instantaite(Race);
        RaceGO.transform.SetParent(Content);
    }
}
...