Как сделать так, чтобы несколько игровых объектов появлялись с одним и тем же кодом? - PullRequest
1 голос
/ 08 апреля 2020

Я новичок ie пытаюсь создать игру. У меня есть муравей, когда вы нажимаете на него, он исчезает и появляется снова где-то еще.

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

var ant : GameObject;
var scoreText : GameObject;
var livesText : GameObject;
var walkingSpeed : double;
var livesNumber : int;
var scoreNumber : int;

function Start () {
    ant = GameObject.Find("Ant");
    scoreText = GameObject.Find("Score");
    livesText = GameObject.Find("Lives");

    //Initialize the values of walking speed
    walkingSpeed = 0.0;
    livesNumber = 3;
    scoreNumber = 0;

    //Initialize the GUI components
    livesText.GetComponent(UI.Text).text = "Lives Remaining: " + livesNumber;
    scoreText.GetComponent(UI.Text).text = "Score: " + scoreNumber;

    //Place the ant in a random position on start of the game
    ant.transform.position.x = generateX();
    ant.transform.position.y = generateY();
}

function Update () {    

    if(ant.transform.position.y < -4.35 && livesNumber > 0){    

        livesNumber -= 1;
        livesText.GetComponent(UI.Text).text = "Lives Remaining: " + livesNumber;
        generateCoordinates();

    }else if(ant.transform.position.y < -4.35 && livesNumber == 0){
        Destroy(GameObject.Find("Ant"));
        gameOver();

    }else{

        ant.transform.position.y -= walkingSpeed;
    }
}

function gameOver(){    
    Application.LoadLevel("GameOver");
}


//Generates random x
function generateX(){
    var x = Random.Range(-2.54,2.54);
    return x;
}

//Generates random y
function generateY(){
    var y = Random.Range(-4.0,3.8);
    return y;
}

//Move the "Ant" to the new coordiantess
function generateCoordinates(){
    //You clicked it!
    scoreNumber += 1;

    //Update the score display
    scoreText.GetComponent(UI.Text).text = "Score: " + scoreNumber;
    ant.transform.position.x = generateX();
    ant.transform.position.y = generateY();
}

//If tapped or clicked
function OnMouseDown(){
    //Place the ant at another point
    generateCoordinates();

    //Increase the walking speed by 0.01
    walkingSpeed += 0.01;
}

Ответы [ 2 ]

0 голосов
/ 08 апреля 2020

Ваш код состоит только из одного c муравья. Вам нужно сделать код агности c для указания c муравьев.

Но прежде чем углубляться в детали;

  • Пожалуйста, рассмотрите возможность перехода на C#, это сделает вашу жизнь намного проще.

  • Я предполагаю, что это 2D. Если 3d, просто измените Vector2s на Vector3 и удалите 2d из метода триггера.

  • Я напишу пример кода в C#

В общем, то, что у вас есть сегодня:

  • Создать муравья.
  • Если пользователь щелкает муравья, переместите его для запуска.
  • Если муравей тоже идет далеко, вы теряете жизнь и удаляете ее.

Что вы хотите

  • Появляется любое количество муравьев в случайной позиции.
  • Если пользователь щелкает муравей, удали его (?).
  • Если муравей достигнет цели, ты потеряешь жизнь и удалишь ее.

Итак, давайте рассмотрим каждый из этих шагов, и как я Реализовать их:

Создать любое количество муравьев в случайном положении

Для нереста требуется 2 вещи:

  1. Сборный домик
  2. Использование Instantiate()

Если вы не знаете, как создать сборный дом или что это такое, я советую поискать, пока не поймете. Короче говоря, это экземпляр GameObject, сохраненный на диске. Вы делаете это, просто перетаскивая GameObject в папку в представлении проекта инспектора.

public GameObject antPrefab;
GameObject SpawnAnt(Vector2 position) {
    return Instantiate<GameObject>(antPrefab, position, Quaternion.identity);
}

Случайная позиция

То, как мне нравится создавать позиции появления, объявив область возрождения GameObject, которую вы можете перемещать в редакторе, и указав размер в виде сериализованного поля:

[Range(1f, 10f)] // Gives you a slider to drag between 1 and 10 for this variable
public float spawnAreaRadius;

public Transform spawnArea;
void Vector2 GetRandomSpawnPosition() {
    var spawnAreaCenter = spawnArea.position;
    var spawnRandomX = Random.Range(-spawnAreaRadius, spawnAreaRadius);
    var spawnRandomY = Random.Range(-spawnAreaRadius, spawnAreaRadius);
    return new Vector2(spawnRandomX, spawnRandomY);
}

А в отношении нереста множественного числа, вы, вероятно, захотите поднять какое-то событие / таймер для появления и увеличения муравьев, чтобы сделать его постепенно усложняющимся:

Вызывайте это, если вы хотите порождать определенное количество муравьев случайным образом вокруг вашей позиции появления:

void SpawnAnts(int num) {
    for (int i = 0; i < num; i++) {
         var pos = GetRandomSpawnPosition();
         SpawnAnt(pos);
    }

}

Движение муравья и жизненный цикл

Вместо того, чтобы зацикливаться на всех муравьях и перемещать их с помощью оверхеда, что может быть оптимальным решением, для простоты я бы добавил в antPrefab скрипт, содержащий муравьи:

(Для этого компонента требуется твердое тело и коллайдер)

void Update() {
    // Move ant towards goal
}

void OnMouseDown() {
    Destroy();
}

Это также даст вам возможность легко давать различные муравьи с разными скоростями и др. c. Сделайте ИИ каждого муравья немного уникальным с гораздо меньшими усилиями, чем если бы они были сгруппированы.

Столкновение с целью

Определите область, которая является целью муравья, поместив Триггерный коллайдер в ваш мир. Добавьте в него существующий скрипт и добавьте метод обнаружения коллизий:

void OnTriggerEnter2D(Collider2D col) {
     if (col.tag == "ant") {
           lives--;
           Destroy(col.gameObject);    
     }

}

Сводка

Некоторые из этих вещей, которые вы уже решили по-своему (например, generateX ()), я хотел чтобы дать вам некоторое представление о том, как я лично буду решать ваш код. Вы должны оценить, какие части вы хотите использовать.


Отказ от ответственности: это отвечает вашим требованиям, но оставляет вам некоторые другие ограничения, такие как добавление точек, когда щелчок муравья требует от вас, вероятно, вызвать муравьиного менеджера точек из муравья, а не просто обнаружить его в том же контроллере, который также будет обрабатывать точки.

0 голосов
/ 08 апреля 2020

Прежде всего, UnityScript на некоторое время устарел, поэтому я думаю, что хорошей практикой должно быть обновление версии и кода Unity в C#, поскольку теперь это основной используемый язык.

Попробуйте избегайте Game.Find(), который не является хорошим способом ссылки на GameObject. Вместо этого вы можете создать префаб вашего муравья и создавать его столько раз, сколько вы хотите в случайных позициях, например:

public GameObject antPrefab;

void GenerateAnt()
{
  //create a new position from random X and Y
  Vector2 position = new Vector2(generateX(), generateY());

  //Instantiate a new ant gameobject from the prefab and set position and rotation
  GameObject newAnt = Instantiate(antPrefab, position, Quaternion.identity)
}

Теперь, если у вас есть несколько муравьев, вам нужно l oop для каждого Муравей обновляет позицию каждого муравья.

Не забудьте связать свой префаб в поле publi c в редакторе! ;)

...