bookweb - Программирование (под Desktop и Android)Онлайн записная книжка Николая Вовк2023-10-20T23:53:47+03:00http://dyvniy.ru/forum/feed.php?f=42023-10-20T23:53:47+03:002023-10-20T23:53:47+03:00http://dyvniy.ru/forum/viewtopic.php?t=648&p=3675#p3675За их простой понятный и лаконичный интерфейс, за привычность пространств, воспринимаемых лишь с одного ракурса и общую схематичность. Но современные игры, даже инди игры, должны сответсвовать современным требованиям. Трёхмерности и неприерывности. Поэтому будет хорошо, если игра на первом этапе знакомства, в стандартных инструментах будет казаться максимально простой - двумерной и дискретной, а на долее подних этапах раскрываться во всей красе.
]]>2023-05-13T19:01:33+03:002023-05-13T19:01:33+03:00http://dyvniy.ru/forum/viewtopic.php?t=643&p=3638#p3638они будут показывать мир в своём масштабе и каждый будет создаржать коэффициенты пропорциональности. При этом каждый микросервис будет отвечать за свою часть пространства и масштаба, поэтому пространства будут перекрываться. Один большой для всей планеты. Потом 8 для её пространственных секторов, А дальше каждый сектор будет делиться на 4 сервера по двумерным координатам широты-долготы, Потмоу что число объектов в воздухе не будет больше чем на земле. А если будет - высоты тоже разделим на микросервисы.
]]>2023-05-01T23:50:46+03:002023-05-01T23:50:46+03:00http://dyvniy.ru/forum/viewtopic.php?t=643&p=3632#p3632То есть нужна вся Земля, полёты над ней, поездки по и всевозможное строительство. А так же бои как в GTA V. Наземные и воздушные, может и подводные получится устроить. Я так же уверен, что необходимо имет ьвозможность запускать оффлайн версию игры, где весь мир симулирует твой комп, в меру сових возможностей. Дополнением к этой виртуальной реальности могла бы стать максимально реалистичная симуляция боевых действий. На всех уровнях, от конкретного бойца, до командующего армиями. Все эти масштабы раскрыты в различных играх, но чтобы всё было вместе я пока не видел.
]]>2023-04-13T16:27:28+03:002023-04-13T16:27:28+03:00http://dyvniy.ru/forum/viewtopic.php?t=643&p=3629#p36291. Реализую функционал как получится. 2. Привожу код в порядок, чтобы с ним было приятно работать. 3. Повторить с начала.
Первым делом хочется сделать аналог гугл Ёс (Земля по пендосски). С режимом полёта. Возможно на разных самолётах.
]]>2023-04-03T20:36:29+03:002023-04-03T20:36:29+03:00http://dyvniy.ru/forum/viewtopic.php?t=643&p=3628#p3628freestorio, потому что претендую на лавры факторио и сатисфэктори, и хочу совместить лучшее в этих играх. Акцент на крафтигн будет делаться не из подражания, а потму что индустриальное производство - это суть современной технологической цивилизации, основа её успехов.
]]>2023-04-01T10:20:41+03:002023-04-01T10:20:41+03:00http://dyvniy.ru/forum/viewtopic.php?t=643&p=3627#p3627Так как танки меня особо достают, в очередной раз возникла идея сделать на них пародию. Мир, где всякие геометрические фигуры с башнями и пушками будут воевать. Со временем на эти фигуры будут натягиваться "реалистичные" скины для потехи.
Картами будут Мухосранка, Парин и Вагина. Будет максимально идиотскаий Реликий Рукожопый Матчмэйкер (ВРМ), турбосливы с турбовинами, подкрученная статистика и толпы ботов.
]]>2023-03-22T12:19:31+03:002023-03-22T12:19:31+03:00http://dyvniy.ru/forum/viewtopic.php?t=643&p=3625#p3625Геоинформационные системы активно развиваются. Хуже, чем компьютерные игры, и это странно. Дополненная реальность хороша в фантастике, но гугл ай провалился. К тому же он уродует человека - учит глаза смотреть в разные стороны. И я не знаю, был ли настоящий успех у Second Life. Это была революционная технология, которая выродилась в плоские социальные сети. Сейчас актуален web 3.0 - польностью распределённый, независимый от серверов. А значит и не требующий денег. Почему-то я слышал, что типичным его примером являются блокчейны - биткойи с эфириумом, когда по мне лучши пример - это торрент. Неубиваемый файлообменник, часто нелегальный.
Так вот, мне хочется объединить всё это вместе. Даже взять элемент нелюбимых мной блокчейнов - для финансовых операций, объекты по-прежнему можно копировать. Для реализации проекта надо составить план. Чтобы от не отталкиваться, модифицировать.
]]>2023-01-13T12:17:15+03:002023-01-13T12:17:15+03:00http://dyvniy.ru/forum/viewtopic.php?t=565&p=3619#p3619https://chat.openai.com/chat
def clsc(): global buf buf = [] for i in range(n): buf.append('<'+' '*m+'>')
def prnt(buf): for i in range(n): print(buf[i]) print('='*m)
def copy(smbl, pos): global buf for i in range(len(smbl)): for j in range(len(smbl[i])): k = j+pos[1] if k >= m or i+pos[0] >= n: continue s = buf[i+pos[0]] buf[i+pos[0]] = s[0:k-1] + smbl[i][j] + s[k:] return buf
figures = [['**', '**'], ['** ', ' **'], ['***', ' * ']] alive = [] for i in range(100): clsc() if i % 10 == 0: alive.append([figures[i/10%3], -i, 10]) for a in alive: copy(a[0], [a[1]+i, a[2]]) prnt(buf) time.sleep(1)
Windows – Cannot cannot shrink a volume beyond the point where any unmovable files are located Posted on October 25, 2016 by Sysadmin SomoIT
I finally received my new Dell Inspiron 15 Serie 5000 with a 1TB hard disk!
Contents [hide]
1 Target 2 Problem / Error 3 Analysis 4 Solution 4.1 1. Disable HIBERNATION 4.2 2. Disable PAGEFILE 4.3 3. Disable SYSTEM PROTECTION 4.4 3. RESTART AND SHRINK 4.5 4. ENABLE HIBERNATION 4.6 5. ENABLE PAGEFILE 4.7 6. ENABLE SYSTEM PROTECTION 5 Problem solved Target I would like (maybe very shortly) to move the system and applications to a new SSD drive (perhaps 120GB or 240GB size). So, given that the C: (system) partition has only 30 GB used (~896 GB of total size), one of the first configurations I wanted to do with my new laptop was shrinking this partition to 120 GB.
To upgrade to a SSD drive, follow this step by step tutorial by following this link: HW – Upgrade laptop with an SSD drive
Problem / Error The problem was that, after performing the shrinking, I could reduce the size only to ~460GB (not enough for my purposes). C: size before shrinking Maybe after running a defragmentation process I could try to shrink. So i ran the process and when trying to reduce the size again, it still didnt allow a single MB more… You cannot shrink a volume beyond the point where any unmovable files are located ..and still showing the message “You cannot shrink a volume beyond the point where any unmovable files are located. See the ‘defrag’ event in the Application log for detailed information about the operation when it has completed”
Analysis Now that the partition is defragmented, the “unmovable files” could be any of the following (probably located in C:): Hibernation – “hibernate.sys” Pagefile – “pagefile.sys” System protection – “System Volume Information” folder The ‘defrag’ events showed the following: Defrag Event ID 259 unmovable files
So, the problem (at least one of them) seems to be a file in “System Volume Information”.
Solution Temporary i had to disable the System protection configured against C: Anyway, the hibernation and pagefile could afterwards lead to the same error, so I decided to disable all of them:
3. Disable SYSTEM PROTECTION C:\> SystemPropertiesProtection.exe Disable system protection
3. RESTART AND SHRINK After restarting the system, the changes were applied. I could then shrink to the size I wanted! Shrinking is now possible It is critical to reenable the features after the resizing is made (the following steps)…
6. ENABLE SYSTEM PROTECTION C:\> SystemPropertiesAdvanced.exe Reenable system protection
Problem solved 3rd party tools are able to manage these “unmovable files” but if you want to avoid using one of those solutions, simply by disabling temporary these features the shrinking you want could be possible.
Now Im ready to migrate my 120GB system partition to a SSD drive when needed
Включаем дедупликацию в Windows 10 Автор: Уваров А.С. 12.07.2020 win10-deduplication-000.pngТехнология дедупликации давно известна пользователям серверных редакций Windows и широко используется системными администраторами, позволяя эффективно использовать дисковое пространство. В клиентских системах данная возможность отсутствует, так как домашние сценарии не предусматривают хранение больших массивов данных, однако может быть легко добавлена, что, несомненно, окажется полезным для специалистов и компьютерных энтузиастов.
Курс по сетевым технологиям от Дмитрия Скоромнова подойдет и начинающим, и людям с опытом. Практикующие системные администраторы упорядочат свои знания и восполнят существующие пробелы. А те, кто только входит в профессию, получат базовые знания, без воды и избыточной теории. После обучения вы сможете ответить на вопросы:
• на каком уровне модели OSI могут работать коммутаторы? • как лучше организовать работу сети организации с множеством отделов? • для чего использовать технологию VLAN? • для чего сервера стоит выносить в DMZ? • как организовать объединение филиалов и удаленный доступ сотрудников по VPN? и многие другие.
Уже знаете ответы на вопросы, перечисленные выше? Или сомневаетесь? Попробуйте пройти тест по основам сетевых технологий. Всего 53 вопроса, в один цикл теста входит 10 вопросов. Каждый раз набор вопросов разный. Тест можно проходить неоднократно без потери интереса. Бесплатно и без регистрации.
Мы уже рассказывали, как включить дедупликацию в Windows 8, что позволило многим, и нам в том числе, сэкономить заметные средства, отложив расширение дискового пространства за счет более эффективного его использования.
Windows 10 в момент выпуска такой возможности не имела, что легко объясняется: пакеты для дедупликации энтузиасты берут из серверной версии ОС, разработка которой производится с некоторым опозданием от клиентской. Это же следует учитывать и при обновлении ОС на новую версию, так на дату выпуска пакеты для дедупликации могут быть еще не готовы.
Следует помнить, что в отличии от предыдущих версий под названием Windows 10 скрывается целый ряд операционных систем, для каждой из которых нужны свои пакеты для поддержи дедупликации. На текущий момент существуют следующие стабильные выпуски Windows 10:
ВерсияСборкаДата выпускаОкончание поддержкиДедупликация 1507 (RTM)1024029.07.201509.05.2017НЕТ 15111058612.11.201510.10.2017ДА 16071439302.08.201610.04.2018ДА 17031506305.04.201709.10.2018ДА 17091629917.10.201709.04.2019ДА 18031713430.04.201812.10.2019ДА 18091776313.11.201810.11.2020ДА 19031836221.05.201908.12.2020ДА 19091836312.11.201911.05.2021ДА 20041904127.05.202014.12.2021ДА Здесь мы говорим об основной основном канале поддержки SAC (Semi-Annual Channel, Полугодовой канал) и не касаемся LTSC-версий, которые не предназначены для широкого использования.
Первая сборка пакетов для дедупликации в Windows 10 была собрана из пакетов для Windows Server 2012 и предназначалась для сборки 10514, затем стали доступны пакеты на базе Windows Server 2016 (14393) и 2019 (17763). В настоящий момент Windows Server с возможностями рабочего стола переведен в LTSC-канал (не путать с одноименным каналом Windows 10) и новые версии выпускаются раз в два три года. В полугодовом канале обслуживания (SAC) находится просто Windows Server без номера года, который не имеет возможностей рабочего стола и предназначен в первую очередь для быстрого внедрения инноваций в области контейнеров и микрослужб.
Таким образом все промежуточные версии Windows 10, не имеющие LTSC-аналога серверной системы получают пакеты дедупликации из полугодового канала. Чем это может быть чревато? Прежде всего стабильностью, так как SAC-версии Windows сервер не предполагают использования в системах с возможностями рабочего стола и на текущий момент известно об определенных проблемах с пакетами для версии 20.04, которые на одной системе могут работать, а на другой - не работать.
Отдельно следует уточнить насчет инсайдерской версии. В ней дедупликация работать не будет. Поэтому выбирайте то, что вам нужнее.
Кроме того, многих интересует вопрос: что будет с дедуплицированными томами при обновлении с Windows 8 или между версиями Windows 10. Отвечаем: ничего страшного не произойдет, но ваши данные окажутся недоступны до тех пор, пока вы не установите пакеты для текущей сборки ОС.
Важно! Дедупликация в Windows 10 не является документированной функцией и может работать некорректно (либо не работать вообще) и, хотя большинство сценариев не несет угроз целостности данных, они могут оказаться недоступными, в т.ч. и на длительное время. Поэтому используйте данную возможность исключительно на свой страх и риск.
Так как основное обсуждение дедупликации в Windows 10 и размещение пакетов происходят на зарубежном форуме, а многие ссылки ведут на файлообменники мы перепаковали содержимое пакетов и разместили их на собственном сервере.
Windows 10 1511 (10586)
Windows 10 1607 (14393)
Windows 10 1703 (15063)
Windows 10 1709 (16299)
Windows 10 1803 (17134)
Windows 10 1809 (17763)
Windows 10 1903/1909 (18362)
Windows 10 2004 (19041)
Каждый архив содержит основные и языковые пакеты, мы оставили только en-US и ru-RU, устанавливать следует какой-то один.
Для установки откройте командную строку от имени Администратора, перейдите в каталог с распакованными пакетами и выполните приведенные ниже команды, в данном примере мы будем устанавливать пакеты для 2004 русской версии:
dism /online /add-package /packagepath:Microsoft-Windows-FileServer-ServerCore-Package~31bf3856ad364e35~amd64~~10.0.19041.1.cab /packagepath:Microsoft-Windows-FileServer-ServerCore-Package~31bf3856ad364e35~amd64~ru-RU~10.0.19041.1.cab dism /online /add-package /packagepath:Microsoft-Windows-Dedup-Package~31bf3856ad364e35~amd64~~10.0.19041.1.cab /packagepath:Microsoft-Windows-Dedup-Package~31bf3856ad364e35~amd64~ru-RU~10.0.19041.1.cab dism /online /enable-feature /featurename:Dedup-Core /all Для установки других версий или языков соответствующим образом измените команды. Наименования пакетов отличаются только номером сборки и указателем языка.
win10-deduplication-001-1.png
Сразу после установки пакетов дедуплицированные данные снова станут доступны, перезагрузка не требуется. Для управления дедупликацией в Windows 10 нет графических инструментов, поэтому воспользуемся PowerShell.
Если вы впервые включили дедупликацию, то следует импортировать модуль PowerShell, для этого запустите консоль PowerShell от имени администратора выполните следующие команды:
Set-ExecutionPolicy ByPass -Force Import-Module Deduplication Теперь, например, можно проверить наличие дедуплицированных томов и их состояние:
Get-DedupVolume win10-deduplication-002.png
Но не будем забегать вперед и начнем сначала. Для включения дедупликации воспользуйтесь командой:
Enable-DedupVolume -Volume E: Запущенная без параметров данная команда установит тип использования тома "по умолчанию", который подходит для общего применения, однако тип использования можно указывать явно, допустимы следующие значения:
HyperV - тома для хранения виртуальных машин Hyper-V. Backup -том оптимизирован для виртуализированных серверов резервного копирования. Default - том общего назначения. Это значение по умолчанию. Например, данная команда включит виртуализацию с типом использования Hyper-V или сменит его, если дедупликация для данного тома уже включена:
Обратите внимание, что данная команда только включает дедупликацию, но не производит ее, ваши данные будут оставаться неоптимизированными до тех пор, пока не будет выполнено задание оптимизации (вручную или по расписанию).
Но перед тем, как запускать задание стоит выполнить более тонкую настройку процесса дедупликации, во-первых, установим минимальный возраст данных для дедупликации, чем он ниже, тем эффективнее процесс, но тем выше нагрузка на систему (задание по оптимизации выполняется каждый час). Например, установим данное значение в 0, т.е. оптимизироваться будут все данные:
Set-DedupVolume -Volume E: -MinimumFileAgeDays 0 Вторая полезная опция - минимальный размер дедуплицируемого файла, на томах с виртуальными машинами имеет смысл установить это значение таким образом, чтобы дедупликации подвергались виртуальные диски, но не затрагивались мелкие файлы конфигурации. Размер устанавливается в байтах, т.е. установить 512 МБ следует командой:
Set-DedupVolume -Volume E: -MinimumFileSize 536870912 Опции командлета Set-DedupVolume можно сочетать, т.е. сразу установить и минимальный размер, и минимальное время. Еще одна полезная опция - исключения, например, следующая команда исключит из процесса дедупликации папку E:\Folder1:
Set-DedupVolume -Volume E: -ExcludeFolder E:\Folder1 Путь следует указывать полностью, несколько значений разделяются запятыми, если путь содержит пробелы, то его следует взять в кавычки. Повторный запуск команды перезаписывает параметры. Важно понимать этот момент, так как если вы позже захотите добавить в исключения еще и E:\Folder2, то команда должна выглядеть так:
Set-DedupVolume -Volume E: -ExcludeFolder E:\Folder1, E:\Folder2 В противном случае вы Folder2 в список исключений добавите, а Folder1 удалите.
Аналогичным образом можно задать исключения по типам файлов, для этого укажите нужные расширения (без точки) через запятую, например, исключим временные файлы и сигнальные lck-файлы:
Set-DedupVolume -Volume E: -ExcludeFileType tmp, lck После того, как все необходимые настройки выполнены, можно запускать процесс оптимизации, для этого предназначена команда:
Start-DedupJob -Volume E: -Type Optimization Проконтролировать ход выполнения задания можно командой:
Get-DedupJob win10-deduplication-004.pngТаким образом можно выполнять не только оптимизацию, данный командлет поддерживает следующие виды задач:
Optimization -запуск процесса дедупликации данных. Garbage Collection - применяется для очистки всех неиспользуемых или удаленных данных. Scrubbing - проверка целостности дедуплицированных данных. Unoptimization - запуск процесса отмены дедупликации данных. Первоначальный процесс оптимизации может занять продолжительное время, создавая при этом достаточно большую нагрузку на диск, учитывайте это. Скорость дедупликации на практике находится в пределах 20-40 МБ/с, так что необходимое время можно достаточно точно рассчитать и спланировать.
Стоит ли овчинка выделки? Однозначно стоит, ниже приведен результат дедупликации нашего хранилища виртуальных машин:
win10-deduplication-005.pngЕсли бы не данная технология, то нам давно бы пришлось топать за новыми дисками вдвое большего объема.
Закончив с дедупликацией, не забудьте проверить и откорректировать расписание регламентных заданий, некоторые из них запланированы на глубокую ночь, когда рабочая станция будет гарантировано выключена, поэтому перенесите их на рабочее время.
win10-deduplication-006.pngЕсли вам потребуется отключить дедупликацию тома, то сначала необходимо выполнить обратный оптимизации процесс, который вернет все данные на свои места. Если свободного места не хватит, то процесс будет приостановлен.
Start-DedupJob -Volume E: -Type Unoptimization После того как дедупликация данных будет отменена можно будет выключить этот режим для тома, для этого выполните:
Disable-DedupVolume -Volume E: Как видим, благодаря энтузиастам, мы вполне успешно можем использовать все преимущества дедупликации в среде настольных ОС, а некоторая сложность установки и управления с лихвой компенсируется экономией дискового пространства. Да и возможность эта востребована в основном специалистами или энтузиастами, для которых работа в командной строке не является чем-то экзотическим.
Туториал по Unreal Engine: C++ Разработка игр * Unreal Engine * Перевод Автор оригинала: Tommy Tran image
Blueprints — очень популярный способ создания геймплея в Unreal Engine 4. Однако если вы уже давно программируете и предпочитаете код, то вам идеально подойдёт C++. С помощью C++ можно даже вносить изменения в движок и создавать собственные плагины.
В этом туториале вы научитесь следующему:
Создавать классы C++ Добавлять компоненты и делать их видимыми для Blueprints Создавать класс Blueprint на основе класса C++ Добавлять переменные и делать их изменяемыми из Blueprints Связывать привязки осей и действий с функциями Переопределять функции C++ в Blueprints Связывать событие коллизии с функцией
Стоит учесть, что это не туториал по изучению C++. Мы сосредоточимся на работе с C++ в контексте Unreal Engine.
Примечание: в этом туториале подразумевается, что вы уже знакомы с основами Unreal Engine. Если вы новичок в Unreal Engine, то сначала изучите состоящий из десяти частей туториал по Unreal Engine для начинающих.
Приступаем к работе
Если вы ещё этого не сделали, то вам понадобится установить Visual Studio. Выполните инструкции из официального руководства Epic по настройке Visual Studio для Unreal Engine 4. (Вы можете использовать альтернативные IDE, но в этом туториале применяется Visual Studio, потому что Unreal рассчитан на работу с ним.)
Затем скачайте заготовку проекта и распакуйте её. Перейдите в папку проекта и откройте CoinCollector.uproject. Если приложение попросить пересобрать модули, то нажмите Yes.
Закончив с этим, вы увидите следующую сцену:
В этом туториале мы создадим шар, который будет перемещать игрок, чтобы собрать монеты. В предыдущих туториалах мы использовали управляемых игроком персонажей с помощью Blueprints. В этом туториале мы создадим его с помощью C++.
Создание класса C++
Для создания класса C++ перейдите в Content Browser и выберите Add New\New C++ Class.
После этого откроется C++ Class Wizard. Во-первых, нужно будет выбрать, от какого класса мы будем наследовать. Поскольку класс должен быть управляемым игроком, нам понадобится Pawn. Выберите Pawn и нажмите Next.
На следующем экране можно указать имя и путь к файлам .h и .cpp. Замените Name на BasePlayer и нажмите на Create Class.
При этом будут созданы файлы и скомпилирован проект. После компиляции Unreal откроет Visual Studio. Если BasePlayer.cpp и BasePlayer.h не будут открыты, то перейдите в Solution Explorer и откройте их. Они находятся в папке Games\CoinCollector\Source\CoinCollector.
Прежде чем двигаться дальше, вам нужно узнать о системе рефлексии Unreal. Эта система управляет различными частями движка, такими как панель Details и сборка мусора. При создании класса с помощью C++ Class Wizard движок Unreal добавляет в заголовок три строки:
Движку Unreal нужны эти строки, чтобы класс был видим системе рефлексии. Если вам это не понятно, то не волнуйтесь. Вам достаточно только знать, что системе рефлексии позволяет делать такие вещи, как раскрытие функций и переменных Blueprints и редактору.
Вы можете также заметить, что класс называется ABasePlayer, а не BasePlayer. При создании класса типа actor Unreal ставит перед названием класса префикс A (от слова actor). Чтобы система рефлексии могла работать, ей нужно, чтобы классы имели соответствующие префиксы. Подробнее прочитать о префиксах можно в Стандарте оформления кода Epic.
Примечание: префиксы не отображаются в редакторе. Например, если вам нужно создать переменную типа ABasePlayer, то нужно искать BasePlayer.
Это всё, что вам пока нужно знать о системе рефлексии. Теперь нам нужно добавить модель игрока и камеру. Для этого нужно использовать компоненты.
Добавление компонентов
Для Pawn игрока нам нужно добавить три компонента:
Static Mesh: он позволит выбрать меш, являющийся моделью игрока Spring Arm: этот компонент используется в качестве штатива камеры. Один конец будет прикреплён к мешу, а к другому будет прикреплена камера. Camera: Unreal показывает игроку всё, что видит камера.
Во-первых, нам нужно добавить заголовки для каждого типа компонента. Откройте BasePlayer.h и добавьте над #include "BasePlayer.generated.h" следующие строки:
Использованное здесь имя будет именем компонента в редакторе. В нашем случае компоненты будут отображаться как Mesh, SpringArm и Camera.
Далее нам нужно сделать каждую переменную видимой для системы рефлексии. Для этого добавим над каждой переменной UPROPERTY(). Теперь код должен выглядеть вот так:
UPROPERTY() UStaticMeshComponent* Mesh;
UPROPERTY() USpringArmComponent* SpringArm;
UPROPERTY() UCameraComponent* Camera;
Также можно добавить к UPROPERTY() описатели (specifiers). Они будут управлять поведением переменной в различных аспектах движка.
Добавьте VisibleAnywhere и BlueprintReadOnly внутри скобок каждого UPROPERTY(). Отделите каждый описатель запятой.
UPROPERTY(VisibleAnywhere, BlueprintReadOnly)
VisibleAnywhere позволит каждому компоненту быть видимым в редакторе (в том числе и в Blueprints).
BlueprintReadOnly позволит получать ссылку на компонент с помощью нодов Blueprint. Однако он не позволит нам задавать компонент. Для компонентов важно быть read-only, потому что их переменные являются указателями. Мы не хотим, чтобы пользователи задавали их, иначе они могут указать на случайное место в памяти. Стоит заметить, что BlueprintReadOnly всё-таки позволяет задавать переменные внутри компонента, и именно к такому поведению мы стремимся.
Примечание: Для переменных, не являющихся указателями (int, float, boolean и т.д.) используйте EditAnywhere и BlueprintReadWrite.
Теперь, когда у нас есть переменные для каждого компонента, нам нужно их инициализировать. Для этого необходимо создать их внутри конструктора.
Инициализация компонентов
Для создания компонентов можно использовать CreateDefaultSubobject<Type>("InternalName"). Откройте BasePlayer.cpp и добавьте в ABasePlayer() следующие строки:
Mesh = CreateDefaultSubobject<UStaticMeshComponent>("Mesh"); SpringArm = CreateDefaultSubobject<USpringArmComponent>("SpringArm"); Camera = CreateDefaultSubobject<UCameraComponent>("Camera");
Это создаст компонент каждого типа, а затем назначит их адрес в памяти переданной переменной. Аргумент-строка будет внутренним именем компонента, используемым движком (а не отображаемым именем, несмотря на то, что в нашем случае они одинаковы).
Затем нам нужно настроить иерархию (выбрать корневой компонент и так далее). Добавьте после предыдущего кода следующее:
Первая строка сделает Mesh корневым компонентом. Вторая строка прикрепит SpringArm к Mesh. Наконец, третья строка прикрепит Camera к SpringArm.
После завершения кода компонентов нам нужно выполнить компиляцию. Выберите один из следующих способов компиляции:
В Visual Studio выберите Build\Build Solution В Unreal Engine нажмите на Compile в Toolbar
Затем нам нужно указать, какой меш использовать и поворот пружинного рычага. Рекомендуется делать это в Blueprints, потому что нежелательно жёстко указывать пути к ресурсам в C++. Например, в C++ для задания статичного меша нужно сделать нечто подобное:
Однако в Blueprints достаточно будет просто выбрать меш из раскрывающегося списка.
Если вы переместите ресурс в другую папку, в Blueprints ничего не испортится. Однако в C++ придётся менять каждую ссылку на этот ресурс.
Чтобы задать поворот меша и пружинного рычага в Blueprints, нужно будет создать Blueprint на основании BasePlayer.
Примечание: Обычно практикуется создание базовых классов в C++ с последующим созданием подкласса Blueprint. Это упрощает изменение классов для художников и дизайнеров.
Выделение подклассов классов C++
В Unreal Engine перейдите в папку Blueprints и создайте Blueprint Class. Разверните раздел All Classes и найдите BasePlayer. Выберите BasePlayer, а затем нажмите на Select.
Переименуйте его в BP_Player, а затем откройте.
Сначала мы зададим меш. Выберите компонент Mesh и задайте для его Static Mesh значение SM_Sphere.
Затем нам нужно задать поворот и длину пружинного рычага. Наша игра будет с видом сверху, поэтому камера должна быть над игроком.
Выберите компонент SpringArm и задайте для Rotation значение (0, -50, 0). Это повернёт пружинный рычаг так, что камера будет смотреть на меш сверху вниз.
Поскольку пружинный рычаг является дочерним элементом меша, он начинает вращаться, когда начинает вращаться шар.
GIF
Чтобы исправить это, нам нужно сделать так, чтобы поворот рычага был абсолютным. Нажмите на стрелку рядом с Rotation и выберите World.
GIF
Затем задайте для Target Arm Length значение 1000. Так мы отдалим камеру на 1000 единиц от меша.
Затем нужно задать Default Pawn Class, чтобы использовать наш Pawn. Нажмите на Compile и вернитесь в редактор. Откройте World Settings и задайте для Default Pawn значение BP_Player.
Нажмите на Play, чтобы увидеть Pawn в игре.
Следующим шагом будет добавление функций игроку, чтобы он мог перемещаться.
Реализация движения
Вместо того, чтобы добавлять для движения смещение, мы будем двигаться с помощью физики! Сначала нам нужна переменная, указывающая величину прикладываемой к шару силы.
Вернитесь в Visual Studio и откройте BasePlayer.h. Добавьте после переменных компонентов следующее:
EditAnywhere позволяет изменять MovementForce в панели Details. BlueprintReadWrite позволит задавать и считывать MovementForce с помощью нодов Blueprint.
Далее нам нужно создать две функции. Одну для движения вверх-вниз, другую — для движения влево-вправо.
Создание функций движения
Добавьте под MovementForce следующие объявления функций:
Позже мы свяжем с этими функциями привязки осей. Благодаря этому привязки осей смогут передавать свой scale (поэтому функциям нужен параметр float Value).
Примечание: Если вы незнакомы с привязками осей и scale, изучите туториал про Blueprints.
Теперь нам нужно создать реализацию для каждой функции. Откройте BasePlayer.cpp добавьте в конец файла следующее:
MoveUp() добавляет физическую силу для Mesh по оси X. Величина силы задаётся MovementForce. Благодаря умножению результата на Value (масштаб привязки оси), меш может перемещаться в положительном или отрицательном направлениях.
MoveRight() делает то же самое, что и MoveUp(), но по оси Y.
Закончив создание функций движения, мы должны связать с ними привязки осей.
Связывание привязок осей с функциями
Ради упрощения я уже заранее создал привязки осей. Они находятся в Project Settings, в разделе Input.
Примечание: Привязки осей не обязаны иметь то же название, что и функции, с которыми мы их связываем.
Добавьте внутрь SetupPlayerInputComponent() следующий код:
Первая строка позволит воздействовать на Mesh физическим силам. Вторая строка присваивает MovementForce значение 100000. Это значит, что при движении шару будет прибавлено 100 000 силы. По умолчанию физические объекты весят примерно 110 килограмм, так что для их перемещения потребуется много силы!
Если мы создали подкласс, некоторые свойства не изменятся, даже если мы изменим их в базовом классе. В нашем случае у BP_Player не будет включено Simulate Physics. Однако теперь во всех создаваемых подклассах оно будет включено по умолчанию.
Выполните компиляцию и вернитесь в Unreal Engine. Откройте BP_Player и выберите компонент Mesh. Затем включите Simulate Physics.
Нажмите Compile, а затем на Play. Нажимайте W, A, S и D, чтобы передвигать шар.
GIF
Далее мы объявим функцию C++, которую можно реализовать с помощью Blueprints. Это позволит дизайнерам создавать функционал без использования C++. Чтобы научиться этому, мы создадим функцию прыжка.
Создание функции прыжка
Сначала нам нужно связать привязку прыжка к функции. В этом туториале мы назначим прыжок на клавишу пробела.
Вернитесь в Visual Studio и откройте BasePlayer.h. Добавьте под MoveRight() следующие строки:
Первое — это переменная float с именем JumpImpulse. Мы можем использовать её при реализации прыжка. Она использует EditAnywhere, чтобы её можно было изменять в редакторе. Также в ней используется BlueprintReadWrite, чтобы мы могли считывать и записывать её с помощью нодов Blueprint.
Далее идёт функция прыжка. UFUNCTION() делает Jump() видимой для системы рефлексии. BlueprintImplementableEvent позволяет Blueprints реализовать Jump(). Если реализация отсутствует, то вызовы Jump() ни к чему не приведут.
Примечание: Если вы хотите создать в C++ реализацию по умолчанию, то используйте BlueprintNativeEvent. Ниже мы расскажем о том, как это сделать.
Так как Jump — это привязка действия, способ связывания немного отличается. Закройте BasePlayer.h и откройте BasePlayer.cpp. Добавьте внутрь SetupPlayerInputComponent() следующее:
Так мы свяжем привязку Jump с Jump(). Она будет выполняться только при нажатии клавиши прыжка. Если вы хотите выполнять её при отпускании клавиши, то используйте IE_Released.
Дальше мы переопределим Jump() в Blueprints.
Переопределение функций в Blueprints
Выполните компиляцию и закройте BasePlayer.cpp. Затем вернитесь к Unreal Engine и откройте BP_Player. Перейдите в панель My Blueprints и наведите мышь на Functions, чтобы появился раскрывающийся список Override. Нажмите на него и выберите Jump. Так мы создадим Event Jump.
GIF
Примечание: Переопределение будет событием, если отсутствует возвращаемый тип. Если возвращаемый тип существует, то это будет функция.
Далее мы создадим следующую схему:
Так мы добавим Mesh импульс (JumpImpulse) по оси Z. Учтите, что в этой реализации игрок может прыгать бесконечно.
Далее нам нужно задать значение JumpImpulse. Нажмите на Class Defaults в Toolbar, а затем перейдите к панели Details. Задайте JumpImpulse значение 100000.
Нажмите на Compile, а затем закройте BP_Player. Нажмите на Play и попробуйте попрыгать с помощью клавиши пробела.
GIF
В следующем разделе мы заставим монеты исчезать при контакте с игроком.
Собирание монет
Для обработки коллизий нам нужно связать функцию с событием наложения. Для этого функция должна удовлетворять двум требованиям. Первое — функция должна иметь макрос UFUNCTION(). Второе требование — функция должна иметь правильную сигнатуру. В этом туториале мы будем использовать событие OnActorBeginOverlap. Это событие требует, чтобы у функции была следующая сигнатура:
Так как мы хотим распознавать только наложения игрока, то нужно привести OtherActor к ABasePlayer. Прежде чем выполнить приведение, нам нужно добавить заголовок для ABasePlayer. Добавьте под #include "BaseCoin.h" следующее:
#include "BasePlayer.h"
Теперь нам нужно выполнить приведение. В Unreal Engine приведение можно выполнить так:
Cast<TypeToCastTo>(ObjectToCast);
Если приведение выполнено успешно, то оно вернёт указатель на ObjectToCast. Если неудачно, то оно вернёт nullptr. Проверяя результат на nullptr, мы можем определить, имел ли объект нужный тип.
Добавьте внутрь OnOverlap() следующее:
if (Cast<ABasePlayer>(OtherActor) != nullptr) { Destroy(); }
Теперь, когда OnOverlap() выполняется, она будет проверять, имеет ли OtherActor тип ABasePlayer. Если это так, то она будет уничтожать монету.
Далее нам нужно привязать OnOverlap().
Связывание функции наложения
Чтобы связать функцию с событием наложения, нам нужно использовать с событием AddDynamic(). Добавьте внутрь ABaseCoin() следующее:
Так мы свяжем OnOverlap() с событием OnActorBeginOverlap. Это событие происходит всегда, когда актор накладывается на другого актора.
Выполните компиляцию и вернитесь в Unreal Engine. Нажмите Play и начните собирать монеты. При контакте с монетой она будет уничтожаться, что приводит к её исчезновению.
GIF
Примечание: Если монеты не исчезают, попробуйте перезапустить редактор, чтобы выполнить полную рекомпиляцию. Для работы некоторых изменений требуется перезапуск.
В следующем разделе мы создадим ещё одну переопределяемую функцию C++. Однако на этот раз мы также создадим реализацию по умолчанию. Для демонстрации этого мы воспользуемся OnOverlap().
Создание реализации функции по умолчанию
Чтобы создать функцию с реализацией по умолчанию, нужно использовать описатель BlueprintNativeEvent. Вернитесь в Visual Studio и откройте BaseCoin.h. Добавьте для OnOverlap() в UFUNCTION() BlueprintNativeEvent:
Чтобы сделать функцию реализацией по умолчанию, нам нужно добавить суффикс _Implementation. Откройте BaseCoin.cpp и замените OnOverlap на OnOverlap_Implementation:
Теперь если дочерний Blueprint не реализует OnOverlap(), то будет использована эта реализация.
Следующим этапом будет реализация OnOverlap() в BP_Coin.
Создание реализации в Blueprint
Для реализации в Blueprint мы будем вызывать PlayCustomDeath(). Эта функция C++ увеличит скорость вращения монеты. Через 0,5 секунды монета будет себя уничтожать.
Для вызова функции C++ из Blueprints нам нужно использовать описатель BlueprintCallable. Закройте BaseCoin.cpp и откройте BaseCoin.h. Добавьте над PlayCustomDeath() следующее:
UFUNCTION(BlueprintCallable)
Выполните компиляцию и закройте Visual Studio. Вернитесь к Unreal Engine и откройте BP_Coin. Переопределите On Overlap и создайте следующую схему:
Теперь при наложении игрока на монету будет выполняться Play Custom Death.
Нажмите на Compile и закройте BP_Coin. Нажмите Play и соберите несколько монет, чтобы протестировать новую реализацию.
GIF
Куда двигаться дальше?
Вы можете скачать готовый проект отсюда.
Как вы видите, работать с C++ в Unreal Engine довольно просто. Хотя мы уже добились кое-чего в C++, вам ещё нужно многому научиться! Я рекомендую изучить серию туториалов Epic по созданию с помощью C++ шутера с видом сверху.
Если вы новичок в Unreal Engine, то изучите нашу серию туториалов для начинающих из десяти частей. В этой серии вы познакомитесь с различными системами, такими как Blueprints, материалы и системы частиц. Теги: unreal engine 4c++blueprintsunreal engine
]]>2021-05-14T15:51:10+03:002021-05-14T15:51:10+03:00http://dyvniy.ru/forum/viewtopic.php?t=617&p=3507#p3507 Во вложении - грамота за второе место а Phistech.Genesis 2021