1

解決方法を完全には理解できないこの小さな問題に遭遇しました。コードを何度も変更しようとしましたが、どこにも行きませんでした:(

私はプログラムでゲームオブジェクトを作成していますが、これは正常に動作しますが、問題は、ゲームがフレームごとに 1 回オブジェクトを作成することです (私が望むものではありません)。そのため、10 秒の時間遅延を設定しましたが、正しく動作していないようです。

public Vector3 spawnLocation;
public GameObject myCube;

// Use this for initialization
void Start () {

    if (myCube.renderer.enabled == false) {
        Debug.Log("myCube not rendered");
        myCube = GameObject.CreatePrimitive(PrimitiveType.Cube);
    }
    if (myCube == null) {
        Debug.Log("myCube not set");
        myCube = GameObject.CreatePrimitive(PrimitiveType.Cube);
    }
}

// Update is called once per frame
void Update () {
    StartCoroutine(Delay());
    Destroy(myCube, 5);
    CreateCube();
}

void CreateCube() {

    spawnLocation = new Vector3(24, 17, -28);
    StartCoroutine(Delay());
    Instantiate(myCube, spawnLocation, Quaternion.identity);
}

IEnumerator Delay(){
    yield return new WaitForSeconds(10);
}

オブジェクトはフレームごとに無限に表示されます -_-

誰かが私を正しい方向に向けるのを手伝ってくれませんか。そして、これを達成するためのより良い方法はありますか?

4

2 に答える 2

3

10 秒の時間遅延を設定しましたが、正しく動作していないようです。

遅延は機能しますが、まだ Update 内でキューブをインスタンス化しています。10 秒ごとに Cube をインスタンス化する場合は、次のようにします。

IEnumerator DelayCreateCube(float delay){

    while(true)
    {
      yield return new WaitForSeconds(10);
      Instantiate(myCube, spawnLocation, Quaternion.identity);
    }

}

public void Start()
{
  StartCoroutine(DelayCreateCube());
}

Updateコルーチンは、すべてのメソッドGameObjectsが呼び出された直後に、すべてのフレームでエンジンによって実行されます (まあ、コルーチンによって異なります) 。

を使用するStartCoroutineと、コルーチンが後で実行されるようにスケジュールされるだけなので、Updateメソッドの実行はブロックされません。

StartCoroutine(Delay());
Destroy(myCube, 5);
CreateCube();

上記のコードでは、 Update メソッドが返された後にのみ実行されるため、実際にはandメソッドDelayの実行を遅らせていません。DestroyCreateCube

コルーチンの詳細については、この記事をご覧ください。


編集

追加の考慮事項です。何をしようとしているのか正確にはわかりませんが、常に同じ場所でプリミティブを作成および破棄したいようです。そうする正当な理由がない場合はenable/disable、新しいオブジェクトを作成する代わりに、オブジェクトを単純に破棄して、(パフォーマンスのために) 再度破棄することができます。

于 2013-05-01T20:10:59.717 に答える
1

明らかに、Update() が呼び出されるたびにキューブを作成しているという事実を他の人が指摘しています。これは、ゲーム ループごとに 1 回です。X 秒ごとなど、一定の間隔でオブジェクトを作成したい場合は、Coroutine または InvokeRepeating の使用を検討する必要があります。コルーチン ソリューションは既に対処されています。InvokeRepeatingは以下のとおりです。

void Start()
{
  InvokeRepeating("CreateCube", 1.0f, 1.0f);
}

void CreateCube()
{
    // create your cube here
}
于 2013-05-02T22:24:00.613 に答える