Генерирование случайным образом движущихся 2D объектов, которые имеют направление движения в зависимости от позиции появления - PullRequest
0 голосов
/ 06 февраля 2019

В настоящее время я работаю над игрой в Unity, в которой я хочу, чтобы объекты генерировались случайным образом за пределами сенсорного экрана и перемещались в соответствии с той стороной экрана, на которой они появляются (либо слева, справа, сверху илипод экраном случайно).Если они появляются слева от экрана -> они перемещаются вправо на экран, если они появляются справа, они перемещаются влево на экран, если они появляются сверху -> они перемещаются вниз на экран... Я попытался сделать это путем случайного выбора строки из массива, состоящего из 4 значений (вверх, вниз, влево, вправо), и затем с помощью оператора switch, который будет выполнять другой код в зависимости от позиции объекта.Проблема заключается в том, что код порождает объекты только из положения вниз, когда он идет вверх, а также по какой-то причине кажется, что порождает объекты в определенной позиции X, близкой к середине, большую часть времени.Кто-нибудь знает, почему это так, и как я могу решить эту проблему.

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

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

 public class BallSpawner : MonoBehaviour
 {
     public GameObject BallPrefab;
     public float respawnTime = 1.0f;
     private Vector2 screenBounds;
     private string[] edges = {"up","down","left","right"};
     static System.Random random = new System.Random();
     private float gap = 0.4f;


     // Start is called before the first frame update
     void Start()
     {
         screenBounds = Camera.main.ScreenToWorldPoint(new           
     Vector2(Screen.width, Screen.height));
         StartCoroutine(BallWave());
     }
     private void spawnBall()
     {
         GameObject a = Instantiate(BallPrefab) as GameObject;

              int r = random.Next(edges.Length);
              string edge = edges[r];
         Vector2 moveVector;


         switch (edge)
         {
             case "up":

                 moveVector =  a.transform.GetComponent<CubeConstantMove>     
            ().moveVector;
                 if (moveVector.y < 0)
                 {
                     a.transform.position = new Vector2(Random.Range(-          
            screenBounds.x, screenBounds.x), screenBounds.y + gap);
                 }
                 break;
             case "down":
                 moveVector = a.transform.GetComponent<CubeConstantMove>     
                 ().moveVector;
                 if (moveVector.y > 0)
                      {
                          a.transform.position = new      
         Vector2(Random.Range(-     screenBounds.x, screenBounds.x), - 
           screenBounds.y - gap);
            }
                 break;
             case "left":

                 moveVector = a.transform.GetComponent<CubeConstantMove>               
         ().moveVector;
                 if (moveVector.y < 0)
                 {
                     a.transform.position = new Vector2(-screenBounds.x - 
  gap, Random.Range(-screenBounds.y, screenBounds.y));
                 }
                 break;
             case "right":

                 moveVector = a.transform.GetComponent<CubeConstantMove>     
             ().moveVector;
                 if (moveVector.y < 0)
                 {
                     a.transform.position = new Vector2(screenBounds.x + 
        gap, Random.Range(-screenBounds.y, screenBounds.y));
                 }
                      break;
                  default:
                 break;
         }



          //*Manipulate to respanw from just outside the confines
     }
     IEnumerator BallWave()
     {
         while (true) {
             yield return new WaitForSeconds(respawnTime);
             spawnBall();
         }
     }
 }

Мяч должен непрерывно появляться в произвольном положении по четырем сторонам экрана и перемещаться с предопределенной скоростью вправо на экран, если появляется влево, влево, если появляетсявправо, вниз, если появилось выше экрана, вверх, если появилось ниже экрана.

введите описание изображения здесь

1 Ответ

0 голосов
/ 06 февраля 2019

Конечно, все ваши префабы будут появляться в одной и той же позиции;Вы не указываете transform.position, в котором они будут появляться.Instantiate принимает 3 аргументов (префаб, позиция, вращение).Поскольку вы указываете только первый аргумент, он будет порождать объект в своей собственной позиции преобразования.В вашем случае это, вероятно, (0,0,0) - поэтому его нерест в центре экрана.Если вы хотите подтвердить это, щелкните по фактическому префабу, который находится внутри вашей папки ресурсов, и посмотрите на его позицию трансформации - это та позиция, в которой ваш префаб будет появляться по умолчанию.Опять же, если вы хотите, чтобы он появлялся где-то еще, вы должны указать где в функции Instantiate.

...