localscale unity что это

Как разработать ещё один платформер с помощью Unity. Ещё один туториал

Под катом вас ждёт ещё одна статья, которая расскажет о том, как я поставил себе цель запрограммировать игру, основываясь на переводе статьи на Хабр под названием Паттерны дизайна уровней для 2D-игр.

Статья имеет много текста (как обычного, так и исходного) и много картинок.

Прежде, чем я начну свою первую статью, давайте познакомимся. Моё имя Денис. Я работаю системным администратором с общим стажем в 7 лет. Не мне вам говорить, что системный администратор — это вид ИТшников, которые один раз старательно деплоят, а потом созерцают мерканье различных символов на мониторе. Со временем, я пришёл к выводу, что пора расширять границы знаний и переключаться на программирование. Не в даваясь в подробности, я пытался сделать любые проекты на C++ и Python. Но за год изучения, я пришёл к выводу, что программировать прикладной и системный софт — не моё. По разным причинам.

Поразмыслив глубже, я задал себе вопрос: что я действительно люблю делать за вычислительной техникой разного формата? Мои вопрос самому себе отбросил меня далеко в самое детство, а именно в счастливые часы проведённые за PS1, PS2, Railroad Tycoon 3 for PC…, Ну, вы поняли. Видео игры!

По количеству разнообразных учебных материалов, выбор пал на Unity (не изобретать же велосипед?). После месяца чтения и просмотра различных материалов, а решил выпустить в плей маркет первой очень простую детскую игру. Чтобы перебороть страх так сказать. Ведь выпускать приложения в плей маркет — это не страшно, верно?

Через пару месяцев я выпустил платформер уже более сложный. Затем был перерыв (ведь работу надо работать, всё-таки).

Около двух недель назад я увидел перевод статьи на хабр под названием Паттерны дизайна уровней для 2D-игр (https://habr.com/ru/post/456152/) и подумал про себя — а почему нет? В статье есть простая и наглядная таблица со списком того, что должно быть в игре, чтобы она была интересной. Таблицу я любезно скопировал себе в OneNote и пометил каждый паттерн тегом Дела (который можно помечать выполненными).

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

Я начну свой лонгрид по программированию ещё одного платформера.

Аватар

Сущность, которой управляют игроки внутри игры. Например, Марио и Луиджи в Super Mario Bros (Nintendo, 1985 год).

Есть несколько подзадач, которые необходимо реализовать, чтобы придать герою жизнь. А именно:

Для реализации анимации, нам потребуется преобразовать одиночный спрайт в мульти спрайт. Делается это невероятно просто. Складываем спрайт в папку проекта и находим его в проводнике редактора Unity. Затем, щёлкнув мышкой по спрайту, в окне инспектора меняет значение свойства SptiteMode с Single на Multiple.

Нажимаем Apply, затем SpriteEditor.

Внутри окна Sprite Editor необходимо выделить мышкой каждый кадр будущей анимации как показано на рисунке ниже.

Так же, в Unity предусмотрена возможность автоматически выделять границы объектов внутри спрайта. Для этого в окне Sprite Editor необходимо нажат кнопку Slice. В выпадающем меню у вас должно быть указано Type => Automatic, Pivot => Center. Всё, что вам нужно сделать — нажать на кнопку Slice. После, все объекты внутри спрайта будут выделены автоматически.

Сделаем данную операцию для всех остальных анимации. Далее, необходимо будет настроить состояния анимации и их переключения. Это делается в два действия. Первое действие, программный код.
Создаём пустой игровой объект. Чтобы сделать это, необходимо щёлкнуть правой кнопкой мыши во вкладке Hierarchy и в выпадающем меню выбрать Create Empty

Пустой игровой объект, который создаётся на сцене, по умолчанию имеет только один компонент — Transform. Данный компонент определяем положение объекта на сцене, угол наклона и его масштаб.

Вы можете встречать слово transform в двух разных значениях:

Данная строчка будет отвечать за перемещение Лукаса на сцене.

Читайте также:  сумка боулер что это такое

Чтобы создать свой собственный компонент, необходимо во вкладке инспектора объекта нажать кнопку Add Component. Далее, появится окно поиска среди стандартных компонентов. Достаточно начать набирать имя будущего скрипта (или уже реализованного компонента), если никаких подходящих имён не будет, Unity предложит вам создать новый компонент. Я назвал этот компонент HeroScript.cs.

Сперва, описываем поля, которые будут хранить в себе информацию о визуальной и физической составляющей Лукаса:

Далее, поля, которые будут отвечать перемещение персонажа:

Начало положено, отлично. Далее, будет описано перечисление и написано свойство, которое будет отвечать за переключение состояния анимации. Данное перечисление необходимо писать вне класса:

Реализуем свойство, которое будет получать и устанавливать новое состояние анимации:

С программной частью закончено. Теперь у нас есть перечисление и свойство, которое будет связано с переключением анимации. Далее, второй шаг. Нужно в редакторе Unity связать состояние анимации и и указать, при каких значениях int их нужно менять.

Для этого, необходимо связать созданные ранее мульти спрайты с пустым игровым объектом. Всё, что вам нужно, это выделить в проводнике Unity кадры и перетащить их на пустой игровой объект, на который мы ранее закрепили скрипт.

Проделайте так с каждой следующей анимацией. Так же, в проводнике с анимациями вы обнаружите появление объекта со изображением блок-схемы и кнопкой Play. Щёлкнув по ней дважды, вы откроете вкладку Animator. Внутри вы увидите несколько блоков с анимациями и изначально, связанны только состояния Entry и первый набор анимации, который были подключены. AnyState и другие анимации будут отображены в виде обычных серых квадратов. Для того, чтобы связать всё, нужно щёлкнуть по состоянию AnyState и выбрать одно единственное выпадающее меню Make Transaction и связать её с серым блоком. Эту операцию необходимо проделать для каждого состояния. В итоге, должно получиться примерно то, что вы видите на скриншоте ниже.

Далее необходимо явно указать, чему именно должна быть равна State, чтобы запустить необходимую анимацию. Обратите внимание на скриншот, а именно левая её часть. Вкладка Parameters. В ней создана переменная типа int State. Далее, обратите внимание на правую часть. Прежде всего, с перехода анимации необходимо снять галочку Can Transaction To Self. Данная операция избавит вас от странных и иногда совсем не понятных переходов анимации в саму себя и раздел Conditions, где мы указали, что данному переходу анимации присвоено значение 3 переменной State. После чего Unity будет знать, какую анимацию запустить.
Для анимированного перемещения персонажа всё сделано. Идём дальше.

Следующий шаг, научить Лукаса перемещаться по сцене. Это целиком и полностью программирование. Для перемещения персонажа по сцене, потребуются кнопки, нажимая на которые Лукас будет идти назад и вперёд. Для этого, во вкладке Assets Store нам потребуется импортировать Standart Assets, но не вся его часть, только некоторые дополнительные компоненты, а именно:

• CrossPlatformInput
• Editor
• Environment

После импорта Ассета, главное окно Unity должно модифицироваться и появиться одна дополнительная вкладка Mobile Input. Активируем его.

Создадим на сцене новые UI елементы — кнопки управления. Создадим 4 кнопки по каждому направлению. Вверх, вниз, вперёд и назад. В компоненте Image назначим кнопкам изображение, которое будет соответствовать изображению, означающего возможность перемещения. Должно получиться примерно как на скриншоте ниже:

Далее, модифицируем HeroScript.cs. Добавляем в директиву using пространство имён

В стандартный метод Start добавляем следующий код:

Источник

Tiling в 2D-играх на Unity, масштабирование материала

При разработке 2D-игр на Unity часто возникает необходимость делать множество элементов различного размера из одного и того же материала. Самый простой пример – тайлы земли, травы, каменей и прочие элементы во всякого рода платформерах. Как правило, одинаковые тайлы по умолчанию используют один и тот же материал (в противном случае кол-во заранее созаднных материалов было бы чересчур большим). Часто делать каркас уровня из элементарных тайлов может быть неудобно из-за слишком большого кол-ва объектов на уровне, поэтому вместо элементарных тайлов используются большие тайлы – те же тайлы, только увеличенного масштаба. Допустим, нам надо поверх земли «посадить» два участка травы:

Читайте также:  ddr ram что это

На этом рисунке поверх земли находятся 9 отдельных тайлов травы, размером 1х1. При помощи Ctrl+C, Ctrl+V восемь тайлов справа были успешно расставлены, но если на уровне должно быть порядка пары сотен тайлов травы, а самих уровней – несколько десятков, то расстановка одиночных тайлов будет отнимать слишком много времени. Оптимальным решением для такого рода задач является масштабирование одиночного тайла. Т.е. в данном случае нужно будет скопировать кусок травы и растянуть полученный объект по оси Х в восемь раз (например, в инспекторе редактора), получится такая штука:

Едва ли полученный результат можно назвать приемлемым. Для нормального масштабирования, помимо самого объекта, нужно изменить масштаб материала данного объекта (опять же в редакторе, во вкладке Inspector), а именно – параметр Tiling:

Получим следующий результат:

Как видите, блок из восьми тайлов выглядит как и задумывалось, а вот блок из одного тайла слева – сжался в восемь раз. Всё дело в том, что эти два объекта используют один и тот же материал, поэтому изменения материала одного объекта влекут за собой изменения материала другого объекта.
Данную проблему можно решить следующим путем: у каждого объекта есть компонента transform.sharedMaterial – это общий материал, а так же компонента transfrom.material – при изменении данной компоненты, создается копия используемого объектом материала, которую данный объект и будет в дальнейшем использовать, и которую можно изменять, при этом не затронув другие объекты. Создадим простенький скрипт:

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

Казалось бы, жизнь прекрасна, но есть одно «но»: такой результат получается только во время «игры», во время редактирования по-прежнему всё печально:

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

Данный скрипт будет вызывать функцию scaleMaterial для объекта, который имеет компоненту TexTilingScript, каждый раз, когда такой объект выделяется на экране (например, выбирается мышью), и сохраняет полученные изменения:

Всё хорошо, кроме одного – в Log-е появляется ошибка:
Instantiating material due to calling renderer.material during edit mode. This will leak materials into the scene. You most likely want to use renderer.sharedMaterial instead.
Дело в том, что изменяя материал объекта во время редактирования – мы создаем новый временный материал, который после запуска приложения будет удалён. Я искренне не понимаю, почему разработчики Unity оформили данный case в виде ошибки, а не в виде предупреждения, т.к. такой расклад вполне приемлем и не приводит к каким-то конфликтам. Но если кого напрягает красный цвет – можно последовать их же совету – для масштабирования можно использовать не renderer.material, а renderer.sharedMaterial – в таком случае во время редактирования выделенного объекта его пропорции будут правильными, но другие объекты с тем же материалом будут искажены, тем не менее такой вариант вполне можно считать примелимым и удобным. Добавим новую функцию scaleSharedMaterial() в TexTilingScript:

Теперь в скрипте TexTilingEditorScript изменим вызываемую ф-ю:

Теперь «ошибка» не появляется, но для того, что бы во время редактирования материал объекта масштабировался верно – надо его сначала выделить. Тоже вполне приемлимый вариант.
Ну и еще один вариант решения данной проблемы – заранее создавать для каждого объекта свой материал. Но не всем понравится иметь в исходниках проекта сотню заранее созданных материалов, когда можно обойтись всего одним, поэтому использование скриптов – одно из самых лучших решений.

Все скрипты написаны на JavaScript. Unity 3.3, Pro.

Источник

Динамическое изменение размеров объекта в Unity3D (решено)

Имеется куб, который надо динамически изменять.

Скрипт вешается на сам куб, раз в 10 секунд(например) меняется его размер на новый, случайный( new Vector3(Random.Range(2,10),Random.Range(2,10),Random.Range(2,10)) ).

Как динамически менять размеры? Желательно, пример кода.

36 ответов

Всё что у меня получилось:
randomscale.cs

Но эта часть не работает почему-то правильно:

Она должна менять размер плавно. Нужно погуглить, как её правильно написать.

Читайте также:  какой кофе у итальянцев подают со стаканом холодной воды 9 букв сканворд

косяк был в том, как я понял, что переменная размера отдельно записывалась, а надо было передавать нынешние размеры объекта, т.е.

С коллайдером наверное что-то. Попробуй mesh collider вместо box collider.

И ещё попробуй это поменять эти параметры:

Источник

Как масштабировать gameobject до определенного размера?

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

Объект никогда не перестает масштабироваться. Я предполагаю, что это потому, что он никогда не достигает того же размера и немного больше или меньше, но я не могу понять, как остановить его масштабирование. Я готов ввести размеры вручную, вместо того, чтобы использовать TargetObject в качестве эталона для размера, которым он должен быть, но все, что я могу найти в Интернете, говорит о неограниченном масштабировании или использовании bool для его остановки, а не о достижении определенного размера. Как я могу это решить?

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

Нет никакой гарантии, что они когда-нибудь будут в точности равны. Итак, проверьте, когда его компонент y больше или равен: if (ObjectToScale.transform.localScale.y >= targetSize.y)

@Ruzihm Большое спасибо за помощь с кодом масштабирования. Я все еще не могу заставить его прекратить масштабирование даже с вашим оператором if, но, по крайней мере, я знаю, что мне что-то не хватает, и у меня есть код, чтобы начать устранение неполадок.

Думаю, я разобрался с проблемой, я изменил высоту целевого объекта, а не локальный масштаб в Unity. Если я изменю размер в соответствии с местным масштабом, думаю, это сработает. Большое вам спасибо еще раз.

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

Обязательно включите несколько снимков экрана иерархии, с которой вы работаете.

Источник

Как масштабировать gameobject до определенного размера?

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

Объект никогда не перестает масштабироваться. Я предполагаю, что это потому, что он никогда не достигает того же размера и немного больше или меньше, но я не могу понять, как остановить его масштабирование. Я готов ввести размеры вручную, вместо того, чтобы использовать TargetObject в качестве эталона для размера, которым он должен быть, но все, что я могу найти в Интернете, говорит о неограниченном масштабировании или использовании bool для его остановки, а не о достижении определенного размера. Как я могу это решить?

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

Нет никакой гарантии, что они когда-нибудь будут в точности равны. Итак, проверьте, когда его компонент y больше или равен: if (ObjectToScale.transform.localScale.y >= targetSize.y)

@Ruzihm Большое спасибо за помощь с кодом масштабирования. Я все еще не могу заставить его прекратить масштабирование даже с вашим оператором if, но, по крайней мере, я знаю, что мне что-то не хватает, и у меня есть код, чтобы начать устранение неполадок.

Думаю, я разобрался с проблемой, я изменил высоту целевого объекта, а не локальный масштаб в Unity. Если я изменю размер в соответствии с местным масштабом, думаю, это сработает. Большое вам спасибо еще раз.

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

Обязательно включите несколько снимков экрана иерархии, с которой вы работаете.

Источник

Сказочный портал