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

Я пытаюсь создать игру для удара по мячу в формате бейсбола.Я создаю шар в качестве сборного.Я хочу перенести мяч на главную сцену в течение определенного периода времени.

Например;когда первый шар находится на сцене, второй шар появится через 5-6 секунд, затем третий, четвертый и т. д. Я начинающий уровень Unity, и я не очень хорош в C #.Я не уверен, использую ли я настоящие функции, такие как Instantiate.Вот мой сценарий:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Ball : MonoBehaviour {
    public float RotateSpeed = 45; //The ball rotates around its own axis
    public float BallSpeed = 0.2f; 

    public GameObject[] prefab;

    public Rigidbody2D rb2D;

    void Start() {
        rb2D = GetComponent<Rigidbody2D>(); //Get component attached to gameobject
        Spawn ();
    }

    void FixedUpdate() {
        rb2D.MoveRotation(rb2D.rotation + RotateSpeed * Time.fixedDeltaTime); //The ball rotates around its own axis
        rb2D.AddForce(Vector2.left * BallSpeed);
        InvokeRepeating("Spawn", 2.0f, 2.0f);

    }

    public void Spawn () 
    {
        int prefab_num = Random.Range(0,3);
        Instantiate(prefab[prefab_num]);
    }

}

После применения этого сценария результат не тот, который я хочу.

enter image description here

Ответы [ 4 ]

0 голосов
/ 05 июня 2018

Я обновил свой сценарий, учитывая ваши отзывы, и он работает как шарм.Спасибо всем!

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.Threading;

public class Ball : MonoBehaviour {
    public float RotateSpeed = 45; //The ball rotates around its own axis
    public float BallSpeed = 0.2f; 

    public GameObject BaseBall;
    public Transform BallLocation;

    public Rigidbody2D Ball2D;

    void Start() {
        Ball2D = GetComponent<Rigidbody2D>(); //Get component attached to gameobject
        InvokeRepeating("Spawn", 5.0f, 150f);
    }       

    void FixedUpdate() {
        Ball2D.MoveRotation(Ball2D.rotation + RotateSpeed * Time.fixedDeltaTime); //The ball rotates around its own axis
        Ball2D.AddForce(Vector2.left * BallSpeed);
    }

    public void Spawn () 
    {
        Instantiate (BaseBall, BallLocation.position, BallLocation.rotation);
    }
}
0 голосов
/ 29 мая 2018

Использование Сопрограммы

private IEnumerator SpawnBall() {
    while(true) {
        Instantiate(baseball);
        yield return new WaitForSeconds(5);
    }
}

Которые затем можно запустить с StartCoroutine() и завершить одним из трех способов:

  • внутренне, отключивцикла while с break (функция не будет иметь больше строк для выполнения и выхода)
  • внутренне через yield break
  • извне, вызывая StopCoroutine() по ссылке насопрограмма
0 голосов
/ 29 мая 2018

Альтернатива другим ответам: просто используйте обратный отсчет.Это иногда дает вам больше контроля

// Set your offset here (in seconds)
float timeoutDuration = 2;

float timeout = 2;

void Update()
{
    if(timeout > 0)
    {
        // Reduces the timeout by the time passed since the last frame
        timeout -= Time.deltaTime;

        // return to not execute any code after that
        return;
    }

    // this is reached when timeout gets <= 0

    // Spawn object once
    Spawn();

    // Reset timer
    timeout = timeoutDuration;
}
0 голосов
/ 28 мая 2018

Добавьте InvokeRepeating("Spawn", 2.0f, 2.0f); к Start, а не к FixedUpdate.InvokeRepeating вызывает метод methodName во временных секундах, затем многократно каждые repeatRate секунд.Вы можете проверить документацию здесь .

...