Комментарии 17
Такое на продажу клепают, насколько я понимаю.
Почему имя классам даёт автор а стыдно мне?
Автор проделал большую работу, молодец! Я только посоветую ему и всем кто начинает работать с unity прочитать что такое Пул Объектов (object pool) и использовать его как альтернативу клонирования префабов. Процесс клонирования и уничтожения префабов создает пиковые нагрузки для процессора(особенно на моб. устройствах). Пул Объектов позволяет при загрузке уровня сгенерировать большое количество объектов за пределами сцены, затем при необходимости активировать их, использовать неким образом, и деактевировать(это могут быть пули, враги, частицы). Это спасает от падения фпс в момент клонирования нескольких объемных префабов. Очень жаль что в большинстве туториалов для начинающих повсеместно используют только клонирование.
Об инструментах не спорят… но на libGdx эта же игра была бы в 10 раз меньше.
Не учите никого программировать, пожалуйста
НЕ ИСПОЛЬЗОВАТЬ ПУУЛ?!
и т.п.
public GameObject gunactivator2;
public GameObject gunactivator3;
public GameObject gunactivator4;
public GameObject gunactivator5;
public GameObject gunactivator6;
if (col.tag == "gunactivator2")//проверка на пересечение с "капсулой" для gunactivator2
{
gun2 = true;//активация второго орудия
guncount = 85;//установка количества боеприпасов
gun1 = false;//отключение остальных "орудий"
gun3 = false;
gun4 = false;
gun5 = false;
gun6 = false;
Destroy (col.gameObject);//уничтожение "капсулы" с которой произошло пересечение
return;
}
//Ниже все аналогично
if (col.tag == "gunactivator3")
{
gun3 = true; guncount = 50;
gun1 = false;
gun2 = false;
gun4 = false;
gun5 = false;
gun6 = false;
Destroy (col.gameObject);
return;
}
if (col.tag == "gunactivator4")
{
gun4 = true; guncount = 15;
gun1 = false;
gun3 = false;
gun2 = false;
gun5 = false;
gun6 = false;
Destroy (col.gameObject);
return;
}
if (col.tag == "gunactivator5")
{
gun5 = true; guncount = 100;
gun1 = false;
gun3 = false;
gun4 = false;
gun2 = false;
gun6 = false;
Destroy (col.gameObject);
return;
}
if (col.tag == "gunactivator6")
{
gun6 = true; guncount = 50;
gun1 = false;
gun3 = false;
gun4 = false;
gun5 = false;
gun2 = false;
Destroy (col.gameObject);
return;
}
НЕ ИСПОЛЬЗОВАТЬ ПУУЛ?!
Instantiate(enemy, new Vector2(x,5.5f),transform.rotation);//Генерация противника из
и т.п.
Я бы посоветовал автору убрать статью в черновики и идти учиться делать игры дальше. Через полгода почитать статью опять, и понять, что это было единственно верное решение. Не позорьтесь, пожалуйста.
Автор почти год назад уже публиковал другую статью подобного же содержания. И вот опять.
Биллу то же так говорили…
Спасибо! После прочтения возникло желание узнать про геймдев и Unity побольше.
Что вы тут навязываете программирование ради программирования. Нормальный код. Свою задачу выполняет. Что за предвзятость. Я когда начинал Unity именно по таким и учился.
Тут многие написали что автору надо учиться, но не написали что именно не так, а это может быть не столь очевидным. Поэтому я позволю себе привести небольшой список.
Ну и код, конечно, отдельная боль… Но это в двух словах не объяснишь. Разве что «учите ООП».
- Насколько я знаю, GUI — устаревшее апи, сейчас есть UI с удобным расположением кнопок на сцене. Незачем захламлять код разметкой.
- Уже много раз тут написали про пул объектов. В двух словах его суть в том, что для всех «расходников» — метеоритов, лазеров, врагов и т.д. при загрузке сцены создаются пулы с некоторым количеством этих объектов. Далее вместо инстанциирования префаба объект достается из пула и активируется, а вместо удаления он деактивируется и кладется обратно в пул. В итоге пропадает необходимость постоянно создавать-удалять объекты.
- Вешать на game object что-то, никак не связанное с ним по смыслу — дурной тон. Вместо того чтобы вешать все подряд скрипты на камеру, лучше было бы для каждого создать отдельный пустой объект, названный так же, как класс.
- Не стоит использовать GameObject.Find без крайней необходимости. Гораздо лучше сделать из нужного скрипта синглтон. Самый простой способ это сделать — создать в классе public static поле и инициализировать его через this на Awake.
- Зачем вешать Rigidbody на звездолет игрока, если все равно двигается он через transform? Помимо бессмысленности это еще и бьет по производительности.
Эффект взрыва можно создать с помощью Particle System. Но тогда он будет зацикленным и вечно повторяться.
Да, потому что там есть такая галочка:
Впрочем, удалять (а точнее, возвращать в пул) взрыв все равно надо.
Ну и код, конечно, отдельная боль… Но это в двух словах не объяснишь. Разве что «учите ООП».
5. А там без ригид бади не работают триггеры, насколько мне известно. Юнити, конечно, тоже «хорош».
Усп, был не прав. Действительно, ерунду написал. Надо делать так:
1) Поставить rigidbody на все двигающиеся объекты.
2) Установить им isKinematic = true, чтобы отключить физику.
Невыполнение обеих пунктов бьет по производительности.
Пруф из официальной документации (правда, он про обычный коллайдер, но с 2D, насколько знаю, так же):
If the object with the Collider needs to be moved during gameplay then you should also attach a Rigidbody component to the object. The Rigidbody can be set to be kinematic if you don't want the object to have physical interaction with other objects.
По логике юнити коллайдеры без rigidbody не должны вообще двигаться, а все что двигается и хочет физику, должно иметь rigidbody. Поэтому и триггеры у двух пустых коллайдеров не работают. Тут не юнити «хорош», а просто вопрос чуть более сложный.
1) Поставить rigidbody на все двигающиеся объекты.
2) Установить им isKinematic = true, чтобы отключить физику.
Невыполнение обеих пунктов бьет по производительности.
Пруф из официальной документации (правда, он про обычный коллайдер, но с 2D, насколько знаю, так же):
If the object with the Collider needs to be moved during gameplay then you should also attach a Rigidbody component to the object. The Rigidbody can be set to be kinematic if you don't want the object to have physical interaction with other objects.
По логике юнити коллайдеры без rigidbody не должны вообще двигаться, а все что двигается и хочет физику, должно иметь rigidbody. Поэтому и триггеры у двух пустых коллайдеров не работают. Тут не юнити «хорош», а просто вопрос чуть более сложный.
Интересная статья, правда мне не совсем понятно чем получившийся продукт отличается от официального туториала от Unity? Ну кроме того, что немного другие модельки?
https://unity3d.com/ru/learn/tutorials/projects/space-shooter-tutorial
https://unity3d.com/ru/learn/tutorials/projects/space-shooter-tutorial
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Разработка космической стрелялки для android с использованием игрового движка Unity3D