Простая 2D-игра на Unity 5. Часть 3

Добавлено: 22/05/2016 03:34 |  Обновлено: 18/03/2018 16:36 |  Добавил: nick |  Просмотры: 2143 Комментарии: 5
Вводная часть
Продолжим тему создания простой 2D-игры на Unity 5, и на этот раз добавим возможность случайного размещения кристаллов на игровом поле.
Десктопная версия игры, основанная на этом материале.
Android-версия игры ×
Если вы знакомы с двумя предыдущими материалами, то знаете, что каждый раз при запуске игры кристаллы создаются в определённых местах, в которых мы их разместили на этапе разработки. Это хорошо, но если в нашей игре бесконечное число уровней и мы хотим, чтобы с каждым новым уровнем положение кристаллов менялось, тогда нам нужно немного изменить логику игры, этим сегодня и займемся.

Для начала создадим новый пустой объект Game Controller, который будет контролировать случайное размещение кристаллов на игровом поле. К нему мы привяжем скрипт с этим же названием. Но с созданием скрипта пока отложим, а сейчас нужно сделать одно серьезное дело. Создадим еще один пустой объект Nodes. Этот объект будет родителем для большого количества дочерних объектов Node, которые будут размещаться в каждой ячейке на игровом поле. Для чего нам это нужно? А нужно нам это для того, чтобы определять координаты каждой ячейки, по расположению на ней объекта Node, и, зная эти координаты, помещать или не помещать в них (случайным образом) кристаллы. Итак, создадим объекты Node, по одному на ячейку и разместим их, каждый на своем месте. Но одну ячейку мы пропускаем, я думаю, уже понятно какую… ячейку занимаемую тарелкой. Во вкладке Hierarchy мы получаем следующую структуру: Теперь, когда все нужные объекты созданы, приступим к созданию программной части. В папке Scripts вкладки Project создадим новый скрипт и назовем его GameController. Его содержимое будет следующим:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class GameController : MonoBehaviour {

	public GameObject pickup;
	public int pickupCount;

	public List nodeList = new List();
	private GameObject node = null;

	// Use this for initialization
	void Start () {
		SpawnPickups ();
	}
	
	void SpawnPickups() {
		for (int i = 1; i <= pickupCount; i++) {
			node = nodeList[ Random.Range(0,nodeList.Count) ];
			Vector3 spawnPosition = node.transform.position;
			Quaternion spawnRotation = Quaternion.identity;
			Instantiate (pickup, spawnPosition, spawnRotation);
		}
	}

	// Update is called once per frame
	/*void Update () {
	
	}*/
}
После чего добавим созданный скрипт как компонент для объекта Game Controller. У компонента нужно заполнить 3 поля. Первый – Pickup, в него мы добавляем кристалл Pickup из папки Prefabs. Второй – Pickup Count, это количество кристаллов, которые нужно разместить, для окончания игры, нам их нужно 12. Третий – Node List, это массив пустых объектов Node, которые мы создали ранее. Их нужно все выбрать и перетащить на это поле, чтобы его заполнить, должно получиться так как показано на рисунке: Все. Теперь можно несколько раз перезапустить игру и будет видно, что кристаллы размещаются случайным образом.

Оставьте свой комментарий

Комментарии

  • Алексей  06/07/2017 20:19

    Короче, камни не рисовались, потому что по оси z у них выставлялось значение -10 при создании экземпляров. Откуда это значение бралось я хз. Решил проблему грубо:
     

    void SpawnPickups() {

    for (int i = 1; i <= pickupCount; i++) {

    node = nodeList[ Random.Range(0,nodeList.Count) ];

    Vector3 spawnPosition = node.transform.position;

    spawnPosition.z = 0;

    Quaternion spawnRotation = Quaternion.identity;

    Instantiate (pickup, spawnPosition, spawnRotation);

    }

    }

    nick     Алексей
    Да, с осью z бывают проблемы, это правда. С отрицательным значением объекты просто оказываются за сценой и их не видно.
    Ссылка
    • Ответить
  • Алексей  06/07/2017 19:46

    Не вижу возможности написать ответ на комментарий, так что отвечу ещё одним комментарием. Решил попробовать Unity потому что есть интерес к desktop'у, потому что думал, что поддержка и учебных материалов будет больше. Так же на юньке очень просто подключать рекламные сервисы и донат. Хотя с этим я и на либе справлялся. Так же слышал многократно, что на юнити разрабатывать быстрее.

    То что игра не пашет под какие-то устройства это обычное дело) Причин может быть масса. Можно в шейдере не прописать строчку, подключить сервис по Api выше или ещё что. Я пока писал свой раннер на либе раз 5 столкнулся с тем, что игра на разных устройствах работала по разному.  

    Ссылка
    • Ответить
  • Алексей  06/07/2017 19:08

    Если не трудно, подскажите каким методом можно писать в логи и можно ли переопределить функцию отрисовки для экземпляров pickup чтобы вообще проверить выполняется ли метод отрисовки. Галочка стоит. уф... Я с java libGDX сюда сунулся - там куда как проще с контролем ситуации ))

    nick     Алексей
    Для логов функция такая: Debug.Log(). Переопределять функцю отрисовки не приходилось.
    Интересно, почему решили перейти на Unity? Лично я это забросил, потому что сделал игру для андроида и она не пошла на некоторых устройствах.
    В чем проблема так и не смог определить.
    Ссылка
    • Ответить
  • Алексей  06/07/2017 17:44

    бррр, разобрался с ошибками в скрипте. Пока не установил тип для коллекции List скрипт кричал об ошибке. Пришлось написать public List nodeList = new List();

    Теперь другая проблема - камни не отрисовываются. Создаются, у них есть координаты, они даже кружатся, но не отрисовываются

    nick     Алексей
    Без типа тут никак. Это же C#. Может в Sprite Renderer галочка не стоит (у камня)? Так трудно сказать. Они могли что-нибудь поменять уже конечно.
    Ссылка
    • Ответить
  • Алексей  06/07/2017 14:21

    "Итак, создадим объекты Node, по одному на ячейку и разместим их, каждый на своем месте." 
    А можно тут поподробнее? Что значит создаём? С помощью Create Empty? Как это размещаем? Прописываем позиции? Короче, этот момент в тутореале жутко мутный. Весьма контрастно с подробным описанием всех предыдущих шагов.

    nick     Алексей
    Да, с помощью Create Empty. Позиции можно не прописывать, а просто перетащить мышкой каждый объект на свою ячейку.
    Ссылка
    • Ответить