Unity умеет собирать почти под все, кроме WebGL. Текущий экспортер WebGL сырой и в превью версии.
Я запускал несколько игр из браузера на Unity. Ни одна не тормозила. Но я не нашёл ни одной игры на Blend4Web. Я запускал несколько примеров с их сайта. У меня они жутко тормозили.
Сообщение отредактировал 8Observer8 - Среда, 22 Июля 2015, 13:45
Лично мне не понравились инструменты BGE для создания 2D игр. Их просто нет. Находил несколько скриптов написанных для платформенных игр одним человеком. В Unity есть удобный Animator, который подходит и для 2D и для 3D. Есть официальные примеры: заготовки для 2D и 3D игр. Можно найти множество полезных и бесплатных вещей на Asset Store Unity
Blender можно использовать как 3D редактор, а импортировать в Unity перетаскиванием.
ЦитатаViktor-Kor ()
Использование Unity/UE для таких задач избыточно. имхо
Избыточно использовать UE, а Unity в самый раз.
ЦитатаViktor-Kor ()
1. Нет проблем с моделями. Моделишь сам или импортируешь в других форматах
В Unity тоже нет проблем с моделями. Моделируешь в Blender и импортируешь.
ЦитатаViktor-Kor ()
2. Создание сцены.
В Unity тоже есть создание сцен.
ЦитатаViktor-Kor ()
3. Простой визуальный редактор для логики.
Одного визуального редактора недостаточно. Свобода в комбинации с Python. На Unity можно писать скрипты на C#, JavaScript, Python. Осваивается и программируется не сложнее, чем в BGE.
ЦитатаViktor-Kor ()
Встроенный игровой движок BGE позволит скомпилировать приложение для desktop.
Unity тоже компилирует из меню. Причём на 21 платформу.
ЦитатаViktor-Kor ()
Если нужна платформа WebGL, то дополнительно устанавливаешь Blend4Web (полный экспорт сцены Blender в WebGL)
Для WebGL придётся ещё изучать JavaScript, чтобы программировать на Blend4Web. Сообщество крайне мало по сравнению с Unity. Для сборки WebGL в Unity достаточно в меню выбрать. А так же намного легче собрать в apk для Android и IOS, чем для BGE (по-моему, для мобилок на BGE вообще не собирается).
Сообщение отредактировал 8Observer8 - Среда, 22 Июля 2015, 12:07
Не обижайтесь, но для выявления подобного и нужны тестовые задания )) Ищите другую контору
Да хотелось бы в этой удержаться и развиваться. Тут вся команда англоязычная. Раз в неделю сборы в скайпе. Можно послушать живую английскую речь по предметной области, а в перспективе - поучаствовать. Это стимулирует изучать английский. По контракту, как минимум нужно уделять 10 часов в неделю на работу. В качестве подработки и обучения английскому было бы неплохо. Тут каждый борется за процент от продаж на стиме. Правда, меня смущает то, что по контракту абсолютно всё принадлежит одному человеку. Я понимаю, что с моим разговорным английским и тем, что в Unity новичок - мало шансов удержаться, но задание, хотя бы для опыта, нужно сделать.
MANMANA, огромное спасибо! Теперь я понимаю. Мне тимлидер по скайпу показывал примерно такие. Как я понял процесс работы с редактором - это создать объект, у которого будут производные объекты - Plane и тексты. Человек вводит тексты, выбирает картинку, получает объект, переименовывает его и бросает в папку Prefab.
beril, мне в той конторе тимлидер подарил Text Mesh Pro. Я могу выложить исходники проекта, в котором используется этот пакет?
Сообщение отредактировал 8Observer8 - Среда, 22 Июля 2015, 06:54
Но я не могу понять зачем делать такой редактор? Кому он нужен? Карту же можно в фотошопе нарисовать. Тем более, что максимум, что можно создать из такого редактора, так это prefab. В игры выше я не играл и плохо представляю, что это за карты. Я не понимаю, как должен выглядеть редактор карт и не могу приступить к выполнению задания.
Сообщение отредактировал 8Observer8 - Вторник, 21 Июля 2015, 20:35
Что ж я такое неправильное делаю, что у меня они нормально работают?
Я не знаю почему у вас работает, но как в этой заметки говориться, что если размер спрайта в несколько пикселей, то в секции компонента "Box Collider 2D" будет выдаваться сообщение "The collider did not create a collision shape…". Возможно у вас спрайт снаряда больше, чем несколько пикселей.
Да, посмотрел последний урок. Мне пригодилось, как по-настоящему отключить гравитацию: "Edit" -> "Project Settings" -> "Phisics 2D" -> set Y to 0. Думаю, разобрать код. Спасибо!
А то я зачем-то в "Rigidbody 2D" выставлял "Gravity Scale" в ноль и мне показалось, что так я отключал гравитацию. Хотя там написано, что это "Degree to which the object is affected by gravity." То есть это степень, с которой определяется подвержен ли объект гравитации. И вроде бы ноль должен указывать, что не подвержен.
Ситуация такая. Я вернул всё обратно. Сейчас всё нормально. OnCollisionEnter2D срабатывает. Вражеский танк едет. Я могу управлять танком Player. Мне не нравится, что я могу таранить танки, то есть сдвигать их с курса. Предложите, как это можно исправить?
Добавлено (15 июля 2015, 20:31) --------------------------------------------- seaman, а когда вы будете стрелять в бронированные танчики, они ведь будут оскакивать? У меня есть предположение, что нужно подобрать массы пули и танка так, чтобы этого не происходило.
Может лучше делать с включённым "Is Trigger" на BoxCollider2D?
Добавлено (16 июля 2015, 00:24) --------------------------------------------- Я понял, что игру нужно делать на триггерах. При OnTriggerEnter2D занулять скорость и запоминать блокирующее направление. При нажатии кнопок управления нужно проверять неблокирующее ли это направление, если нет, то сбрасывать переменную, которая хранит блокирующее направление и устанавливать скорость. А если направление блокирующее, то ничего не не делать, то есть оставлять скорость равной нулю.
Добавлено (18 июля 2015, 00:36) --------------------------------------------- Замечу, что для снарядов не подходит "Box Collider 2D", так как они мелкие. Здесь нужен "Edge Collider 2D". Решение проблемы нашёл здесь.
Сообщение отредактировал 8Observer8 - Четверг, 16 Июля 2015, 00:34
Еле осилил прочесть всю тему... Очередной бестолковый холивар. Все кичатся движками, технологиями, а где же творения ваши? Изучаете движки ради изучения движков? Ведь сюда все идут в первую очередь за зананиями, как сделать что-то, а не смотреть, как вы спорите. Имхо - глупое бесполезное занятие.
Сюда идут, прежде всего, из-за сомнений: какой движок мне больше подойдёт и в какую компанию идти джуниором (стажёром, кодером), где используют Unity5 или где - UE4.
Сообщение отредактировал 8Observer8 - Среда, 15 Июля 2015, 15:29
Я расположил спрайты в проскости XZ. В Rigidbody 2D/Constraints/Freeze Rotation почему то можно поставить только галочку Z. То есть заморозить вращение вокруг Z. А мне нужно вокруг Y. Но это я делал, когда гравитация была включена. Я хотел перемещать спрайты по плоскости (по спрайту с BoxCollider2D). Нужно будет опять вернуть в плоскость XY. Тогда можну будет отпенить вращение вокруг Z.
Я убрал со спрайтов галочки IsKinematic, выставил GravityScale в ноль, выставил позиции спрайтов на одинаковой высоте, но спрайты проходять друг через друга и не упираются друг в друга. Перемещаю я их с помощью transform.Translate(...)
Сообщение отредактировал 8Observer8 - Среда, 15 Июля 2015, 10:26
Я хотел при столкновении, к примеру, Player'а с препятствием занулять ему скорость в этом направлении. Допустим, стоит вражеский танк, а Player перемещаем снизу вверх. Он сталкивается, но дальше не может ехать, так как скорость в этом направлении будет зануляться в OnTriggerEnter2D (или OnTriggerStay2D). А в других направлениях Player может ехать. Но эта идея провалилась. Прошу помощи навести на правильный путь.
Цитатаseaman ()
Это тоже ошибка - кинематик нельзя ставить.
В этом случае, у меня спрайты улетают. Я с физикой в 2D столкнулся впервые. Посоветуйте, как быть. Подскажите, как должно быть наиболее правильно?
Добавлено (14 июля 2015, 22:30) --------------------------------------------- Дело в том, что если я добавлю физику 2D, то я смогу двигать вражеские танки. Это неправильно. Разве нет?
Сообщение отредактировал 8Observer8 - Вторник, 14 Июля 2015, 22:31
Помогите, пожалуйста, реализовать столкновения двух танчиков: Player, Enemy. Пока, что у меня есть максимально упрощённый пример. Спрайт Enemy движется вниз с помощью transform.Translate(...), а на пути у него спрайт Player. На обоих объектах стоит BoxCollider2D (установлен флаг IsTrigger) и Rigidbody2D (установлен флаг IsKinematic)
Танком Player управляет пользователь. Когда танки врезаются, то в методе OnTriggerEnter2D я обоим спрайтам устанавливаю скорость в ноль. Дальше никак не могу сообразить, как продумать логику. Натолкните, пожалуйста, на правильные размышления.
Скорее всего сделаю - просто обнулю speed, а когда едет speed = 1;
Со скоростью понятно. Но этого мало, так как танк будет буксовать на месте.
Добавлено (13 июля 2015, 14:32) --------------------------------------------- Ура! Я нашёл ошибку! Нужно было в настройках установить для "Transition Duration" значение 0 (для каждого Transition). Причём, галочка HasExitTime должна быть действительно убрана для всех Transition.
Добавлено (13 июля 2015, 16:53) --------------------------------------------- Наиболее правильно привлечь "Any State":
Для каждого Transition в Settings: - галочка "Has Exit Time" должна быть убрана - значение "Transition Duration (s)" нужно выставить в ноль - убрать галочку "Can Transition To Self"
Добавил постоянный звук двигателя и звук газа, при нажатии кнопок WASD (или стрелок) Tanks_v1.1.0 (проект)
P.S. Если кому-то пригодилась информация, то, пожалуйста, плюсуйте
Сообщение отредактировал 8Observer8 - Понедельник, 13 Июля 2015, 16:59
Не может быть. Куда бы они делись? У меня одно событие в анимации PlayerUp. Да, случайно добавил. Посмотрите внимательно. Нужно в "Hierarchy" чтобы было выделен спрайт Player. В меню нужно выбрать "Window" -> "Animation". В списке анимаций выбрать "PlyaerUp". Напишите, пожалуйста, есть ли там палочка. Для меня это важно, чтобы знать на будущее, что может быть такой глюк.
Добавлено (13 июля 2015, 12:23) --------------------------------------------- seaman, я посмотрел ваш урок (часть с анимацией танка). У вас нет состояний покая для танка. Как вы их собираетесь добавлять? Если есть, то покажите, пожалуйста, где.
Ну на самом деле ничего плохого. Только зачем такая длительность? Один кадр - он и есть один кадр...
Почему же тогда после того, как я убрал HasExitTime у меня танк попрежнему начинается двигаться до того, как срабатывает анимация?
Добавлено (13 июля 2015, 11:50) ---------------------------------------------
Цитатаseaman ()
Когда создавали анимации случайно нажали кнопку добавления события. Я в проекте не смог найти где это событие. Если найдете - просто удалите. Но проще - заново пересоздать все анимации.
Спасибо! Не проще заново создать анимации. События обозначаются палочками. Нужно выделить палочку и нажать Delete:
Сообщение отредактировал 8Observer8 - Понедельник, 13 Июля 2015, 11:55
Что такое анимация?- изменение состояния. Какое изменение в анимациях - PlayerIdleUp, PlayerIdleDown?
Idle - это анимация покоя. Я не понимаю, что в этом плохого.
Цитатаseaman ()
А вот длится этот кадр - секунду. И пока не пройдет эта секунда в другое состояние танк не перейдет. Уберите галки HasExitTime у всех транзишн.
Теперь я понимаю, почему переход из анимации покоя в анимацию движения срабатывает не сразу. Это в теории, но на практике я убрал все HasExitTime, но ничего не изменилось.
Добавлено (13 июля 2015, 11:10) ---------------------------------------------
Цитатаseaman ()
А лучше - смотрите мои уроки. Там как раз танчики делаем.
Спасибо большое! Посмотрю. Я как раз хотел сделать клон этой игры для тренировки.
Добавлено (13 июля 2015, 11:11) ---------------------------------------------
seaman, огромное спасибо, что откликнулись! Давайте по порядку.
Цитатаseaman ()
Во первых у Idle как я понял как таковой анимации вообще нет, а сначала переходит именно на нее.
У меня есть две анимации Idle: - PlayerIdleUp - PlayerIdleDown
В аниматоре PlayerIdleUp установлена поумолчанию. У меня подозрение, что здесь, что-то не так и возможно вы правы, потому что когда я запускаю игру и одновременно вытаскиваю Animator, то не вижу проигрывание (жёлтой полоски) под анимацией PlayerIdleUp в аниматоре.
И того у меня сейчас четыре анимации: - PlayerIdleUp (стоим и смотрим вверх) - PlayerIdleDown (смотрим вниз) - PlayerUp (движение вверх) - PlayerDown (движение вниз)
В аниматоре я их соединил стрелками. Создал целую переменную state. Её значения: 0: PlayerIdleUp 1: PlayerIdleDown 4: PlayerUp 5: PlayerDown
На остальные вопросы я потом отвечу. Помогите мне сначала понять, что не так делаю сейчас.
Вы говорите:
Цитатаseaman ()
Следовательно пока не закончится Idle - Move не запустится. А у Idle нет анимации.
А почему же тогда после запуска игры, нажатия кнопки W - анимация PlayerIdleUp переходит в анимацию PlayerUp? Если нажать вниз, то будет переход на анимацию движения PlayerDown, но с задержкой. Как же нет Idle если есть PlayerIdleUp?
Сообщение отредактировал 8Observer8 - Понедельник, 13 Июля 2015, 09:53
Сделал небольшой пример, чтобы показать проблему: скачать
Проблема: анимация в 2D срабатывает не сразу после нажатия клавиши
Скрипт:
Код
using UnityEngine; using System.Collections;
public class Player : MonoBehaviour { private enum PlayerState { IdleUp, IdleDown, IdleRight, IdleLeft, MoveUp, MoveDown, MoveRight, MoveLeft }
private enum Direction { Up, Down, Right, Left }
private Direction currentDirection;
private Animator anim;
// Use this for initialization void Start() { anim = GetComponent<Animator>();
currentDirection = Direction.Up; }
// Update is called once per frame void Update() { if (Input.GetKey(KeyCode.W)) { anim.SetInteger("state", (int)PlayerState.MoveUp); currentDirection = Direction.Up; } else if (Input.GetKey(KeyCode.S)) { anim.SetInteger("state", (int)PlayerState.MoveDown); currentDirection = Direction.Down; } else { if (currentDirection == Direction.Up) { anim.SetInteger("state", (int)PlayerState.IdleUp); } else if (currentDirection == Direction.Down) { anim.SetInteger("state", (int)PlayerState.IdleDown); } } } }
Добавлено (12 июля 2015, 23:51) --------------------------------------------- Получается, что если двигаться вверх и вниз (W и S), то перемещение срабатывает быстрее, поэтому танк, к примеру, начинает ехать задом.
Добавил перемещение:
Код
using UnityEngine; using System.Collections;
public class Player : MonoBehaviour { private enum PlayerState { IdleUp, IdleDown, IdleRight, IdleLeft, MoveUp, MoveDown, MoveRight, MoveLeft }
private enum Direction { Up, Down, Right, Left }
private Direction currentDirection;
private float currentSpeed = 0.5f;
private Animator anim;
// Use this for initialization void Start() { anim = GetComponent<Animator>();
currentDirection = Direction.Up; }
// Update is called once per frame void Update() { if (Input.GetKey(KeyCode.W)) { anim.SetInteger("state", (int)PlayerState.MoveUp); currentDirection = Direction.Up; transform.Translate(Vector3.up * currentSpeed * Time.deltaTime); } else if (Input.GetKey(KeyCode.S)) { anim.SetInteger("state", (int)PlayerState.MoveDown); currentDirection = Direction.Down; transform.Translate(Vector3.down * currentSpeed * Time.deltaTime); } else { if (currentDirection == Direction.Up) { anim.SetInteger("state", (int)PlayerState.IdleUp); } else if (currentDirection == Direction.Down) { anim.SetInteger("state", (int)PlayerState.IdleDown); } } } }
Сообщение отредактировал 8Observer8 - Воскресенье, 12 Июля 2015, 23:52
Поставил Andy. При запуске выскакивает ошибка после которой Andy завершается:
С BlueStacks работает нормально. Для установки apk нужно запусить BlueStacks -> два раза кликнуть по .apk. Приложение появляется среди приложений BlueStacks.
BlueStacks, как мне показалось, скачал игры из интернета. Я, наверное, просмотрел и можно было галочку убрать? Весит теперь папка с установленным BlueStacks 2 ГБайта.
А у тебя вопрос в нехватке дискового пространства?
Ага. На ноуте каждые 100 МБайт на счету
Я поставил API 10 (галочки оставил, как в первом сообщении). Поставил JDK8. В Unity открыл: в меню "Edit" -> "Preferences..." -> "External Tools". Выставил значения: Android SDK Location: C:\Program Files\Android\android-sdk-windows JDK Location: C:\Program Files\Java\jdk1.8.0_25
Открыл в меню "File" -> "Build Settings..." -> выбрал "Android" -> нажал кнопку "Player Settings...". Выставил значения: Company Name: EIA Product Name: SquareSnake Bundle Identifier: com.EIA.SquareSnake
Заметил, что в поле "Minimum API Level" установлено значение "Android 2.3.1 'Ginderbread' (API level 9)". У меня установлен "Android 2.3.3 (API 10)"
Нажимаю кнопку "Build". Выскакивает сообщение:
Попробую поставить API 21, но выберу, то что я ставил с API 10:
Добавлено (04 июля 2015, 14:09) --------------------------------------------- Установил API 21. Собрал приложение в файл с именем SquareSnake.apk
Открыл "AVD Manager". Создал виртуальное устройство с параметрами:
Запустил эмулятор. Дождался, когда загрузится. На всякий случай, сразу снял блокировку клавиатуры в эмуляторе.
Скопировал файл SquareSnake.apk в каталог: "C:\Program Files\Android\android-sdk-windows\platform-tools"
Открыл cmd. Перешёл в каталог "platform-tools". Набрал команду: adb install SquareSnake.apk
Установилось успешно, но меня смущает строка: rm failed for -f, Read-only file system
Запускаю приложение в эмуляторе. Выдаёт ошибку, что устройство не поддерживает приложение:
Добавлено (04 июля 2015, 14:09) ---------------------------------------------
ЦитатаFrosten ()
BlueStacks - лучший эмулятор для андроида.
Спасибо! Попробую BlueStacks.
Сообщение отредактировал 8Observer8 - Суббота, 04 Июля 2015, 13:33