Как научиться писать скрипты для unity3d
Learning C# and coding in Unity for beginners | Video game development
Переменные
В Unity скрипты начинаются с выкладки вверху необходимых вам инструментов, и обычно этим является объявление переменных. Вы может увидеть объявленные переменные, нажав сюда, с ключевыми словами “public” или "private" перед ними, за которыми следует тип переменной и имя переменной.
Есть несколько типов видимости переменных, указываемых при их объявлении, но наиболее важными из них являются public (общие переменные) и private (частные переменные).
Если вы в редакторе кода создадите скрипт с приведенным выше текстом, а затем вернетесь в Unity и припишите этот скрипт объекту GameObject, вы увидите, что вам доступна переменная типа Light, объявленная как общая (public), но вы не видите частной переменной (private). Это происходит из-за того, что переменная, объявленная как частная (private), может быть доступна только из частного скрипта в пределах частного класса.
Если вы делаете переменную частной, тогда она доступна другим скриптам и другим классам и может быть изменена в редакторе Unity. Это означает, что другие люди имеют доступ к этой переменной и могут изменять ее значение.
Есть множество причин для выбора между private и public. Благодаря частным переменным (private) ваш код становится более ясным, поскольку вы знаете, что значения таких переменных могут изменяться только из ее класса. И тем самым облегчаются отладка и поддержка программного кода.
Если вы выбрали для переменной вариант “public” и столкнулись с проблемой, тогда вам придется пересмотреть весь программной код, чтобы найти источник проблемы, так как любой другой объект имеет доступ к этой переменной. Однако, если вы хотите, чтобы объекты взаимодействовали друг с другом, вам потребуются некоторые переменные (или функции) типа public.
Другим важный аспектом переменной является ее тип. Тип определяет, какого рода переменная содержится в памяти, например, это может быть число, текст или более сложный тип как на экранном снимке ниже: Transform, Light и Demo Script на снимке ниже являются в действительности ссылками на компоненты (Components). Unity необходимо знать, к какому типу относится объект, чтобы знать, как обращаться с ним.
Другим важным аспектом переменной является ее имя. Главное, что вы должны помнить относительно имен переменных, это то, что имя переменной не может начинаться с цифры и не может содержать пробелов. Поэтому существует стиль наименования переменных. В языке C# имена принято писать по типу camelCase: вы начинает писать имя с маленькой буквы и добавляете без пробелов слова с большой буквы, например "myLight".
Когда Unity компилирует скрипт, он делает общие переменные (public) видимыми в редакторе. См. внизу экранный снимок из Инспектора.
Изучение C # и кодирования в Unity для начинающих | Разработка видеоигр
Переменные
В Unity скрипты начинаются с размещения необходимых вам инструментов вверху, и обычно это делается с объявления переменных. Здесь вы можете увидеть объявленные переменные с ключевым словом видимости «public» или «private» в начале, за которым следуют тип и имя.
Когда мы объявляем ваши переменные, существует несколько типов видимости, но два наиболее важных из них - публичный и частный.
Если вы создадите сценарий с приведенным выше текстом в редакторе кода, а затем вернетесь в Unity и назначите сценарий GameObject, вы увидите, что вы можете получить доступ и увидеть переменную света, объявленную как общедоступную в инспекторе, но вы не могу видеть частный. И это потому, что к тому, что определено как «частное», можно получить доступ только в этом конкретном скрипте, в этом конкретном классе.
Если вы сделаете это общедоступным, то он будет доступен для других скриптов и других классов и может быть изменен в Инспекторе из редактора Unity.Это означает, что другие люди могут получить к нему доступ и изменить его ценность.
Есть много причин выбирать между частным или публичным. Частные переменные позволяют сделать ваш код более чистым, поскольку вы знаете, что значение этих переменных можно изменить только внутри этого класса. Это упрощает отладку и сопровождение кода.
Если вы выбрали «общедоступный» и у вас возникла проблема, вам нужно заглянуть внутрь всей своей кодовой базы, чтобы отслеживать источник, потому что любой другой объект имеет доступ к этой переменной.Однако, если вы хотите, чтобы объекты обменивались данными между собой, вам нужно, чтобы некоторые переменные (или функции) были общедоступными.
Другой важный аспект переменных - это тип. Тип определяет, какое значение хранится в памяти переменной, например это может быть число, текст или более сложные типы, как на изображении ниже: Transform, Light и Demo Script на изображении ниже на самом деле являются ссылками на компоненты. Unity необходимо знать, что это за объект, чтобы знать, как с ним обращаться.
Еще одна важная вещь о переменных - это имя. Главное, что вам нужно помнить об именах переменных, это то, что они не могут начинаться с числа и не могут содержать пробелов. Поэтому есть стиль написания имен. В C # соглашение об именах - camelCase: вы начинаете со строчной буквы и добавляете слова без пробелов, начиная с заглавной буквы, например "мой свет".
Когда Unity компилирует скрипт, он делает общедоступные переменные видимыми в редакторе.Смотрите изображение ниже от инспектора.
.
antfarmar / Unity-Scripting-Tutorials: Реализация избранных руководств по скриптингу Unity [https://unity3d.com/learn/tutorials/topics/scripting]
перейти к содержанию Зарегистрироваться- Почему именно GitHub? Особенности →
- Обзор кода
- Управление проектами
- Интеграции
- Действия
- Пакеты
- Безопасность
- Управление командой
- Хостинг
- мобильный
- Истории клиентов →
- Безопасность →
- Команда
- Предприятие
Документация, языки сценариев Unity и вы
У каждого есть свой любимый язык сценариев, и использование разных языков со временем развивается. Исторически мы поддерживали три языка: C #, UnityScript (также известный как JavaScript для Unity) и Boo. Конечно, мы стремимся сосредоточить нашу поддержку на языках, которые вы хотите использовать.
В настоящее время, согласно статистике аналитики нашего редактора, процент скриптов, созданных на трех языках, распределяется следующим образом:
Это означает, что, поскольку очень мало людей используют Boo, а ресурсы, необходимые для его поддержки в документации, не пренебрежимо малы, мы решили отказаться от поддержки документации Boo для Unity 5.0 выпускаем и используем наши ресурсы более конструктивно.
Когда запускается Unity 5.0, мы также убираем «Создать сценарий Boo» из меню. Тем не менее, и это очень важно, если ваш проект содержит сценарии Boo, они все равно будут работать, как и раньше.
Мы прислушались к вашим отзывам, и то, что вы нам сказали, что вы действительно хотите от своей документации, - это примеры C # по всем направлениям. Как следствие, мы также движемся внутри компании, чтобы обеспечить лучшую поддержку C #, какую только можем.
В настоящее время большинство руководств и примеров ресурсов основаны на C #, и в цикле 5.x мы позаботимся о том, чтобы все наши примеры C # в документации были первоклассными.
Примечание: до сих пор наша внутренняя процедура заключалась в написании образца кода с использованием UnityScript / JavaScript, который затем автоматически конвертируется в C # и Boo. Теперь мы предоставили инженерам Unity возможность создавать свои примеры на C # и автоматически конвертировать их в UnityScript с помощью недавно разработанного и улучшенного конвертера C # в UnityScript.
Таким образом, многие из запрошенных вами примеров C # уже доступны, и еще больше будет готово, когда выйдет Unity 5.0. W00t!
.Машинное обучение Unity3D - Написание специального агента - Создайте своего собственного AI Bot
Я играю с новой системой машинного обучения Unity3D уже несколько дней и добился небольшого прогресса. Я хотел поделиться шагами, которые я нашел, чтобы настроить вновь созданный агент и обучить его выполнять базовую задачу. В этом посте вы узнаете, как настроить базовый агент для получения случайно выбранного числа, используя только усиленное машинное обучение.Мы будем использовать новую систему Unity ML Agent и тензорный поток, чтобы создать и обучить агента выполнять задачу, а также обсудим способы применения этого в реальном игровом ИИ.
Если у вас еще нет настройки тензорного потока, вам необходимо выполнить шаги, описанные здесь: https://unity3d.college/2017/10/25/machine-learning-in-unity3d-setting-up-the- среда-тензор-поток-для-агента мл-на-окнах-10/
Хотите увидеть все это на видео? Вот и все:
По завершении этого процесса откройте проект Unity и создайте новую сцену.
Первое, что нам нужно, это академия. Создайте новый игровой объект , назовите его « NumberAcademy ».
Добавьте компонент « TemplateAcademy » в « NumberAcademy ». Наша установка не требует, чтобы академия делала что-то особенное, поэтому мы можем начать с базовой пустой академии, представленной в шаблоне.
В рамках Академии создает еще один дочерний игровой объект . Имя это « NumberBrain ».
Добавьте к нему компонент Brain .
Установите для переменных State & Action size на 2 .
Установите для Action Space Type на Discrete . В нашем проекте мы будем использовать 2 отдельных действия (вверх или вниз). Мы используем дискретные, потому что они представлены целыми числами.
Установите для типа State Space на Continuous . Мы будем отслеживать два числа с плавающей запятой для состояния, поэтому мы используем continuous.
Установить для типа мозга на « Player »
Добавьте 2 действия . Выберите любые 2 ключа (я выбрал A и B), но установите Values на 0 и 1 . Ключ, привязанный к значению 0, уменьшает #, ключ, привязанный к 1, увеличивает его.
Скрипт NumberDemoAgent
Создайте новый сценарий с именем NumberDemoAgent.cs
Установите базовый класс на Agent (замените: MonoBehaviour на: Agent)
Добавьте следующие поля:
Поля currentNumber и targetNumber здесь наиболее важны.Все остальное просто для отладки и визуализации.
Наш агент выберет случайный targetNumber и попытается получить currentNumber для нашей цели, используя наши команды увеличения и уменьшения.
Затем нам нужно переопределить метод CollectState следующим образом:
Здесь мы возвращаем два наших числа с плавающей запятой для текущего и целевого числа в качестве состояния нашего агента. Обратите внимание, как это согласуется с двумя нашими переменными состояния в мозгу, и они являются плавающими, поэтому мы установили для него непрерывное состояние, а не дискретное.
Для обучения нашего агента нам нужно выбрать случайные целевые числа. Для этого мы переопределим метод AgentReset () следующим образом:
Последняя и самая важная часть, которая нам нужна, - это метод AgentStep (). Здесь мы выполняем действия (также называемые вводом), выполняем некоторые задачи (реагируем на действия) и награждаем нашего агента за успешный выбор.
Первое, что вы увидите, это наше текстовое обновление. Это только для отладки / визуализации. Это позволяет нам видеть текущий номер, цель и количество раз, когда мы успешно решили проблему (достигли целевого числа).
Далее идет переключатель, на котором мы смотрим на действие и выполняем нашу задачу. В этом случае мы либо отвечаем на действие 0, уменьшая текущее число, либо на действие 1, увеличивая его. Никакого значения из этого не должно быть, но если мы его получим, мы просто проигнорируем его и вернемся.
Затем мы перемещаем наш куб на основе currentNumber (используя его для смещения x). Этот куб снова предназначен только для визуализации, он не влияет на фактическую логику или обучение.
Затем мы проверяем currentNumber на соответствие некоторым известным ограничениям.Поскольку мы выбираем случайное число между -1 и 1, если мы достигаем -1,2 или +1,2, мы можем считать это ошибкой, поскольку это определенно идет в неправильном направлении. В этом случае мы устанавливаем вознаграждение равным -1, чтобы обозначить сбой, затем отмечаем выполненное как истинное, чтобы агент мог выполнить сброс и повторить попытку.
Затем, наконец, мы проверяем, находится ли currentNumber в пределах 0,01 от цели. Если это так, мы считаем это совпадением, устанавливаем награду 1,0 за успех и отмечаем его как выполненное. Мы также увеличиваем решенный счетчик для целей отладки (приятно видеть, сколько раз это было успешным).
Вот полный сценарий:
Когда сценарий готов, нам нужно создать новый игровой объект и назвать его NumberDemoAgent.
Прикрепите к нему скрипт NumberDemoAgent и назначьте мозг.
Затем создайте объект Text и разместите его там, где вы его видите (в идеале, большой посередине экрана).
Назначьте объект text для NumberDemoAgent .
Создайте , Cube и Sphere и также назначьте для NumberDemoAgent (это поможет вам увидеть, что происходит, намного проще, чем читать #s).
Теперь нажмите кнопку воспроизведения. У вас должна быть возможность перемещать куб влево и вправо с помощью двух горячих клавиш (помните, я использовал горячие клавиши A и B).
Когда вы поднесете ящик к сфере, он должен увеличить вычисленное значение и сбросить его. Если вы зайдете слишком далеко в неправильном направлении, он также должен сброситься (помните, что 1.2 предел).
Когда он заработает в режиме проигрывателя, выберите мозг и измените « Тип мозга » на « Внешний »
Сохраните вашу сцену и создайте исполняемый файл, в который включена только сцена (с включенным режимом отладки).
В качестве выходной папки выберите подкаталог python проекта ml-agent (включается при загрузке или клонировании исходного проекта). Например, мой находится здесь: C: \ ml-agent \ python.
Запомните имя, которое вы даете, оно вам понадобится через минуту.
Анаконда / Jupyter
Запустить командную строку анаконды.
Измените каталог на папку python, в которую вы только что встроили. напр. «Cd c: \ ml-agent \ python»
Введите и введите команду « jupyter notebook » (возможно, вам придется нажать Enter второй раз, кстати)
Вскоре после этого вам должен быть предложен веб-интерфейс, который выглядит следующим образом:
Измените выделенные части, чтобы они совпадали. В env_name не указывайте просто «numberdemo», используйте имя, с которым вы создали свой исполняемый файл.Buffer_size и batch_size, которые вы можете скопировать (важно отметить, что эти # были обнаружены только путем тестирования / попытки, даже после того, как он заработал, я все еще почти не понимаю, что с ними происходит).
После того, как вы закончите редактировать гиперпараметры, выполните шаги по порядку.
Начните с шагов 1 и 2. (* исчезнет, а в [*] появится знак #.
Когда вы запустите шаг 3, вы должны увидеть окно для вашей игры (хотя и маленькое). В первый раз вы, вероятно, также увидите диалоговое окно разрешений Windows, убедитесь, что оно разрешено.
Как только вы начнете шаг 4… ПОДОЖДИТЕ ... и посмотрите, как появятся результаты (первый может занять минуту, так что наберитесь терпения)
После того, как он был сохранен пару раз, нажмите кнопку остановки. Затем перейдите к шагу 5 и запустите его. Это позволит экспортировать данные обучения в файл с расширением .bytes в подпапке «python / models / ppo».
Скопируйте файл с расширением .bytes (опять же, он будет назван в соответствии с именем вашего исполняемого файла) и поместите его в свой проект Unity.
Выберите мозг и установите «Тип мозга» на «Внутренний».
Назначьте файл .bytes полю «Модель графика».
Сохраните и нажмите play !
Это довольно простой пример, призванный помочь получить общее представление о том, как работает эта система. Я рад видеть, к чему это приведет, и создавать более крупные и интересные проекты для управления игровым ИИ и создания интересного игрового процесса / ботов.
Unity ML Agents GitHub - https://github.com/Unity-Technologies/ml-agents
HyperParameters Doc - https: // github.com / Unity-Technologies / ml-agent / blob / master / docs / best-practices-ppo.md
Плейлист для машинного обучения - https://www.youtube.com/watch? V = qxicgknzUG8 & list = PLB5_EOMkLx_Ub1A4iHoDUx7vg37sVoL-E