Как создать спавн ящиков как в Party Pani c? - PullRequest
0 голосов
/ 18 июня 2020

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

(в этом видео показано, что должно произойти) https://youtu.be/rvyn5wVLYek?t=77

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

public class Spawner : MonoBehaviour {
 [SerializeField] private GameObject _box;
 [SerializeField] [Range(0, 5)] private int _minBoxes;
 [SerializeField] [Range(1, 25)] private int _maxBoxes;
 [SerializeField] private float _spawnHeight;
 void Start() {
    var size = GetComponent<MeshFilter>().sharedMesh.bounds.size.x * transform.localScale.x;
    var boxes = Random.Range(_minBoxes, _maxBoxes + 1);
    var step = size / boxes;

    for (int i = 1; i < boxes; i++) {
        Instantiate(_box, transform.position + new Vector3(step * i - size / 2f,  _spawnHeight), Quaternion.identity);
    }
 }
}

1 Ответ

1 голос
/ 18 июня 2020

Прежде всего, добро пожаловать в stackoverflow.

Судя по тому, что я вижу в видео, вы хотите, чтобы ящик появлялся в определенной позиции x с определенным масштабом, вот код, который я придумал.

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

public class BoxSpawn : MonoBehaviour
{
    public GameObject box;
    public float minXpos, maxXpos;
    public float timeBetweenBoxes;
    void Start()
    {
        //starts the loop for spawning boxes
        StartCoroutine(SpawnBox());
    }

    IEnumerator SpawnBox()
    {
        //get a random position on the x axis
        Vector3 boxPos = new Vector3(Random.Range(minXpos, maxXpos), 0, 0);

        //spawn the box
        Instantiate(box, boxPos, Quaternion.Euler(0, 0, 0));

        //let the code wait a certain time
        yield return new WaitForSeconds(timeBetweenBoxes);

        StartCoroutine(SpawnBox());
    }
}

поместите этот скрипт на случайный игровой объект и создайте Prefab из игрового объекта коробки. Перетащите этот префаб на игровой объект / скрипт.

Создайте новый скрипт и поместите этот код в этот скрипт:

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

public class Box : MonoBehaviour
{
    private float minSize = 0.5f; //minimum size
    private float maxSize = 2; //maximum size
    private float moveSpeed = 5;
    void Start()
    {
        //changes the size of the object to random values
        transform.localScale = new Vector3(Random.Range(minSize, maxSize), Random.Range(minSize, maxSize), Random.Range(minSize, maxSize));
    }

    void Update()
    {
        //moves the box in -z axis
        transform.Translate(new Vector3(0, 0, 1) * moveSpeed * Time.deltaTime);


        //destroys gameobject after a number of seconds (OPTIONAL BUT RECOMMENDED)
        //Destroy(gameObject, 10);
    }
}

Поместите этот скрипт в созданный вами префаб и перетащите его в папку с ресурсами, чтобы сохранить префаб, укажите в нем ссылку на игровой объект Spawner, и он должен работать.

Final result

если вы хотите, чтобы ящики перемещались физически добавить к нему компонент Rigidbody

...