Skip to content

urho3d-learn/editor

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

9 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Π”Π°Π½Π½Ρ‹ΠΉ ΡƒΡ€ΠΎΠΊ являСтся ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΡƒΡ€ΠΎΠΊΠ° ΠŸΠ΅Ρ€Π²Ρ‹Π΅ шаги. Если Π²Ρ‹ с Π½ΠΈΠΌ Π΅Ρ‰Ρ‘ Π½Π΅ ознакомились, Ρ‚ΠΎ Π½Π°Ρ‡Π½ΠΈΡ‚Π΅ с Π½Π΅Π³ΠΎ. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚Π° ΠΆΠ΅ вСрсия Π΄Π²ΠΈΠΆΠΊΠ°.


Π Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ Urho3D

Π’ этом ΡƒΡ€ΠΎΠΊΠ΅ рассмотрим Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€. Он достаточно прост Π² использовании, Π½ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ пояснСний, Π° докумСнтация ΠΈΡ… Π½Π΅ раскрываСт. Ну ΠΈ Π·Π°ΠΎΠ΄Π½ΠΎ напишСм Π½Π΅Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ ΠΈΠ³Ρ€ΡƒΡˆΠΊΡƒ. ΠŸΡ€ΠΈΡΡ‚ΡƒΠΏΠΈΠΌ.

Π Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ Ρ‚ΠΎΠΆΠ΅ ΠΈΠ³Ρ€Π°

Π Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ - это скрипт Π½Π° языкС AngelScript, выполняСмый Π»Π°ΡƒΡ‡Π½Π΅Ρ€ΠΎΠΌ Urho3DPlayer.exe, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΌΡ‹ пользовались Π² ΡƒΡ€ΠΎΠΊΠ΅ ΠŸΠ΅Ρ€Π²Ρ‹Π΅ шаги. А Π·Π½Π°Ρ‡ΠΈΡ‚, Π΅Π³ΠΎ ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΡƒΡ‡Π°Ρ‚ΡŒ наряду с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ ΠΈ, ΠΏΡ€ΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ, Π»Π΅Π³ΠΊΠΎ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Π—Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Π±Π°Ρ‚Π½ΠΈΠΊΠ° build_vs/bin/Editor.bat.

Навигация ΠΏΠΎΠ΄ΠΎΠ±Π½Π° ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΡŽ Π² ΡˆΡƒΡ‚Π΅Ρ€Π΅. W ΠΈ S - ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ Π²ΠΏΠ΅Ρ€Π΅Π΄ ΠΈ Π½Π°Π·Π°Π΄, A ΠΈ D - Π²Π»Π΅Π²ΠΎ ΠΈ Π²ΠΏΡ€Π°Π²ΠΎ, Q ΠΈ E - Π²Π½ΠΈΠ· ΠΈ Π²Π²Π΅Ρ€Ρ…. Π‘ Π·Π°ΠΆΠ°Ρ‚Ρ‹ΠΌ ΡˆΠΈΡ„Ρ‚ΠΎΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ быстрСС. МоТно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ стрСлочки. ЗаТатая правая ΠΊΠ½ΠΎΠΏΠΊΠ° ΠΌΡ‹ΡˆΠΈ позволяСт ΠΏΠΎΠ²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΌΠ΅Ρ€Ρƒ Π² Ρ€Π°Π·Π½Ρ‹Π΅ стороны. ΠŸΡ€ΠΈ Π·Π°ΠΆΠ°Ρ‚ΠΎΠΉ срСднСй ΠΊΠ½ΠΎΠΏΠΊΠ΅ происходит Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ Π²ΠΎΠΊΡ€ΡƒΠ³ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Если ΠΊΡ€ΡƒΡ‚ΠΈΡ‚ΡŒ колёсико, Ρ‚ΠΎ мСняСтся ΡƒΠ³ΠΎΠ» ΠΎΠ±Π·ΠΎΡ€Π° (fov). ΠŸΠΎΠ»Π½Ρ‹ΠΉ список клавиш ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ‚ΡƒΡ‚.

Настройки

View->Editor Settings - настройка отобраТСния ΠΈ управлСния. Для Π»ΡŽΠ±ΠΈΡ‚Π΅Π»Π΅ΠΉ Π‘Π»Π΅Π½Π΄Π΅Ρ€Π° Π΅ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½ΡƒΡŽ раскладку ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹. ΠžΠΏΡ†ΠΈΡ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ слСдуСт ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ - New node mode. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ Ρ€Π΅ΠΆΠΈΠΌ View center. Π’ этом Ρ€Π΅ΠΆΠΈΠΌΠ΅ Π½ΠΎΠ²Ρ‹Π΅ Π½ΠΎΠ΄Ρ‹ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Π² Ρ†Π΅Π½Ρ‚Ρ€Π΅ экрана Π½Π° расстоянии, Π·Π°Π΄Π°Π½Π½ΠΎΠΌ Π² Π³Ρ€Π°Ρ„Π΅ New node distance. Как ΠΏΠΎ ΠΌΠ½Π΅, это Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π½ΠΎ. МнС Π³ΠΎΡ€Π°Π·Π΄ΠΎ большС нравится Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ€Π΅ΠΆΠΈΠΌ - In center. Π’ этом Ρ€Π΅ΠΆΠΈΠΌΠ΅ Π½ΠΎΠ²Ρ‹Π΅ Π½ΠΎΠ΄Ρ‹ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Π² Ρ†Π΅Π½Ρ‚Ρ€Π΅ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ ΠΈ ΠΈΡ… ΠΎΡ‚Ρ‚ΡƒΠ΄Π° ΠΌΠΎΠΆΠ½ΠΎ Π΄Π²ΠΈΠ³Π°Ρ‚ΡŒ Π² Π½ΡƒΠΆΠ½ΠΎΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Π’Ρ€Π΅Ρ‚ΠΈΠΉ Ρ€Π΅ΠΆΠΈΠΌ (Raycast) ΠΏΠΎΡ…ΠΎΠΆ Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π½Π΅ фиксированноС расстояниС, Π° ищСтся пСрСсСчСниС со сцСной.

Π”Π°Π»Π΅Π΅ Π² ΡƒΡ€ΠΎΠΊΠ΅ прСдполагаСтся, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ Ρ€Π΅ΠΆΠΈΠΌ In center.

View->Editor Preferences - настройка интСрфСйса. Из интСрСсного здСсь - Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ язык (русский Π² Ρ‚ΠΎΠΌ числС) ΠΈ Π·Π°Π΄Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ интСрфСйса. Minimum opacity - ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΈ Π²ΠΈΠ΄Π°, Maximum opacity - всё ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅ врСмя. Π― ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽ ΠΎΠ±Π° значСния Π² 1, ΠΈΠ±ΠΎ ΠΎΡ‚Π²Π»Π΅ΠΊΠ°Π΅Ρ‚. ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½ΠΎΠ²Ρ‹Π΅ значСния ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠ»ΠΈΡΡŒ, послС Π²Π²ΠΎΠ΄Π° Π½Π°ΠΆΠΈΠΌΠ°ΠΉΡ‚Π΅ Enter.

ВсС настройки хранятся Π² Ρ„Π°ΠΉΠ»Π΅ c:\Users\ИМЯ_ΠŸΠžΠ›Π¬Π—ΠžΠ’ΠΠ’Π•Π›Π―\AppData\Roaming\urho3d\Editor\Config.xml (Π² Windows). Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠ±Ρ€ΠΎΡΠΈΡ‚ΡŒ настройки, этот Ρ„Π°ΠΉΠ» ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ.

Консоль

ΠŸΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ F1 открываСтся консоль. Она ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π² Π΄Π²ΡƒΡ… Ρ€Π΅ΠΆΠΈΠΌΠ°Ρ…, ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ производится с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠ½ΠΎΠΏΠΊΠΈ Π»Π΅Π²Π΅Π΅ поля Π²Π²ΠΎΠ΄Π°.

Π’ Ρ€Π΅ΠΆΠΈΠΌΠ΅ FileSystem консоль Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΊΠ°ΠΊ обычная командная строка Windows (Ссли Ρƒ вас Windows ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ). НапримСр, Ссли ввСсти notepad.exe, Ρ‚ΠΎ откроСтся Π±Π»ΠΎΠΊΠ½ΠΎΡ‚.

Π’ Ρ€Π΅ΠΆΠΈΠΌΠ΅ Script всС Π²Π²Π΅Π΄Ρ‘Π½Π½Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΈΡΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ΠΎΠΌ AngelScript. НапримСр, ΠΊΠΎΠΌΠ°Π½Π΄Π° log.Write(1+2) Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ 3. Π’ΡƒΡ‚ ΠΌΡ‹ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠΌ ΠΊ пониманию Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π²ΠΎΠ΄ консоли - это Π»ΠΎΠ³. Π‘Π°ΠΌ Π»ΠΎΠ³ Π² тСкстовом Π²ΠΈΠ΄Π΅ записываСтся Π² Ρ„Π°ΠΉΠ» c:\Users\ИМЯ_ΠŸΠžΠ›Π¬Π—ΠžΠ’ΠΠ’Π•Π›Π―\AppData\Roaming\urho3d\logs\Editor.as.log. Он ΠΎΡ‡Π΅Π½ΡŒ сильно Π²Π°ΠΌ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠ΅ скриптов.

ΠŸΠ΅Ρ€Π²Ρ‹Π΅ шаги

Π’ΠΎΠ·ΡŒΠΌΠΈΡ‚Π΅ Π°Ρ€Ρ…ΠΈΠ² assets.zip ΠΈΠ· этого рСпозитория ΠΈ распакуйтС Π΅Π³ΠΎ Π² ΠΏΡƒΡΡ‚ΡƒΡŽ ΠΏΠ°ΠΏΠΊΡƒ с ΠΈΠΌΠ΅Π½Π΅ΠΌ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, game. Π­Ρ‚ΠΎΡ‚ Π°Ρ€Ρ…ΠΈΠ² содСрТит рСсурсы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ понадобятся Π½Π°ΠΌ ΠΏΡ€ΠΈ создании ΠΈΠ³Ρ€Ρ‹: нСсколько ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ, ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹ ΠΊ Π½ΠΈΠΌ ΠΈ ΠΎΠ΄ΠΈΠ½ Π·Π²ΡƒΠΊΠΎΠ²ΠΎΠΉ Ρ„Π°ΠΉΠ».

Π’ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π΅ Π½Π°ΠΆΠΌΠΈΡ‚Π΅ File->Set resource path... ΠΈ ΡƒΠΊΠ°ΠΆΠΈΡ‚Π΅ ΠΏΡƒΡ‚ΡŒ game\GameData\. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ ΠΈΠΌΠ΅Π΅Ρ‚ доступ ΠΊ Ρ‚Ρ€Π΅ΠΌ ΠΏΠ°ΠΏΠΊΠ°ΠΌ с рСсурсами: собствСнныС ΠΏΠ°ΠΏΠΊΠΈ Data ΠΈ CoreData, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ находятся рядом с Π½ΠΈΠΌ, ΠΈ ΠΏΠ°ΠΏΠΊΠ° GameData, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ ΡƒΠΊΠ°Π·Π°Π»ΠΈ.

Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ сцСну

Π’ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ рСсурсов (Resource Browser) Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚Π΅ ΠΏΠ°ΠΏΠΊΡƒ Models ΠΈ ΠΏΠ΅Ρ€Π΅Ρ‚Π°Ρ‰ΠΈΡ‚Π΅ Ground.mdl Π½Π° ΠΊΠΎΡ€Π½Π΅Π²ΡƒΡŽ Π½ΠΎΠ΄Ρƒ Scene Π² ΠΎΠΊΠ½Π΅ Hierarchy.

ΠŸΡ€ΠΈ этом автоматичСски Π±ΡƒΠ΄Π΅Ρ‚ создана новая Π½ΠΎΠ΄Π° с ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠΌ StaticModel (простая модСль Π±Π΅Π· скСлСта). Π’ ΠΎΠΊΠ½Π΅ Attribute inspector Π·Π°Π΄Π°ΠΉΡ‚Π΅ для Π½ΠΎΠ΄Ρ‹ имя Ground, Π½Π°ΠΆΠΌΠΈΡ‚Π΅ ΠΊΠ½ΠΎΠΏΠΊΡƒ Pick Π²ΠΎΠ·Π»Π΅ Π³Ρ€Π°Ρ„Ρ‹ Material ΠΈ Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ Materials/Ground.xml.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ρƒ нас Π΅ΡΡ‚ΡŒ ΠΏΠΎΠ», Π½ΠΎ сцСна ΠΏΠ»ΠΎΡ…ΠΎ освСщСна, поэтому Π΄Π°Π²Π°ΠΉΡ‚Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ источник свСта.

Для Π½Π°Ρ‡Π°Π»Π° создадим Π½ΠΎΠ²Ρ‹ΠΉ ΡƒΠ·Π΅Π». Π’Ρ‹Π΄Π΅Π»ΠΈΡ‚Π΅ ΠΊΠΎΡ€Π½Π΅Π²ΡƒΡŽ Π½ΠΎΠ΄Ρƒ Scene ΠΈ Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ ΠΏΡƒΠ½ΠΊΡ‚ мСню Create->Local node. МоТно Ρ‚Π°ΠΊΠΆΠ΅ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Replicated node. Π’ нашСм случаС Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ Ρ€Π°Π·Π½ΠΈΡ†Ρ‹, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Ρ€Π΅ΠΏΠ»ΠΈΡ†ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Π΅ Π½ΠΎΠ΄Ρ‹ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ сСтСвом взаимодСйствии, Π° с ΡΠ΅Ρ‚ΡŒΡŽ ΠΌΡ‹ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½Π΅ ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΠ΅ΠΌ. Ноды Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π½Π΅ Ρ‡Π΅Ρ€Π΅Π· мСню, Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΏΠ°Π½Π΅Π»ΠΈ Π² Π»Π΅Π²ΠΎΠΉ части Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π°.

Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ новосозданная Π½ΠΎΠ΄Π° Π²Ρ‹Π΄Π΅Π»Π΅Π½Π°, ΠΈ Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ ΠΏΡƒΠ½ΠΊΡ‚ мСню Create->Component->Scene->Light (ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΠΏΡ€ΠΎΠ΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ Π½Π° Π»Π΅Π²ΠΎΠΉ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΏΠ°Π½Π΅Π»ΠΈ). Π’ ΠΎΠΊΠ½Π΅ Attribute inspector Π·Π°Π΄Π°ΠΉΡ‚Π΅ имя для Π½ΠΎΠ΄Ρ‹, Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ Ρ‚ΠΈΠΏ источника Directional (солнСчный свСт), ΡƒΠΊΠ°ΠΆΠΈΡ‚Π΅ ΡΡ€ΠΊΠΎΡΡ‚ΡŒ, ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚, ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ (для Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° источника свСта позиция Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ значСния, Π½ΠΎ ΠΏΠΎΠ΄Π½ΠΈΠΌΠ΅ΠΌ Π½ΠΎΠ΄Ρƒ Π²Ρ‹ΡˆΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ мСшала Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ со сцСной). Π’Π°ΠΊΠΆΠ΅ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ ΠΎΠΏΡ†ΠΈΡŽ Cast Shadows, Ρ‡Ρ‚ΠΎΠ±Ρ‹ источник свСта ΠΌΠΎΠ³ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Ρ‚Π΅Π½ΠΈ.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠ΅ освСщСниС. Π’Ρ‹Π΄Π΅Π»ΠΈΡ‚Π΅ ΠΊΠΎΡ€Π½Π΅Π²ΡƒΡŽ Π½ΠΎΠ΄Ρƒ Scene ΠΈ создайтС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Zone (Create->Component->Scene->Zone). Π—Π°Π΄Π°ΠΉΡ‚Π΅ Ρ†Π²Π΅Ρ‚ Ρ„ΠΎΠ½Π° (Fog Color) ΠΈ Ρ†Π²Π΅Ρ‚ Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠ³ΠΎ освСщСния (Ambient Color). Π­Ρ‚ΠΈ значСния Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли ΠΊΠ°ΠΌΠ΅Ρ€Π° находится Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… Π·ΠΎΠ½Ρ‹, поэтому Ρ€Π°ΡΡˆΠΈΡ€ΡŒΡ‚Π΅ Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ (Bounding Box Min/Max).

Π‘ΠΊΡ€ΠΈΠΏΡ‚Ρ‹

Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Π½ΠΎΠ²ΡƒΡŽ Π½ΠΎΠ΄Ρƒ, Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΠΊ Π½Π΅ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ AnimatedModel (модСль со скСлСтом) ΠΈ ΡƒΠΊΠ°ΠΆΠΈΡ‚Π΅ модСль Models/Cannon.mdl ΠΈ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» Materials/Cannon.xml. Π‘Π΄Π²ΠΈΠ½ΡŒΡ‚Π΅ ΠΏΡƒΡˆΠΊΡƒ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π²Π²Π΅Ρ€Ρ…, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ ΠΎΠΏΡ†ΠΈΡŽ Cast Shadows, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡƒΡˆΠΊΠ° отбрасывала Ρ‚Π΅Π½ΡŒ.

Π”ΠΎΡ‡Π΅Ρ€Π½ΠΈΠ΅ Π½ΠΎΠ΄Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ Π²ΠΈΠ΄ΠΈΡ‚Π΅ Ρƒ ΠΏΡƒΡˆΠΊΠΈ - это встроСнныС Π² модСль кости. Пока Ρ‡Ρ‚ΠΎ Π½Π΅ ΠΎΠ±Ρ€Π°Ρ‰Π°ΠΉΡ‚Π΅ Π½Π° Π½ΠΈΡ… внимания.

Π’ ΠΏΠ°ΠΏΠΊΠ΅ GameData\Scripts создайтС Ρ„Π°ΠΉΠ» Cannon.as со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ содСрТимым:

class Cannon : ScriptObject
{
    // ΠŸΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΈΠ»ΠΈ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ вращСния ΠΏΡƒΡˆΠΊΠΈ
    int direction = 1;

    // Ѐункция вызываСтся ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΊΠ°Π΄Ρ€
    void Update(float timeStep)
    {
        // Π£Π³ΠΎΠ» ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚Π° Π²ΠΎΠΊΡ€ΡƒΠ³ оси x (node ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Π½ΠΎΠ΄Ρƒ, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΈΠΊΡ€Π΅ΠΏΠ»Π΅Π½ скрипт)
        float pitch = node.rotation.pitch;
        
        // МСняСм Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ вращСния, Ссли Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΡƒΠ³Π»Π° Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ Π·Π° Π·Π°Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹
        if (pitch >= 70.0f)
            direction = -1;
        else if (pitch <= -10.0f)
            direction = 1;
        
        pitch += 30.0f * direction * timeStep;
        node.rotation = Quaternion(pitch, 0.0f, 0.0f);
    }
}

Π‘ΠΊΡ€ΠΈΠΏΡ‚Ρ‹ Π»ΡƒΡ‡ΡˆΠ΅ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ Π² ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ΅ UTF-8, Ρ‚ΠΎΠ³Π΄Π° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с ΠΊΠΈΡ€ΠΈΠ»Π»ΠΈΡ†Π΅ΠΉ.

К Π½ΠΎΠ΄Π΅ Cannon Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ScriptInstance (Create->Component->Logic->ScriptInstance). НаТмитС Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ Pick ΠΈ Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ новосозданный Ρ„Π°ΠΉΠ», Π° Π² Π³Ρ€Π°Ρ„Π΅ Class Name Π²Π²Π΅Π΄ΠΈΡ‚Π΅ Cannon (Ρ„Π°ΠΉΠ» ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ нСсколько классов). ПослС Π²Π²ΠΎΠ΄Π° Π½Π΅ Π·Π°Π±ΡƒΠ΄ΡŒΡ‚Π΅ Π½Π°ΠΆΠ°Ρ‚ΡŒ Enter. Если всС сдСлано ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ, Π½ΠΈΠΆΠ΅ ΠΈΠΌΠ΅Π½ΠΈ класса Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΠΎΡΠ²ΠΈΡ‚ΡŒΡΡ пСрСмСнная direction, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ объявили Π² скриптС.

Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»ΡŒ RevertOnPause (Ρ‚Ρ€Π΅Ρ‚ΡŒΡ ΠΊΠ½ΠΎΠΏΠΊΠ° Π½Π° Π²Π΅Ρ€Ρ…Π½Π΅ΠΉ ΠΏΠ°Π½Π΅Π»ΠΈ) Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Π½ ΠΈ Π½Π°ΠΆΠΌΠΈΡ‚Π΅ ΠΊΠ½ΠΎΠΏΠΊΡƒ RunUpdatePlay (пСрвая ΠΊΠ½ΠΎΠΏΠΊΠ° Π½Π° Π²Π΅Ρ€Ρ…Π½Π΅ΠΉ ΠΏΠ°Π½Π΅Π»ΠΈ). ΠŸΡƒΡˆΠΊΠ° Π½Π°Ρ‡Π½Π΅Ρ‚ Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ Ρ‚ΡƒΠ΄Π°-сюда. Для остановки Π½Π°ΠΆΠΌΠΈΡ‚Π΅ RunUpdatePause (срСдняя ΠΊΠ½ΠΎΠΏΠΊΠ°).

Π§Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»ΡŒ RevertOnPause? Если ΠΎΠ½ Π°ΠΊΡ‚ΠΈΠ²Π΅Π½, Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Π΄ запуском состояниС сцСны запоминаСтся, Π° ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ Π½Π° ΠΏΠ°ΡƒΠ·Ρƒ состояниС восстанавливаСтся Π΄ΠΎ исходного. Π­Ρ‚Π° ΠΊΠ½ΠΎΠΏΠΊΠ° Π½Π°ΠΌ Π΅Ρ‰Π΅ пригодится ΠΏΠΎΠ·ΠΆΠ΅.

Π’ процСссС Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½Π΅ Π·Π°Π±Ρ‹Π²Π°ΠΉΡ‚Π΅ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ сцСну (File->Save scene as...) Π² Ρ„Π°ΠΉΠ» GameData/Scenes/Level01.xml.

Π€ΠΈΠ·ΠΈΠΊΠ°

Urho3D ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π΄Π²Π΅ физичСскиС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ: Box2D ΠΈ Bullet. ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π½ΠΈΠΌΠΈ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠΈ, ΠΎΠ΄Π½Π°ΠΊΠΎ пСрвая Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ Π½ΠΎΠ΄ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² плоскости XY, Π° вторая Π² Ρ‚Ρ€Ρ‘Ρ…ΠΌΠ΅Ρ€Π½ΠΎΠΌ пространствС. ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Box2D находятся Π² мСню Create->Component->Physics2D, Π° Bullet - Π² мСню Create->Component->Physics.

Π˜Ρ‚Π°ΠΊ, Ρƒ нас Π΅ΡΡ‚ΡŒ ΠΏΠΎΠ» ΠΈ ΠΏΡƒΡˆΠΊΠ°. Π”Π°Π²Π°ΠΉΡ‚Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π² сцСну ΠΏΡƒΡˆΠ΅Ρ‡Π½ΠΎΠ΅ ядро. Π’ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ рСсурсов (Resource Browser) ΠΎΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ ΠΏΠ°ΠΏΠΊΡƒ Models ΠΈ ΠΏΠ΅Ρ€Π΅Ρ‚Π°Ρ‰ΠΈΡ‚Π΅ Cannonball.mdl Π² ΠΎΠΊΠ½ΠΎ Hierarchy Π½Π° ΠΊΠΎΡ€Π½Π΅Π²ΡƒΡŽ Π½ΠΎΠ΄Ρƒ Scene. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡƒΡˆΠΊΠ° ΠΈ ΠΏΠΎΠ» Π½Π΅ мСшали Ρ€Π°Π±ΠΎΡ‚Π΅, Π² ΠΎΠΊΠ½Π΅ Hierarchy Ρ‰Π΅Π»ΠΊΠ½ΠΈΡ‚Π΅ ΠΏΠΎ ΠΈΡ… Π½ΠΎΠ΄Π°ΠΌ ΠΏΡ€Π°Π²ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ ΠΌΡ‹ΡˆΠΈ ΠΈ Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ Enable/disable. ΠŸΡ€ΠΈ этом ΠΎΠ½ΠΈ исчСзнут со сцСны, Π° Π½ΠΎΠ΄Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠΊΡ€Π°ΡˆΠ΅Π½Ρ‹ Π² красный Ρ†Π²Π΅Ρ‚. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π²Π°ΠΆΠ΄Ρ‹ Ρ‰Π΅Π»ΠΊΠ½ΠΈΡ‚Π΅ ΠΏΠΎ Π½ΠΎΠ΄Π΅ с ядром ΠΈ ΠΎΠ½ΠΎ (ядро) окаТСтся Π² Ρ†Π΅Π½Ρ‚Ρ€Π΅ экрана.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ рСсурсов ΠΎΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ ΠΏΠ°ΠΏΠΊΡƒ Materials ΠΈ ΠΏΠ΅Ρ€Π΅Ρ‚Π°Ρ‰ΠΈΡ‚Π΅ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ StaticModel Π² ΠΎΠΊΠ½Π΅ Hierarchy ΠΈΠ»ΠΈ Π² Π³Ρ€Π°Ρ„Ρƒ Material ΠΎΠΊΠ½Π° Attribute inspector. Π—Π°Π΄Π°ΠΉΡ‚Π΅ Π½ΠΎΠ΄Π΅ имя ΠΈ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ ΠΎΠΏΡ†ΠΈΡŽ Cast Shadows.

Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΠΊ ΠΏΡƒΡˆΠ΅Ρ‡Π½ΠΎΠΌΡƒ ядру ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ RigidBody ΠΈ CollisionShape (Create->Component->Physics). ΠŸΡ€ΠΈ этом ΠΊ сцСнС Π±ΡƒΠ΄Π΅Ρ‚ автоматичСски Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ PhysicsWorld, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ„ΠΈΠ·ΠΈΠΊΠΈ.

RigidBody опрСдСляСт физичСскиС свойства ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π’Π΅Π»Π° Π±Ρ‹Π²Π°ΡŽΡ‚ статичСскиС ΠΈ динамичСскиС. БтатичСскиС Ρ‚Π΅Π»Π° Π½Π΅ΠΏΠΎΠ΄Π²ΠΈΠΆΠ½Ρ‹ ΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ лишь прСпятствиями, Π° динамичСскиС ΠΏΠΎΠ΄Π²Π΅Ρ€ΠΆΠ΅Π½Ρ‹ Π²ΠΎΠ·Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡŽ Π²Π½Π΅ΡˆΠ½ΠΈΡ… сил (Π³Ρ€Π°Π²ΠΈΡ‚Π°Ρ†ΠΈΠΈ Π² Ρ‚ΠΎΠΌ числС). Если Ρƒ Ρ‚Π΅Π»Π° Π΅ΡΡ‚ΡŒ масса - ΠΎΠ½ΠΎ динамичСскоС, Ссли масса Ρ€Π°Π²Π½Π° Π½ΡƒΠ»ΡŽ, Ρ‚ΠΎ Ρ‚Π΅Π»ΠΎ статичСскоС.

Π—Π°Π΄Π°ΠΉΡ‚Π΅ для RigidBody массу, Ρ‚Ρ€Π΅Π½ΠΈΠ΅ скольТСния ΠΈ Ρ‚Ρ€Π΅Π½ΠΈΠ΅ качСния ΠΊΠ°ΠΊ Π½Π° ΡΠΊΡ€ΠΈΠ½ΡˆΠΎΡ‚Π΅ Π½ΠΈΠΆΠ΅. Π₯ΠΎΡ‡Ρƒ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ вашС Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ CCD Radius ΠΈ CCD Motion Threshold. Если нСбольшиС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π½Π° большой скорости ΠΏΡ€ΠΎΡΠΊΠ°ΠΊΠΈΠ²Π°ΡŽΡ‚ сквозь ΠΏΡ€Π΅Π³Ρ€Π°Π΄Ρ‹, Ρ‚ΠΎ настройка этих ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π²Π°ΠΌ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚.

CollisionShape опрСдСляСт Ρ„ΠΎΡ€ΠΌΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, которая ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΡ€ΠΈ расчСтС столкновСний. ΠŸΠΎΡ‡Π΅ΠΌΡƒ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ саму 3D-модСль? Π’ цСлях ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ. НапримСр, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ пСрСсСчСниС со сфСрой, достаточно ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ расстояниС Π΄ΠΎ Ρ†Π΅Π½Ρ‚Ρ€Π° сфСры ΠΈ радиус этой сфСры. Π­Ρ‚ΠΎ Π³ΠΎΡ€Π°Π·Π΄ΠΎ быстрСС, Ρ‡Π΅ΠΌ Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ пСрСсСчСния мноТСства Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠ². ΠžΠ±ΡŠΠ΅ΠΊΡ‚ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ нСсколько шСйпов для Π±ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ описания Ρ„ΠΎΡ€ΠΌΡ‹.

Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ для ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° CollisionShape Ρ‚ΠΈΠΏ Sphere ΠΈ установитС радиус Π±Π»ΠΈΠ·ΠΊΠΈΠΌ ΠΊ радиусу ΠΏΡƒΡˆΠ΅Ρ‡Π½ΠΎΠ³ΠΎ ядра, ΠΊΠ°ΠΊ Π½Π° ΡΠΊΡ€ΠΈΠ½ΡˆΠΎΡ‚Π΅ Π²Ρ‹ΡˆΠ΅.

Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»ΡŒ RevertOnPause Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Π½ ΠΈ Π½Π°ΠΆΠΌΠΈΡ‚Π΅ ΠΊΠ½ΠΎΠΏΠΊΡƒ RunUpdatePlay. ΠŸΡƒΡˆΠ΅Ρ‡Π½ΠΎΠ΅ ядро ΠΏΠΎΠ΄ дСйствиСм Π³Ρ€Π°Π²ΠΈΡ‚Π°Ρ†ΠΈΠΈ Π½Π°Ρ‡Π½Π΅Ρ‚ ΠΏΠ°Π΄Π°Ρ‚ΡŒ Π²Π½ΠΈΠ·. НаТмитС ΠΏΠ°ΡƒΠ·Ρƒ ΠΈ ядро вСрнСтся Π½Π° мСсто.

ΠŸΡ€Π΅Ρ„Π°Π±Ρ‹

Π’Π΅ΠΌ, ΠΊΡ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π» с Unity, Π±ΡƒΠ΄Π΅Ρ‚ Π·Π½Π°ΠΊΠΎΠΌΠΎ это понятиС. ΠŸΡ€Π΅Ρ„Π°Π± - это шаблон ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ Π²ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Π² сцСну. Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ ΠΏΠ°ΠΏΠΊΡƒ Objects Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ GameData. Π’Ρ‹Π΄Π΅Π»ΠΈΡ‚Π΅ Π½ΠΎΠ΄Ρƒ Cannonball, Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ ΠΏΡƒΠ½ΠΊΡ‚ мСню File->Save node as... ΠΈ сохранитС Π² Ρ„Π°ΠΉΠ» GameData/Objects/Cannonball.xml. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡƒΡˆΠ΅Ρ‡Π½ΠΎΠ΅ ядро ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ со сцСны. Для добавлСния ΠΏΡ€Π΅Ρ„Π°Π±ΠΎΠ² Π² сцСну ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΏΡƒΠ½ΠΊΡ‚ мСню File->Load node.

ΠŸΡƒΡˆΠΊΠ°, стрСляй!

Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ Π½ΠΎΠ΄Ρ‹ ΠΏΡƒΡˆΠΊΠΈ ΠΈ ΠΏΠΎΠ»Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡ… Π±Ρ‹Π»ΠΎ Π²ΠΈΠ΄Π½ΠΎ. Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ для Π½ΠΈΡ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ RigidBody ΠΈ CollisionShape. Для ΠΏΠΎΠ»Π° Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ Ρ‚ΠΈΠΏ шСйпа StaticPlane (бСсконСчная ΠΏΠ»ΠΎΡΠΊΠΎΡΡ‚ΡŒ) ΠΈ Π·Π°Π΄Π°ΠΉΡ‚Π΅ Π΅ΠΌΡƒ (ΠΏΠΎΠ»Ρƒ) Ρ‚Ρ€Π΅Π½ΠΈΠ΅ скольТСния ΠΈ Ρ‚Ρ€Π΅Π½ΠΈΠ΅ качСния Ρ€Π°Π²Π½Ρ‹ΠΌΠΈ Π΅Π΄ΠΈΠ½ΠΈΡ†Π΅ (ΠΈΠ½Π°Ρ‡Π΅ Ρ‚Π΅Π»Π° ΠΏΠΎ Π½Π΅ΠΌΡƒ Π±ΡƒΠ΄ΡƒΡ‚ Π΄Π²ΠΈΠ³Π°Ρ‚ΡŒΡΡ бСсконСчно, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΡ€ΠΈ ΠΊΠΎΠ½Ρ‚Π°ΠΊΡ‚Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈΡ… коэффициСнты трСния ΠΏΠ΅Ρ€Π΅ΠΌΠ½ΠΎΠΆΠ°ΡŽΡ‚ΡΡ). Для ΠΏΡƒΡˆΠΊΠΈ Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ Ρ‚ΠΈΠΏ шСйпа Capsule ΠΈ Π·Π°Π΄Π°ΠΉΡ‚Π΅ ΡˆΠ΅ΠΉΠΏΡƒ (Π½Π΅ Π½ΠΎΠ΄Π΅) Ρ€Π°Π·ΠΌΠ΅Ρ€ Size = (2, 4.3, 1) ΠΈ смСщСниС Offset Position = (0, 1.12, 0). Π•Ρ‰Ρ‘ для ΠΏΡƒΡˆΠΊΠΈ Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ AnimationController (Create->Component->Logic), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π½Π°ΠΌ ΠΏΡ€ΠΎΠΈΠ³Ρ€Ρ‹Π²Π°Ρ‚ΡŒ ΡΠΎΠ·Π΄Π°Π½Π½ΡƒΡŽ Π² 3D-Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π΅ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΡŽ выстрСла.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅ΠΌ скрипт ΠΏΡƒΡˆΠΊΠΈ GameData\Scripts\Cannon.as

class Cannon : ScriptObject
{
    // ΠŸΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΈΠ»ΠΈ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ вращСния ΠΏΡƒΡˆΠΊΠΈ
    int direction = 1;

    // Π—Π°Π΄Π΅Ρ€ΠΆΠΊΠ° Π΄ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ выстрСла
    float shootDelay = 0.0f;

    // Ѐункция вызываСтся ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΊΠ°Π΄Ρ€
    void Update(float timeStep)
    {
        // Π£Π³ΠΎΠ» ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚Π° Π²ΠΎΠΊΡ€ΡƒΠ³ оси x (node ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Π½ΠΎΠ΄Ρƒ, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΈΠΊΡ€Π΅ΠΏΠ»Π΅Π½ скрипт)
        float pitch = node.rotation.pitch;

        // МСняСм Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ вращСния, Ссли Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΡƒΠ³Π»Π° Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ Π·Π° Π·Π°Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹
        if (pitch >= 70.0f)
            direction = -1;
        else if (pitch <= -10.0f)
            direction = 1;

        pitch += 30.0f * direction * timeStep;
        node.rotation = Quaternion(pitch, 0.0f, 0.0f);

        if (shootDelay > 0.0f)
            shootDelay -= timeStep;

        // Если Π½Π°ΠΆΠ°Ρ‚ ΠΏΡ€ΠΎΠ±Π΅Π» ΠΈ ΠΏΡ€ΠΎΡˆΠ»ΠΎ достаточно Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ с ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ выстрСла,
        if (input.keyDown[KEY_SPACE] && shootDelay <= 0.0f)
        {
            Shoot();             // Ρ‚ΠΎ стрСляСм
            shootDelay = 1.0f;   // ΠΈ вновь устанавливаСм Π·Π°Π΄Π΅Ρ€ΠΆΠΊΡƒ Π² ΠΎΠ΄Π½Ρƒ сСкунду

            AnimationController@ animCtrl = node.GetComponent("AnimationController");
            animCtrl.SetTime("Models/Shoot.ani", 0.0f);                 // ΠŸΠ΅Ρ€Π΅ΠΌΠ°Ρ‚Ρ‹Π²Π°Π΅ΠΌ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΡŽ Π² Π½Π°Ρ‡Π°Π»ΠΎ
            animCtrl.PlayExclusive("Models/Shoot.ani", 0, false, 0.0f); // ЗапускаСм Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΡŽ ΠΏΡƒΡˆΠΊΠΈ

            SoundSource3D@ source = node.CreateComponent("SoundSource3D"); // Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ источник Π·Π²ΡƒΠΊΠ°
            Sound@ sound = cache.GetResource("Sound", "Sounds/Shoot.wav");
            source.autoRemoveMode = REMOVE_COMPONENT; // Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ Π·Π²ΡƒΠΊΠ° Π±ΡƒΠ΄Π΅Ρ‚ автоматичСски ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½ послС проигрывания
            source.Play(sound);
        }
    }

    void Shoot()
    {
        // ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅ΠΌ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ кости CannonballPlace Ρƒ ΠΏΡƒΡˆΠΊΠΈ
        Vector3 position = node.GetChild("CannonballPlace", true).worldPosition;

        // ДобавляСм Π² сцСну ΠΏΡ€Π΅Ρ„Π°Π±
        XMLFile@ xml = cache.GetResource("XMLFile", "Objects/Cannonball.xml");
        Node@ newNode = scene.InstantiateXML(xml, position, Quaternion());
        
        // Находим ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ RigidBody
        RigidBody@ body = newNode.GetComponent("RigidBody");
        
        // Π˜Π·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ Ρƒ ΠΏΡƒΡˆΠ΅Ρ‡Π½ΠΎΠ³ΠΎ ядра ΡƒΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠΏΡƒΠ»ΡŒΡ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ядро частично пСрСсСкаСтся с ΠΏΡƒΡˆΠΊΠΎΠΉ
        // ΠΈ стрСмится ΠΎΡ‚Ρ‚ΠΎΠ»ΠΊΠ½ΡƒΡ‚ΡŒΡΡ ΠΎΡ‚ Π½Π΅Π³ΠΎ. Но Π½Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ ΠΈΠΌΠΏΡƒΠ»ΡŒΡ побольшС
        body.ApplyImpulse(node.rotation * Vector3(0.0f, 1.0f, 0.0f) * 15.0f);
    }
}

ЗапускаСм ΠΈ наслаТдаСмся Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ ΠΏΡ€ΠΎΠ±Π΅Π»Π° ΠΏΡƒΡˆΠΊΠ° надуваСтся ΠΈ ΠΈΠ·Ρ€Ρ‹Π³Π°Π΅Ρ‚ ядра.

Π”Π°Π²Π°ΠΉΡ‚Π΅ сдСлаСм Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ядра послС дСсяти сСкунд своСго сущСствования ΡΠ°ΠΌΠΎΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ°Π»ΠΈΡΡŒ. Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Π² ΠΏΠ°ΠΏΠΊΠ΅ GameData\Scripts Ρ„Π°ΠΉΠ» CannonBall.as с тСкстом:

class Dying : ScriptObject
{
    float time = 0.0f;

    void Update(float timeStep)
    {
        time += timeStep;
        if (time > 10.0f)
            node.Remove();
    }
}

Π—Π°Ρ‚Π΅ΠΌ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚Π΅ ΠΏΡ€Π΅Ρ„Π°Π± GameData/Objects/Cannonball.xml Π² сцСну (File->Load node->As replicated/local...), Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΠΊ Π½Π΅ΠΌΡƒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ScriptInstance, ΡƒΠΊΠ°ΠΆΠΈΡ‚Π΅ новосозданный Ρ„Π°ΠΉΠ» ΠΈ Π²Π²Π΅Π΄ΠΈΡ‚Π΅ имя класса Dying (Π½Π΅ Π·Π°Π±ΡƒΠ΄ΡŒΡ‚Π΅ Π½Π°ΠΆΠ°Ρ‚ΡŒ Enter). Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€Π΅Ρ„Π°Π± ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΈ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ со сцСны. ЗапуститС ΠΈ посмотритС, ΠΊΠ°ΠΊ ядра ΠΈΡΡ‡Π΅Π·Π°ΡŽΡ‚.

Заячий Π³ΠΎΡ€ΠΎΠ΄ΠΎΠΊ

Π”ΠΎΠ±Π°Π²ΠΈΠΌ Π² сцСну постройку ΠΈΠ· ΠΊΡƒΠ±ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΎΠ±ΡΡ‚Ρ€Π΅Π»ΠΈΠ²Π°Ρ‚ΡŒ ΠΈΠ· ΠΏΡƒΡˆΠΊΠΈ. Как ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ, ΠΏΠ΅Ρ€Π΅Ρ‚Π°Ρ‰ΠΈΡ‚Π΅ модСль GameData/Models/Cube.mdl Π½Π° ΠΊΠΎΡ€Π½Π΅Π²ΡƒΡŽ Π½ΠΎΠ΄Ρƒ Scene ΠΈ Π·Π°Π΄Π°ΠΉΡ‚Π΅ Π΅ΠΉ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» GameData/Materials/Cube.xml. Π’Π°ΠΊΠΆΠ΅ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ ΠΎΠΏΡ†ΠΈΡŽ Cast Shadows. Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ RigidBody (Mass = 1, Friction = 1, Rolling Friction = 0.2) ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ CollisionShape (Shape Type = Box, Size = (2, 2, 2)). РазмСститС ΠΊΡƒΠ± Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π½Π°Π΄ Π·Π΅ΠΌΠ»Π΅ΠΉ (Ссли Π²Ρ‹ Π΅Π³ΠΎ ΠΏΠΎΠ³Ρ€ΡƒΠ·ΠΈΡ‚Π΅ Π² зСмлю, ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΡ€Ρ‹Π³ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ запускС). Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π° Π½ΠΎΠ΄Π°, Π° Π½Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚, ΠΈ Π½Π°ΠΆΠΌΠΈΡ‚Π΅ Ctrl+D для дублирования ΠΊΡƒΠ±Π°, Π° Π·Π°Ρ‚Π΅ΠΌ ΡΠ΄Π²ΠΈΠ½ΡŒΡ‚Π΅ копию Π²Π±ΠΎΠΊ. Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Π΅Ρ‰Π΅ ΠΎΠ΄Π½Ρƒ копию.

ΠšΡΡ‚Π°Ρ‚ΠΈ, Π²Ρ‹ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΠ»ΠΈ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π² ΠΎΠΊΠ½Π΅ Attribute inspector всС значСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ ΠΎΡ‚ Π΄Π΅Ρ„ΠΎΠ»Ρ‚Π½Ρ‹Ρ…, ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ золотистым Ρ†Π²Π΅Ρ‚ΠΎΠΌ?

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚Π΅ вСсь ряд ΠΊΡƒΠ±ΠΎΠ² с Π·Π°ΠΆΠ°Ρ‚ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ Ctrl ΠΈ ΠΏΡ€ΠΎΠ΄ΡƒΠ±Π»ΠΈΡ€ΡƒΠΉΡ‚Π΅ Π΅Π³ΠΎ Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ. ΠŸΠΎΠ΄Π½ΠΈΠΌΠΈΡ‚Π΅ копию Π½Π°Π΄ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ рядом (Π½Π΅ Π·Π°Π±Ρ‹Π²Π°ΠΉΡ‚Π΅ ΠΏΡ€ΠΎ Π·Π°Π·ΠΎΡ€Ρ‹). Π—Π°Ρ‚Π΅ΠΌ создайтС Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ряд.

ЗапуститС. Π£ нас Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° такая ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, Ρ‡Ρ‚ΠΎ послС запуска ΠΊΡƒΠ±Ρ‹ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ Π²Π½ΠΈΠ·, Π½ΠΎ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ с большой Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ Π²ΠΎΠ΄Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΠΈΡ… Π΄Ρ€ΡƒΠ³ Π½Π° Π΄Ρ€ΡƒΠ³Π° слоТно. И Ρ‚ΡƒΡ‚ Π½Π°ΠΌ Π½Π° ΠΏΠΎΠΌΠΎΡ‰ΡŒ ΠΏΡ€ΠΈΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»ΡŒ RevertOnPause. Π’Ρ‹ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ Π΅Π³ΠΎ, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ScriptInstance Ρƒ ΠΏΡƒΡˆΠΊΠΈ (Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΌΡ‹ Ρ€Π°Π½Π΅Π΅ Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π°Π»ΠΈ Π½ΠΎΠ΄Ρ‹ Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρ‰Ρ‘Π»ΠΊΠ°ΠΉΡ‚Π΅ ΠΏΡ€Π°Π²ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ ΠΌΡ‹ΡˆΠΈ Π½Π΅ ΠΏΠΎ Π½ΠΎΠ΄Π΅, Π° ΠΏΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρƒ; Π΄Ρ€ΡƒΠ³ΠΎΠΉ способ для этого - Π½Π°ΠΆΠ°Ρ‚ΡŒ крСстик Π² ΠΎΠΊΠ½Π΅ Attribute inspector).

Π’Π΅ΠΏΠ΅Ρ€ΡŒ запуститС ΠΏΡ€ΠΎΠΈΠ³Ρ€Ρ‹Π²Π°Π½ΠΈΠ΅, Π° ΠΊΠΎΠ³Π΄Π° ΠΊΡƒΠ±Ρ‹ ΡƒΠΏΠ°Π΄ΡƒΡ‚ - остановитС. Π‘Ρ†Π΅Π½Π° ΠΎΡΡ‚Π°Π»Π°ΡΡŒ Π² Π½ΠΎΠ²ΠΎΠΌ состоянии. НС Π·Π°Π±ΡƒΠ΄ΡŒΡ‚Π΅ снова Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ RevertOnPause ΠΈ ScriptInstance.

Частицы

Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ для ΠΏΡƒΡˆΠ΅Ρ‡Π½Ρ‹Ρ… ядСр ΡˆΠ»Π΅ΠΉΡ„ ΠΈΠ· частиц. ΠžΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ частиц Ρ‡Π΅Ρ€Π΅Π· ΠΏΡƒΠ½ΠΊΡ‚ мСню View->Particle editor. Π—Π°Π΄Π°ΠΉΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹:

  • Direction (min) = (-0.1, -0.1, -0.1)
  • Direction (max) = (0.1, 0.1, 0.1) - эти Π΄Π²Π° значСния ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Ρ€Π°Π·Π»Π΅Ρ‚Π° частиц Π² Ρ€Π°Π·Π½Ρ‹Ρ… направлСниях (для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ частицы выбираСтся случайноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² Π·Π°Π΄Π°Π½Π½ΠΎΠΌ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅)
  • Particle Size (min) = Particle Size (max) = (0.3, 0.3) - стартовый Ρ€Π°Π·ΠΌΠ΅Ρ€ частиц Ρƒ всСх ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΉ
  • Size Add = -0.8 - со Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€ частиц ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ΡΡ
  • Number of Particles = 1000 - максимальноС число ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… частиц
  • Emission Rate (min) = Emission Rate (max) = 80 - частота испускания частиц
  • Relative Transform = Π’Ρ‹ΠΊΠ». - Ρ‡Ρ‚ΠΎΠ±Ρ‹ частицы ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π»ΠΈΡΡŒ Π² ΠΌΠΈΡ€ΠΎΠ²Ρ‹Ρ… ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π°Ρ…, нСзависимо ΠΎΡ‚ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠΉ Π½ΠΎΠ΄Ρ‹

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ для частиц ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ†Π²Π΅Ρ‚Π° со Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ. НаТмитС Π΄Π²Π° Ρ€Π°Π·Π° Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ New ΠΏΠΎΠ΄ Π±Π»ΠΎΠΊΠΎΠΌ Color Frames, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΄Π²Π΅ Π½ΠΎΠ²Ρ‹Π΅ строки ΠΈ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ поля ΠΊΠ°ΠΊ Π½Π° ΡΠΊΡ€ΠΈΠ½ΡˆΠΎΡ‚Π΅ снизу. ΠŸΠ΅Ρ€Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ - врСмя, Π° дальшС Ρ†Π²Π΅Ρ‚ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ RGBA.

НаТмитС Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ Save As, сохранитС эффСкт Π² Ρ„Π°ΠΉΠ» GameData\Particle\Sparks.xml ΠΈ Π·Π°ΠΊΡ€ΠΎΠΉΡ‚Π΅ ΠΎΠΊΠ½ΠΎ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π° частиц. Π—Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚Π΅ ΠΏΡ€Π΅Ρ„Π°Π± с ΠΏΡƒΡˆΠ΅Ρ‡Π½Ρ‹ΠΌ ядром Π² сцСну, Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΠΊ Π½Π΅ΠΌΡƒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ParticleEmitter (Create->Component->Geometry), ΡƒΠΊΠ°ΠΆΠΈΡ‚Π΅ новосозданный эффСкт, сохранитС ΠΏΡ€Π΅Ρ„Π°Π± Π² Ρ„Π°ΠΉΠ» ΠΈ ΡƒΠ΄Π°Π»ΠΈΡ‚Π΅ ΠΏΡƒΡˆΠ΅Ρ‡Π½ΠΎΠ΅ ядро со сцСны. Π˜Π³Ρ€Π° Π³ΠΎΡ‚ΠΎΠ²Π°.

Π§Ρ‚ΠΎ дальшС?

ΠœΡ‹ рассмотрСли Π½Π΅ всС возмоТности Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π°. НапримСр, Π½Π΅ Π±Ρ‹Π»ΠΎ сказано Π½ΠΈ слова ΠΏΡ€ΠΎ созданиС интСрфСйса ΠΈΠ»ΠΈ ΠΏΡ€ΠΎ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠ². Однако, понимая ΠΎΠ±Ρ‰ΠΈΠ΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹, Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ с Π½ΠΈΠΌΠΈ Π½Π΅ составит Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ Ρ‚Ρ€ΡƒΠ΄Π°.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ„ΠΎΡ€ΠΌΠΈΡ‚ΡŒ ΠΈΠ³Ρ€Ρƒ Π² Π²ΠΈΠ΄Π΅ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. План ΠΎΡ‡Π΅Π½ΡŒ простой: создаём ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ скрипт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ ΠΈ запускаСт сцСну. Но Π² сцСнС Π½Π΅ Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚ ΠΊΠ°ΠΌΠ΅Ρ€Ρ‹, Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ внутрСнняя ΠΊΠ°ΠΌΠ΅Ρ€Π° Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π°, которая Π±ΡƒΠ΄Π΅Ρ‚ нСдоступна Π²Π½Π΅ Π΅Π³ΠΎ. Как ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ, создайтС Π½ΠΎΠ²ΡƒΡŽ Π½ΠΎΠ΄Ρƒ ΠΈ Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΠΊ Π½Π΅ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Camera (Create->Component->Scene). ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π·Π°Π΄Π°ΠΉΡ‚Π΅ Π½ΠΎΠ΄Π΅ имя Camera, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ ΠΊ Π½Π΅ΠΉ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ Π² нашСм скриптС. РасполоТитС ΠΈ ΠΏΠΎΠ²Π΅Ρ€Π½ΠΈΡ‚Π΅ ΠΊΠ°ΠΌΠ΅Ρ€Ρƒ ΠΊΠ°ΠΊ Π²Π°ΠΌ большС нравится (Π² этом Π²Π°ΠΌ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΈΠ΄ ΠΈΠ· ΠΊΠ°ΠΌΠ΅Ρ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ появляСтся Π² ΠΏΡ€Π°Π²ΠΎΠΌ Π½ΠΈΠΆΠ½Π΅ΠΌ ΡƒΠ³Π»Ρƒ). Π’Π°ΠΊΠΆΠ΅ ΠΊ Π½ΠΎΠ΄Π΅ с ΠΊΠ°ΠΌΠ΅Ρ€ΠΎΠΉ ΠΏΡ€ΠΈΠΊΡ€Π΅ΠΏΠΈΡ‚Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ SoundListener (Create->Component->Audio), Π±Π΅Π· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π²Ρ‹ Π½Π΅ ΡƒΡΠ»Ρ‹ΡˆΠΈΡ‚Π΅ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… Π² пространствС Π·Π²ΡƒΠΊΠΎΠ². Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚Π΅ сцСну ΠΈ создайтС Ρ„Π°ΠΉΠ» GameData\Scripts\Main.as со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ содСрТимым:

Scene@ scene_;

void Start()
{
    scene_ = Scene();
    
    // Π—Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ сцСну ΠΈΠ· Ρ„Π°ΠΉΠ»Π°
    scene_.LoadXML(cache.GetFile("Scenes/Level01.xml"));
    
    // Находим Π² сцСнС Π½ΠΎΠ΄Ρƒ с ΠΊΠ°ΠΌΠ΅Ρ€ΠΎΠΉ
    Node@ cameraNode = scene_.GetChild("Camera");
    
    // Π£ΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ Π΄Π²ΠΈΠΆΠΊΡƒ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· эту ΠΊΠ°ΠΌΠ΅Ρ€Ρƒ
    Viewport@ viewport = Viewport(scene_, cameraNode.GetComponent("Camera"));
    renderer.viewports[0] = viewport;
    
    // Π—Π°Π΄Π°Π΅ΠΌ большой Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ‚Π΅Π½Π΅Π²Ρ‹Ρ… ΠΊΠ°Ρ€Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅Ρ‚ΠΊΠΈΠ΅
    renderer.shadowMapSize = 2048;
    
    // Π£ΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ Π΄Π²ΠΈΠΆΠΊΡƒ ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊ Π·Π²ΡƒΠΊΠ°, Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΡΠ»ΡƒΡˆΠ°Ρ‚ΡŒ
    audio.listener = cameraNode.GetComponent("SoundListener");
}

Π‘ΠΊΠΎΠΏΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΏΠ°ΠΏΠΊΡƒ CoreData, Π»Π°ΡƒΠ½Ρ‡Π΅Ρ€ Urho3DPlayer.exe ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ d3dcompiler_47.dll Π² ΠΏΠ°ΠΏΠΊΡƒ с ΠΈΠ³Ρ€ΠΎΠΉ. А Π±Π°Ρ‚Π½ΠΈΠΊ для запуска Start.bat Ρƒ нас ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ (ΠΈΠ· Π°Ρ€Ρ…ΠΈΠ²Π° assets.zip). Он ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π»Π°ΡƒΠ½Ρ‡Π΅Ρ€Ρƒ ΠΏΠ°ΠΏΠΊΠΈ, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… содСрТатся рСсурсы ΠΈΠ³Ρ€Ρ‹, Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ ΠΎΠΊΠ½Π° ΠΈ стартовый скрипт.

start "" Urho3DPlayer.exe Scripts/Main.as -p "GameData;CoreData" -w -x 800 -y 600

Π˜Ρ‚ΠΎΠ³ΠΎΠ²Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ находится Π² этом ΠΆΠ΅ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ Π² ΠΏΠ°ΠΏΠΊΠ΅ result.

Π£ΠΏΠ°ΠΊΠΎΠ²ΠΊΠ° рСсурсов

Для Π½Π°Ρ‡Π°Π»Π° скомпилируСм всС скрипты ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ ScriptCompiler.exe GameData/Scripts/*.as. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Ρ„Π°ΠΉΠ»Ρ‹ с Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡΠΌΠΈ .asc. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΡ‚Π΅ исходныС .as Ρ„Π°ΠΉΠ»Ρ‹ ΠΈΠ· ΠΏΠ°ΠΏΠΊΠΈ GameData\Scripts Π² Π΄Ρ€ΡƒΠ³ΠΎΠ΅ мСсто, оставив Ρ‚ΠΎΠ»ΡŒΠΊΠΎ .asc Ρ„Π°ΠΉΠ»Ρ‹.

Для ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ Π½Π°ΠΌ понадобится ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° build_vs\bin\tool\PackageTool.exe. Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

PackageTool.exe -pc CoreData CoreData.pak
PackageTool.exe -pc GameData GameData.pak

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ p ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΡƒΠΊΠΏΠ°ΠΊΠΎΠ²ΠΊΡƒ. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ c Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΡƒΠ΅Ρ‚ сТатиС Ρ„Π°ΠΉΠ»ΠΎΠ² (ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ скоростной Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ LZ4).

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠ°ΠΏΠΊΠΈ CoreData ΠΈ GameData ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ±Ρ€Π°Ρ‚ΡŒ. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΈΠΌΠ΅Π΅ΠΌ:

Ну ΠΈ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Π»ΠΎ совсСм красиво, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ ΠΏΠ°ΠΊΠ΅Ρ‚Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° Start.bat. Но для этого Π½ΡƒΠΆΠ½ΠΎ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ исходный ΠΊΠΎΠ΄ Π»Π°ΡƒΠ½Ρ‡Π΅Ρ€Π° (ΠΎΠ½ Π² ΠΏΠ°ΠΏΠΊΠ΅ Urho3D\Source\Tools\Urho3DPlayer). НС стоит ΠΏΡƒΠ³Π°Ρ‚ΡŒΡΡ Π·Π°Ρ€Π°Π½Π΅Π΅ - исходник Π»Π°ΡƒΠ½Ρ‡Π΅Ρ€Π° ΠΎΡ‡Π΅Π½ΡŒ малСнький, вСдь ΠΎΠ½ занимаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ запуска Π² Π΄Π²ΠΈΠΆΠΎΠΊ. Π’ΠΎΡ‚ эти ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π²Π°ΠΌ ΠΈ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ. Π—Π°ΠΎΠ΄Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈ свой Π·Π½Π°Ρ‡ΠΎΠΊ для прилоТСния ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ.


Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΡƒΡ€ΠΎΠΊ: Π˜Π³Ρ€Ρ‹ Π²ΡΠ΅Ρ€ΡŒΡ‘Π·.

Бтарая вСрсия ΡƒΡ€ΠΎΠΊΠ°: https://github.com/1vanK/Urho3DHabrahabr02.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published