Turvateabe portaal. Kirjutame Unitys arkanoidi

Lastele mõeldud palavikuvastaseid ravimeid määrab lastearst. Kuid palaviku puhul on hädaolukordi, kui lapsele tuleb kohe rohtu anda. Siis võtavad vanemad vastutuse ja kasutavad palavikualandajaid. Mida on lubatud imikutele anda? Kuidas saate vanematel lastel temperatuuri alandada? Millised ravimid on kõige ohutumad?

Ühtsus- väga võimas, suure potentsiaaliga progressiivne mootor. Sellel on palju juba sisseehitatud funktsioone (sealhulgas füüsikamootor Nvidia PhysX), mida meie, kasutajad, ei pea käsitsi registreerima. :)
Selles lühikeses artiklis tahaksin arutleda mootori füüsiliste võimaluste üle. Niisiis, alustame:

Jäik keha

Mis see on?

Funktsiooni taga Jäik keha Peidab absoluutselt jäika keha ( ATT). Kui sa seda umbkaudu ja selgelt seletad, siis ATT füüsikas ja mehaanikas on see ideaalne jäik keha, mis jõu mõjul ei suuda oma omadusi muuta, kuid suudab (selle mõjul) liikuda 3 dimensioonis (alla, üles, edasi jne, st meie X-Y-Z telgedes). ), samuti pöörata kolmes mõõtmes (jällegi piki X-Y-Z telge).

AT Ühtsus, nagu ka teistes mängumootorites (ma nimetan neid jämedalt "mängumootoriteks"), Jäik keha kasutatakse erinevate objektide jaoks, millega saame suhelda lükates, löödes jne. Sellised meie mõju all olevad objektid veerevad, liiguvad ja põrkuvad raskusjõu mõjul teiste objektidega edasi.

Millise rakenduse leiame selle funktsiooni jaoks?

Näiteks auto loomiseks, lisaks Jäik keha me vajame 4 rataste põrkeseade"ja ja kood (stsenaarium), mis rakendab ratastele jõudu, olenevalt vajutatud klahvidest.

Konfigureeritavad funktsioonid

  • Mass- Meie objekti mass kilogrammides. Soovitatav on mitte määrata massiväärtusi, mis on 100 korda suuremad või väiksemad kui muude masside massid ATT.
  • Vedama- Kui suur on keha õhutakistus, kui see liigub jõudude mõjul. Väärtusega 0 vastupanu pole ja lõpmatu väärtus peatab meie objekti koheselt.
  • Nurga lohistamine- Kui suur on keha õhutakistus, kui see pöörleb jõudude mõjul. Väärtusega 0 vastupanu pole ja lõpmatu väärtus peatab koheselt meie objekti pöörlemise.
  • Gravitatsioon- Sisselülitamisel mõjutab objekt gravitatsiooni.
  • On kinemaatiline- Kui see on sisse lülitatud, ei mõjuta füüsika mootor objekti ja seda saab muuta ainult selle funktsioon Teisendus. See võib olla kasulik näiteks liikuvate platvormide loomisel.
  • Interpoleerida- Kehtib ainult siis, kui teie ATT liigutused tunduvad teile imelikud või kohmakad jne:
    1. Puudub: Interpolatsiooni ei rakendatud
    2. interpoleerida: Võrreldes eelmise kaadri teisendusega ( raami), silutakse järgmine.
    3. ekstrapoleerida: Praeguse kaadri teisendus on silutud võrreldes järgmise hinnangulise (ligikaudse) teisendusega.
  • Freeze Rotation- Keelab igasuguse pööramise, nii skriptitud kui ka kokkupõrke. Pöörlemist saab aga teostada funktsioon teisenda. Rotate()
  • Kokkupõrke tuvastamine- Kasutatakse selleks, et vältida kiiresti liikuvate objektide leidmata läbisõitu teistest objektidest kokkupõrge"ov" (spetsiaalne "võrk" objektidel, millega nad omavahel ja mängijaga kokku põrkavad).
    1. diskreetne: Meie objekti vaikeväärtus "märkamaks" kõiki teisi objekte, millega see võib kokku puutuda.
    2. Pidev: Kasutage Diskreetne kokkupõrge dünaamiliste põrkeobjektidega (millel on ATT), a Pidev kokkupõrge staatiliseks MeshCollider"ov (ilma ATT). Režiim Pidev dünaamiline kasutab Pidev kokkupõrgeühe konkreetse jaoks ATT. Puhka ATT kasutab režiimi Diskreetne. (See mõjutab suuresti füüsikamootori koormust, lihtsalt lahkuge Diskreetne, kui kiirete objektide kokkupõrkega probleeme pole)
    3. Pidev dünaamiline: Kasutatakse režiimis olevate objektide jaoks pidev või Pidev dünaamiline kokkupõrge. Pidev kokkupõrge kasutatakse ka staatiliseks MeshCollider"ov (ilma ATT). Kõigi teiste puhul kasutatakse režiimi Diskreetne. Kasutatakse kiiresti liikuvate objektide jaoks.

Kuidas saame seda funktsiooni kasutada?

Põhiteadmised.

Kasutada ATT, vajame juba loodud mänguobjekti ( Mänguobjekt), klõpsates sellel, liigume menüüsse mööda järgmist teed: Komponendid – füüsika – jäik kere . Kõik, ATT lisatud! :)
Nüüd allub objekt gravitatsioonile, sellele saab skripte kasutades jõudu rakendada, aga selleks, et objekt käituks täpselt nii nagu vaja, tuleks lisada Collider või liigend.

Kood valitseb maailma.

Skriptis manipuleerime nüüd oma objektiga funktsioonide abil AddForce() ja AddTorque() .
Kuna ma olen sees Ühtsus kohaldada JavaScript, minu näited on sellega kaasas, lingid teistele skriptinäidetele (at C# või Boo) leiate altpoolt lõigust Lisateave ATT kohta.

» Rigidbody.AddForce

// Rigidbody.AddForce kasutab kahte tüüpi valemeid, nagu paljud teised ruumis liikumisega seotud funktsioonid. // 1 tüüp: funktsioon AddForce (force: Vector3, mode: ForceMode = ForceMode.Force) : void // Jõud, mis tõukab objekti globaalse koordinaatsüsteemi suhtes ülespoole. funktsioon FixedUpdate () ( rigidbody.AddForce (Vector3.up * 10); ) // Kasutades Vector3, sisseehitatud Unity funktsiooni, mis on põhimõtteliselt sama mis standardne koordinaatsüsteem. // 2. tüüp: funktsioon AddForce (x: float, y: float, z: float, mode: ForceMode = ForceMode.Force) : void // Sama, kuid siin kasutatakse X-Y-Z süsteem koordinaadid. funktsioon FixedUpdate() ( rigidbody.AddForce(0, 10, 0); )

» Rigidbody.AddTorque

// Funktsioon keerutab objekti ümber etteantud telje. // 1 tüüp: funktsioon AddTorque (pöördemoment: Vector3, režiim: ForceMode = ForceMode.Force) : void // Keerutab ATT-d ümber globaalse Y-telje. funktsioon FixedUpdate () ( rigidbody.AddTorque (Vector3.up * 10); ) // tüüp 2: funktsioon AddTorque (x: float, y: float, z: float, mode: ForceMode = ForceMode.Force) : void // Teeb sama asja, aga jälle teises mõõtesüsteemis. funktsioon FixedUpdate() ( rigidbody.AddTorque(0, 10, 0); )

ATT suhtleb objektidega.

Meie korrektseks tööks ATT neid tuleb varustada Collider"ami (või kokkupõrge"ami, nagu soovite ^.^).
Loe põrkajate kohta lähemalt altpoolt.

Suurus loeb!

Jälgige oma objekti mõõtmeid, sest need on palju olulisemad ühtlase massiga ATT. Kui teie objekt liigub valesti, hõljub õhus või ei põrka kokku, proovige reguleerida selle suurust (mitte ATT, vaid objekt ise). Mudeli importimisel 3D-redaktorist säilivad selle mõõtmed, seega olge modelleerimisetapis ettevaatlik ja järgige kõigi mudelite mõõtmeid.

Lisateave ATT kohta

Selle kohta kirjeldage ATT või Jäik keha Ilmselt lõpetan. Siiski on paar näpunäidet, eriti neile, kes on siiani lugenud :)

  1. standardne kuubi suurus Ühtsus võrdub 1 meeter, seetõttu on selle abil väga mugav oma mudelite suurust kontrollida. Kuubi loomiseks valige menüüst GameObject – Loo muu – kuubik
  2. Suhteline näitaja Mass määrab, kuidas kaks objekti üksteisega suhtlevad.
  3. Mass ei mõjuta kõrguselt kukkumise kiirust, kasutage selleks otstarbeks Vedama.
  4. Mida kõrgemad on väärtused Vedama mida rohkem objekt kaalub. standardväärtused on erinevad alates 0,001(tahke metallitükk) kuni 10(sulg).
  5. Kui teil on vaja objekti muuta nii skriptide kui ka füüsika abil, lisage see ATT parameetriga Kinemaatiline.

Põrkurid

Mis see on?

Eelmises osas arutasime, kuidas Jäik keha ja mainis nn põrkajad. Collider meie jaoks - abiobjekt lihtsa primitiivse või vastupidi keeruka kujuga ruudustiku kujul, mis asub meie mudeli või mudeli osa ümber ja suhtleb teiste objektidega, kui neid ümbritsevad ka põrkajad.
*Warcraft 3* maailmatoimetaja ekspertidele arusaadavaks selgitamiseks kujutage ette meie imporditud mudelit, millele me dudadi redaktoris teetekstuure ei määranud - see on meie objekt; ja põrkajate rolli hakkavad siin täitma mudelit ümbritseva tee blokeerijad. Loomulikult on see üsna jäme võrdlus, sest in Ühtsus need on palju funktsionaalsemad. Noh, vaatame lähemalt.

Kokkupõrgete tüübid.

Colliderid lisatakse menüü kaudu Komponent – ​​füüsika . Neid on mitut tüüpi:

  • Box Collider- kuubiku kujul.
  • Kerapõletaja- sfääri kujul.
  • Kapslite põrgataja- kapsli kujul.
  • Võrgusilma Collider- loob automaatselt põrkeseadme vastavalt objekti ruudustiku kujule, ei saa kokku põrkuda teiste sama tüüpi põrkuritega. Kasutatakse peamiselt staatiliste objektide jaoks, näiteks võistlusraja keskkond.
  • Rataste põrkur- kasutatud rataste jaoks, väga kasulik asi.
  • Ühendite põrkeseade- primitiivide kombinatsioonid, mis koos toimivad ühena. Sellise keeruka põrkuri loomiseks peate lisama meie baaspõrgetisse alamobjektid ja siduma need juba primitiivselt. Nii on väga mugavalt valmistatud näiteks autodele mõeldud lihtsad põrkurid.

Konfigureeritavad funktsioonid

Põhimõtteliselt on kõik põrkajad üksteisega sarnased, neid kasutatakse lihtsalt erineva kujuga objektide jaoks, kuid neil on mitu erinevat parameetrit.

  • Kuubik
    • materjalist- Näitab, kuidas põrkur suhtleb teiste objektidega, määrates samal ajal füüsilise materjali, nagu metall, jää jne.
    • On Päästik- Kui parameeter on lubatud, mõjutab objekti skript, mitte füüsika.
    • suurus- põrkuri suurus piki X-Y-Z telge.
    • Keskus- põrkeseadme asukoht objekti kohalike koordinaatide suhtes.
  • Kera
    • Raadius- sfääri raadius, asendab parameetri suurus.
    • Ülejäänud parameetrid on muutumatud.
  • Kapsel(parameetrid asendavad suurust)
    • Raadius- Kapsli paksus.
    • Kõrgus- Kolderi silindrilise osa kõrgus (ilma ümarate alusteta).
    • suunas- põrkuri suund objekti kohalike koordinaatide suhtes.
  • Võrgusilma Collider(parameetrid asendavad suurust)
    • võrk- Collider'i loomiseks soovitud võrgu valimine.
    • Siledate sfääride kokkupõrked - Selle funktsiooni lubamine silub põrkeseadme pinda. Seda tuleks kasutada siledatel pindadel, näiteks kaldpinnal ilma liigse nurgata, millel kerad peaksid veerema.
    • Kumer- Kui see on lubatud, võimaldab meie põrkur põrkuda teiste põrkeseadmetega. Kumer võrgusilma põrkeseade"piirdub 255 kolmnurka.
  • Rataste põrkur(parameetrid asendavad suurust)
  • Raadius- Ratta raadius.
  • Vedrustuskaugus- Maksimaalne vahemaa ratta vedrustuse suurendamiseks. Vedrustus suureneb alati mööda kohalikku telge allapoole Y.
  • Vedrustusvedru- Vedrustus püüab erinevate jõudude abil jõuda määratud punkti.
  1. Spring:// Püüab jõuda määratud punkti (positsiooni). Mida kõrgem on seadistus, seda kiiremini see saavutatakse.
  2. Damper:// Pehmendab, aeglustab vedrustuse kiirust. Mida suurem väärtus, seda aeglasemalt siiber liigub.
  3. Sihtpositsioon: Täielik "tee", mida vedrustus suudab "rännata". 0 tähendab täielikult väljavenitatud amortisaatorit ja 1 - täielikult kokku surutud. Vaikeväärtus on 0, mis vastab tavalisele auto vedrustusele.
  • Mass- Ratta mass.
  • Ette/külgsuunaline hõõrdumine - Hõõrdeparameetrid ratta lihtsaks veeremiseks ja külgsuunas veeremiseks (see juhtub libisemisel või triivimisel).


mulle meeldib +15 - 0

*Unity* on väga võimas, progressiivne mootor, millel on palju potentsiaali. Sellel on palju sisseehitatud funktsioone (sh *NvidiaPhysX* füüsikamootor), mida meie, kasutajad, ei pea käsitsi ette kirjutama. :)
Selles lühikeses artiklis tahaksin arutleda mootori füüsiliste võimaluste üle. Niisiis, alustame:

Jäik keha
=
= Mis see on? =
Funktsiooni *Rigidbody* taga on Absolutely Rigid Body (*ATT*). Kui jämedalt ja arusaadavalt selgitada, siis *ATT* on füüsikas ja mehaanikas ideaalne jäik keha, mis jõu mõjul ei suuda oma omadusi muuta, kuid suudab (selle mõjul) liikuda 3 dimensioonis (alla, üles, edasi, jne) jne, st meie X-Y-Z telgedes), samuti pöörake 3 mõõtmes (jälle mööda X-Y-Z telge).

*Unity*-s ja ka teistes mängumootorites (jällegi nimetan neid umbkaudu "mängumootoriteks") kasutatakse *Rigidbody* erinevate objektide jaoks, millega saame suhelda lükates, löödes jne. Sellised meie mõju all olevad objektid veerevad, liiguvad ja põrkuvad raskusjõu mõjul teiste objektidega edasi.

Millise rakenduse leiame selle funktsiooni jaoks? =
Näiteks auto loomiseks vajame lisaks *Rigidbody*-le 4 rataste põrkeseade"a ja *kood* (*skript*), mis rakendavad ratastele jõudu olenevalt vajutatud klahvidest.

  • *Mass* – meie objekti mass kilogrammides. Soovitatav on mitte määrata massiväärtusi, mis on 100 korda suuremad või väiksemad teiste *ATT* massidest.
  • *Lohistamine* – kui suur on keha õhutakistus, kui see liigub jõudude mõjul. Väärtusega *0* pole takistust ja lõpmatu väärtus peatab meie objekti koheselt.
  • Nurga lohistamine- Kui suur on keha õhutakistus, kui see pöörleb jõudude mõjul. Väärtusega *0* pole takistust ja lõpmatu väärtus peatab meie objekti pöörlemise koheselt.
  • Gravitatsioon- Sisselülitamisel mõjutab objekt gravitatsiooni.
  • On kinemaatiline- Kui see on lubatud, ei mõjuta füüsikamootor objekti ja seda saab muuta ainult selle funktsiooni *Transform* abil. See võib olla kasulik näiteks liikuvate platvormide loomisel.
  • *Interpoleeri* – kehtib ainult siis, kui teie ATT-liigutused tunduvad teile kummalised või kohmakad jne.
  1. Puudub: Interpolatsiooni ei rakendatud
  2. interpoleerida: Võrreldes eelmise kaadri teisendusega (*kaader*) silutakse järgmist.
  3. ekstrapoleerida: Praeguse kaadri teisendus on silutud võrreldes järgmise hinnangulise (ligikaudse) teisendusega.
  • Freeze Rotation- Keelab igasuguse pööramise, nii skriptitud kui ka kokkupõrke. Pööramist saab aga teostada funktsiooniga // teisenda. Rotate()
  • Kokkupõrke tuvastamine- Kasutatakse selleks, et vältida kiiresti liikuvate objektide leidmata läbisõitu teistest objektidest kokkupõrge"ov" (spetsiaalne "võrk" objektidel, millega nad omavahel ja mängijaga kokku põrkavad).
  1. diskreetne: Meie objekti vaikeväärtus "märkamaks" kõiki teisi objekte, millega see võib kokku puutuda.
  2. Pidev: Kasutage Diskreetne kokkupõrge dünaamiliste põrkeobjektidega (millel on *ATT*) ja Pidev kokkupõrge staatiliseks MeshCollider"s (ilma * ATT *). Režiim Pidev dünaamiline kasutab Pidev kokkupõrgeühe konkreetse *ATT* jaoks. Ülejäänud *ATT* kasutab režiimi _Diskreetne_. (See mõjutab suuresti füüsikamootori koormust, jätke lihtsalt _Diskreetne_, kui kiirete objektide kokkupõrkega probleeme pole)
  3. Pidev dünaamiline: Kasutatakse objektide jaoks režiimis _Continuous_ või Pidev dünaamiline kokkupõrge. Pidev kokkupõrge kasutatakse ka staatiliseks MeshCollider"s (ilma * ATT *). Kõigi teiste puhul kasutatakse režiimi _Diskreetne_. Kasutatakse kiiresti liikuvate objektide jaoks.

Kuidas saame seda funktsiooni kasutada? =
= Algteadmised.
*ATT* kasutamiseks vajame juba loodud mänguobjekti (*GameObject*), sellel klõpsates liigume menüüsse mööda järgmist teed: Komponendid – füüsika – jäik kere . See on kõik, *ATT* lisas! :)
Nüüd on objekt allutatud gravitatsioonile, sellele saab skripte kasutades jõude rakendada, aga selleks, et objekt käituks täpselt nii nagu vaja, tuleks lisada *Collider* või *Joint*.

Kood valitseb maailma.
Skriptis manipuleerime nüüd oma objektiga funktsioonide abil AddForce() ja AddTorque() .
Kuna ma kasutan *Unity*-s *JavaScripti*, on minu näited sellega kaasas, lingid teistele skriptinäidetele (seal C# või *Boo*) leiate altpoolt lõigust Lisateave ATT kohta.

Rigidbody.AddForce

// Rigidbody.AddForce kasutab kahte tüüpi valemeid, nagu paljud teised ruumis liikumisega seotud funktsioonid. // 1 tüüp: funktsioon AddForce (force: Vector3, mode: ForceMode = ForceMode.Force) : void // Jõud, mis tõukab objekti globaalse koordinaatsüsteemi suhtes ülespoole. funktsioon FixedUpdate () ( rigidbody.AddForce (Vector3.up * 10); ) // Kasutades Vector3, sisseehitatud Unity funktsiooni, mis on põhimõtteliselt sama mis standardne koordinaatsüsteem. // 2. tüüp: funktsioon AddForce (x: float, y: float, z: float, mode: ForceMode = ForceMode.Force) : void // Sama asi, aga kasutab X-Y-Z koordinaatsüsteemi. funktsioon FixedUpdate() ( rigidbody.AddForce(0, 10, 0); )

Rigidbody.AddTorque

// Funktsioon keerutab objekti ümber etteantud telje. // 1 tüüp: funktsioon AddTorque (pöördemoment: Vector3, režiim: ForceMode = ForceMode.Force) : void // Keerutab ATT-d ümber globaalse Y-telje. funktsioon FixedUpdate () ( rigidbody.AddTorque (Vector3.up * 10); ) // tüüp 2: funktsioon AddTorque (x: float, y: float, z: float, mode: ForceMode = ForceMode.Force) : void // Teeb sama asja, aga jälle teises mõõtesüsteemis. funktsioon FixedUpdate() ( rigidbody.AddTorque(0, 10, 0); )

ATT suhtleb objektidega.
Meie * ATT * korrektseks tööks peavad need olema varustatud Collider"ami (või kokkupõrge"ami, nagu soovite ^.^).
Loe põrkajate kohta lähemalt altpoolt.


Suurus loeb!
Jälgige oma objekti mõõtmeid, sest need on palju olulisemad kui isegi *ATT* massid. Kui teie objekt liigub valesti, hõljub õhus või ei põrka kokku, proovige reguleerida selle suurust (mitte *ATT*, vaid objekt ise). Mudeli importimisel 3D-redaktorist säilivad selle mõõtmed, seega olge modelleerimisetapis ettevaatlik ja järgige kõigi mudelite mõõtmeid.

Lisateave ATT = kohta
Sellega, kirjeldades *ATT* või *Rigidbody*, ma ehk lõpetan. Siiski on paar näpunäidet, eriti neile, kes on siiani lugenud :)

  1. Standardne kuubiku suurus *Unity*-s on 1 meeter, seetõttu on selle abil väga mugav oma mudelite suurust kontrollida. Kuubi loomiseks valige menüüst GameObject – Loo muu – kuubik
  2. *Massi* suhteline eksponent määrab, kuidas kaks objekti omavahel suhtlevad.
  3. *Mass* ei mõjuta kõrguselt kukkumise kiirust, kasutage selleks *Drag*.
  4. Mida kõrgemad on *Drag* väärtused, seda rohkem üksus kaalub. standardväärtused on erinevad alates 0,001(tahke metallitükk) kuni 10(sulg).
  5. Kui peate objekti muutma nii skripte kui ka füüsikat kasutades, lisage sellele *ATT* parameetriga *Kinematic*.

Saate vaadata skriptitud näiteid välisjõudude mõjust objektile funktsiooniga *ATT* järgmistel linkidel:
*Lisa jõudu*
*Add Torque*

Skripti näite muutmiseks klõpsake programmeerimiskeele nimega tekstil!

Põrkurid
=
= Mis see on? =
Eelmises osas vaatasime, kuidas *Rigidbody* töötab ja mainisime nn *põrkeid*. * Collider * on meie jaoks lihtsa primitiivse või vastupidi keeruka kujuga ruudustiku kujul abiobjekt, mis asub meie mudeli või mudeli osa ümber ja suhtleb teiste objektidega, kui neid ümbritsevad ka põrkajad. .
*Warcraft 3* maailmatoimetaja ekspertidele selgeks selgitamiseks kujutage ette meie imporditud mudelit, millele me dudadi redaktoris teetekstuure ei määranud - see on meie objekt; ja põrkajate rolli hakkavad siin täitma mudelit ümbritseva tee blokeerijad. See on loomulikult üsna jäme võrdlus, sest *Unity*-s on need palju funktsionaalsemad. Noh, vaatame lähemalt.

Kokkupõrgete tüübid. =
Colliderid lisatakse menüü kaudu Komponent – ​​füüsika . Neid on mitut tüüpi:

  • Box Collider- kuubiku kujul.
  • Kerapõletaja- sfääri kujul.
  • Kapslite põrgataja- kapsli kujul.
  • Võrgusilma Collider- loob automaatselt põrkeseadme vastavalt objekti ruudustiku kujule, ei saa kokku põrkuda teiste sama tüüpi põrkuritega. Kasutatakse peamiselt staatiliste objektide jaoks, näiteks võistlusraja keskkond.
  • Rataste põrkur- kasutatud rataste jaoks, väga kasulik asi.
  • Ühendite põrkeseade- primitiivide kombinatsioonid, mis koos toimivad ühena. Sellise keeruka põrkuri loomiseks peate lisama meie baaspõrgetisse alamobjektid ja siduma need juba primitiivselt. Nii on väga mugavalt valmistatud näiteks autodele mõeldud lihtsad põrkurid.


Kohandatud spetsifikatsioonid =
Põhimõtteliselt on kõik põrkajad üksteisega sarnased, neid kasutatakse lihtsalt erineva kujuga objektide jaoks, kuid neil on mitu erinevat parameetrit.

  • *kuubik*

* *Materjal* – näitab, kuidas põrker suhtleb teiste objektidega, määrates samal ajal füüsilise materjali, nagu metall, jää jne.
* On Päästik- Kui parameeter on lubatud, mõjutab objekti skript, mitte füüsika.
* *Suurus* – põrkuri suurus piki X-Y-Z telge.
* *Kesk* – põrkuri asukoht objekti kohalike koordinaatide suhtes.

  • *kera*

* *Raadius* – sfääri raadius, asendab parameetri *Suurus*.
* Muud parameetrid muutmata.

  • *kapsel* (parameetrid asendavad suurust)

* *Raadius* – kapsli paksus.
* *Kõrgus* – põrkeseadme silindrilise osa kõrgus (ilma ümarate alusteta).
* *Suund* – põrkuri suund objekti kohalike koordinaatide suhtes.


  • Võrgusilma Collider(parameetrid asendavad suurust)

* *Mesh* – valige põrkuri loomiseks soovitud võrk.
* Siledate sfääride kokkupõrked - Selle funktsiooni lubamine silub põrkeseadme pinda. Seda tuleks kasutada siledatel pindadel, näiteks kaldpinnal ilma liigse nurgata, millel kerad peaksid veerema.
* *Kumer* – kui see on lubatud, võimaldab meie põrkur põrkuda teiste põrkeseadmetega. Kumer võrgusilma põrkeseade"piirdub 255 kolmnurka.

  • Rataste põrkur(parameetrid asendavad suurust)

* *Raadius* – ratta raadius.
* Vedrustuskaugus- Maksimaalne vahemaa ratta vedrustuse suurendamiseks. Vedrustus suureneb alati mööda kohalikku *Y* telge allapoole.
* Vedrustusvedru- Vedrustus püüab erinevate jõudude abil jõuda määratud punkti.

  1. Kevad: katsed jõuda määratud punkti (asendisse). Mida kõrgem on seadistus, seda kiiremini see saavutatakse.
  2. Amortisaator: Pehmendab, aeglustab vedrustuse kiirust. Mida suurem väärtus, seda aeglasemalt siiber liigub.
  3. Sihtpositsioon: kogu "tee", mida vedrustus võib "läbida". *0* tähendab täielikult välja sirutatud ja *1* täielikult kokkusurutud. Vaikeväärtus on 0, mis vastab tavalisele auto vedrustusele.

* *Mass* – ratta mass.
* Ette/külgsuunaline hõõrdumine - Hõõrdeparameetrid ratta lihtsaks veeremiseks ja külgsuunas veeremiseks (see juhtub libisemisel või triivimisel).

Vaadatud: 734


Minu kummaline loominguline tee viis mind mänguarendusse. Tänu suurepärasele tudengiprogrammile IT-ettevõttelt, mille nimi koosneb ühest väikesest kreeka tähest, õnnestus meil koostöös meie ülikooliga komplekteerida meeskond, sünnitada dokumentatsioon ja panna paika Agile mänguarendus kõrgklassi juhendaja käe all. QA insener (tere Anna!)

Ilma pikema mõtlemiseta valiti mootoriks Unity. See on imeline mootor, millega saab tõesti kiiresti ja lihtsalt väga teha halb mäng mida terve mõistuse juures keegi kunagi mängima ei hakka. Looma hea mäng, tuleb veel dokumentatsiooni kühveldada, mõningatesse funktsioonidesse süveneda ja arenduskogemusi omandada.

Meie mäng kasutas füüsikamootorit viisil, mida ta ei oodanud, mis põhjustas mobiilplatvormidel palju jõudlusprobleeme. See artikkel kirjeldab meie mängu näitel minu võitlust füüsikamootoriga ja kõiki selle töö funktsioone, mida märgati teel elujõulise beetaversiooni poole.

Mäng

Paar sõna selle valmistamise kohta.
Tehtud Blenderi ja paari pythoni skriptiga. Pildistamise hetkel oli ekraani nurgas 16 ruutu, mille värv kodeeris 32 bitti ujukomaarvu – telefoni pöörlemist antud ajahetkel. R, G - andmed, B - paarsus. 0 - 0, 255 - 1. Arvutis tehtud video jagati ffmpeg abil kaadriteks, igale renderdamiskaadrile määrati dekodeeritud nurk. See formaat võimaldas pildistamise ajal üle elada igasuguse tihendamise ja ületas tõsiasja, et kõigil programmidel on aja kulgemise kohta pisut erinevad ettekujutused. Tegelikkuses mängib mäng samamoodi nagu renderdamisel.


Lennuk lendab läbi lõputu ja ettearvamatu koopa, kus on boonuseid, kõikvõimalikke münte ja vaenlasi, keda saab suunamisrakettidega tulistada. Põrkas vastu seina – kohe kadus.
Mängu eripäraks on see, et tase on naelutatud silmapiirile ja juhtimine selles on güroskoopiline, pealegi absoluutne. Kallutage telefoni 45 kraadi - lennuk lendas 45 kraadise nurga all. Peate tegema surnud silmuse - peate tahvelarvuti väänama. Tundlikkust pole, on ainult hardcore.
Toome välja kaks peamist ja arendaja jaoks ilmset probleemi:
Probleem 1: lõpmatus
Unity salvestab ja töötleb objekti koordinaate tavaliste 32-bitiste ujukitena täpsusega kuni 6 kohta pärast koma. Probleem on selles, et meil on lõputu mäng ja kui me piisavalt kaua lendame, hakkavad kõikvõimalikud hullud vead, kuni teleporteerumiseni läbi seinte. Selle probleemi lahendamiseks on mitu lähenemisviisi:
  • Ignoreerimine. Näiteks Minecraftis muutsid ümardamisvead mängu kudemise tõttu ainult huvitavamaks.

  • Teleportatsioon väärtusele (0;0;0), kui lennuk on lähtepunktist liiga kaugel.

  • Võrdluspunkti muutus. Liigub mitte lennuk, vaid tasapind selle ümber.
  • Meie puhul on ainsaks vastuvõetavaks variandiks kolmas, mis sai teoks. Rakendamise kohta - veidi hiljem.
    Esimene – ignoreerimine – on absoluutselt vastuvõetamatu. Roboti loomine, mis suudab meie mängu igavesti mängida, on huvitav (ja üsna lihtne) ülesanne, mille keegi lahendab. Ja tavalisi Korea mängijaid ei tasu alahinnata – lennuk on kiire, taset genereeritakse ettearvamatult. Ja kui te lendate ja lendate enne seinte läbimist, siis pärast 5-minutilist lendu hakkab palju täpsem laskmine ilmselt tõrkuma.
    Teine - mängija ja kogu maailma teleportatsioon - viib mobiilseadmed põlvili, mõnel juhul - umbes pooleks sekundiks. See on väga märgatav ja seetõttu vastuvõetamatu. Kuid see on täiesti vastuvõetav valik lihtsate lõputute arvutimängude jaoks.

    Probleem 2: taseme genereerimine

    Lõputute jooksjate ehitamiseks on mitu peamist lähenemisviisi:
  • Juhuslikult sobivate valmistaseme segmentide kasutamine. Seda tehakse näiteks Subway Surfersis. Seda on lihtne rakendada, kuid mängija harjub kiiresti ja teab, milleks valmistuda, mis on igav.

  • Tase on lihtsalt sirgjoon, millele on juhuslikult paigutatud takistused. Nii tehakse seda Joypack Joyride'is ja Temple Run'is. Meie puhul piiraks see manöövrite arvu oluliselt.

  • Kõik genereeritakse juhuslikult. Mängija jaoks kõige raskem, ettearvamatum ja huvitavam variant.
  • Loomulikult valisime kõige raskema variandi. Selle keskmes on väga keeruline olekumasin, mis teostab neile juhuslikke üleminekuid. Kuid selle artikli raames pole huvitav mitte mehhanism, vaid taseme genereerimise protsess ja selle korraldamine, võttes arvesse valitud lähtepunkti.

    Tase struktuur

    Lendame koopas, sellel on põrand ja lagi - paar plokki, elementaarsed ehitusüksused. Plokid on ühendatud segmentideks, mis sujuvalt üksteisega liidetakse. Segmendid tervikuna pöörlevad ümber lennuki ja liiguvad mööda selle kiirusvektorit, luues lennu illusiooni. Kui segment väljub kaamera vaateväljast, puhastatakse see vastavalt generaatori juhistele plokkidest, dokitakse taseme viimase segmendini ja täidetakse uute plokkidega. Selliste segmentide kogusumma on tase.
    Kogenud Unity arendajad võivad õigustatult võpatada, olles hinnanud töömahtu ja kõiki võimalikke lõkse. Kuid sõnades on kõik lihtne, kuid mul polnud arenduskogemust ...

    Füüsika põhiseadused ühtsuses

    Kuu aega kestnud arendamist, katsetamist ja dokumentatsiooni lugemist olen Unitys tuvastanud kolm põhilist füüsikaseadust. Neid saab rikkuda, kuid rikkumise hind on tootlikkus. Mootor ei hoiata teid vea eest mingil moel ja ilma profileerijata ei pruugi te neist kunagi teada. Nende seaduste eiramine võib teie mängu aeglustada kümnetesüks kord. Nagu ma aru saan, viib mis tahes seaduse rikkumine selleni, et füüsikamootor märgib rikkuva põrkeri ebaõigeks ja loob selle objektil uuesti, millele järgneb füüsika ümberarvutamine:
    1. Põrkurid ei tohiks liikuda, pöörata, sisse/välja lülituda ega suurust muuta.
    Kui olete objektile põrkuri lisanud, unustage igasugune mõju sellele või selles sisalduvatele objektidele. Tavaline põrkur on eranditult staatiline objekt. Näiteks puu võib olla ühe põrkega. Kui puu võib mängijale peale kukkuda - puu kukub koos sooritusega. Kui see puu kasvab maagilisest toitainepilvest, millel pole põrkurit, kuid mis suudab liikuda, kaasneb sellega jõudluse langus.
    2. Kui objekt liigub või pöörleb - see peab olema tahke keha st. neil on jäiga keha komponent.
    Selle kohta on dokumentatsioonis kirjas, jah. Mida pole mängu tegemise alustamiseks vaja läbimõeldult lugeda, sest Unity on väga lihtne ja intuitiivne.
    Jäik keha muudab füüsikamootori suhet objektiga. Sellele hakkavad mõjuma välised jõud, sellel võivad olla lineaarsed ja nurkkiirused ning mis kõige tähtsam, jäik keha saab liikuda ja pöörlema ​​füüsikamootori abil ilma, et see põhjustaks füüsika täielikku ümberarvutamist.
    Tahkeid aineid on kahte tüüpi – tavapärased ja kinemaatilised. Tavalised kehad suhtlevad omavahel ja tavaliste kokkupõrgetega – üks keha ei saa teisest läbi minna. Kinemaatilised kehad järgivad lihtsustatud simulatsioonireegleid – neid ei mõjuta mingid välised jõud, sealhulgas gravitatsioon. Nad võivad vabalt kõike läbi elada.
    Kui pole kahju anda esemeid füüsilise mootori kontrolli alla - kasutage tavalisi jäikaid kehasid. Näiteks kui on vaja kaunilt kaljult kive maha veeretada. Kui teie skriptid või animaatorid juhivad objekti otse – kasutage kinemaatilisi kehasid, nii et te ei pea pidevalt tegelema mootori ja juhuslike objektide kokkupõrgetega. Näiteks kui teil on animeeritud tegelane või juhitav rakett, mis millegagi kokku puutudes plahvatab.
    3. Kui objekt on jäik keha, peab see liikuma ja pöörlema ​​läbi jäiga keha meetodite.
    Unustage Transformi otsene kutsumine objektil kohe pärast põrkuri lisamist. Nüüdsest ja igavesti on Transform teie vaenlane ja jõudluse hävitaja. Enne kui kirjutate transform.position = ... või transform.eulerAngles = ..., öelge fraas "Ma saan nüüd täiesti selgelt aru, mida ma teen, olen rahul piduritega, mida see joon põhjustab." Ärge unustage hierarhilisi seoseid: kui liigutate järsku jäika keha sisaldavat objekti, on füüsika arvutatakse ümber.
    Jäiga kehakontrolli on kolm taset:
    - Kõrgeim ja seega loomulik tase on läbi jõudude. Need on meetodid AddForce ja AddTorque. Füüsikamootor võtab arvesse keha massi ja arvutab sellest tuleneva kiiruse õigesti. Kõik kehade vastasmõjud toimuvad sellel tasandil.
    - Keskmine tase - kiiruste muutus. Need on kiiruse ja nurgakiiruse omadused. Nende põhjal arvutatakse välja jõud, mis mõjutavad kehasid nende vastastikmõju ajal, aga ka loomulikult nende asukohad järgmisel ajahetkel. Kui jäigal kerel on väga väike kiirus, siis ressursside säästmiseks "uinub".
    - Madalaim tase - otseselt objekti koordinaadid ja selle orientatsioon ruumis. Need on meetodid MovePosition ja MoveRotation. Füüsikaarvutuse järgmisel iteratsioonil (see on oluline, kuna iga järgnev meetodi kutse ühes kaadris asendab eelmise väljakutse) teleporteerivad nad objekti uude asukohta, mille järel see elab nagu varem. Meie mängus kasutatakse seda taset ja ainult seda, sest see annab täieliku kontrolli objekti üle.

    Mis on maha jäänud? Lülitage objekt sisse/välja ja suumige. Ma ei tea, kas on võimalik muuta objekti suurust ilma mootorit segamini ajamata. On täiesti võimalik, et mitte. Objekti väljalülitamine on valutu ja sisselülitamine ... jah, põhjustab sisselülitatud objekti läheduses füüsika ümberarvutamise. Seetõttu proovige mitte kaasata liiga palju objekte korraga, venitage seda protsessi õigeaegselt, et kasutaja ei märkaks.

    Kehtib seaduspärasus, mis ei mõjuta jõudlust, vaid mõjutab jõudlust: jäik keha ei saa olla jäiga keha osa. Vanemobjekt hakkab domineerima, nii et laps kas seisab vanema suhtes paigal või käitub ettearvamatult ja valesti.

    On veel üks Unity mittefüüsiline funktsioon, mis väärib mainimist: objektide dünaamiline loomine ja kustutamine Instantiate/Destroy meetodite abil on HULLULT aeglane. Kardan isegi ette kujutada, mis objekti loomise ajal kapoti all toimub. Kui teil on vaja midagi dünaamiliselt luua ja kustutada - kasutage tehaseid ja täitke need mängu laadimise ajal vajalike objektidega. Instantiate tuleks kutsuda viimase võimalusena – kui tehasest saavad ootamatult vabad objektid otsa ja Destroy unustada igaveseks – tuleks kõik loodu uuesti kasutada.

    Seaduste rakendamine praktikas

    (see jaotis sisaldab mängu ja selle funktsioonide loomise mõttekäiku)

    Tase peab ilmselgelt pöörlema ​​ja liikuma.
    Teeme oma elu igaveseks lihtsamaks, asetades tasandi – lennuki – pöörlemistelje koordinaatide alguspunkti. Nüüd saame arvutada kauguse punktist selleni, arvutades punkti koordinaatvektori pikkuse. Väike pisiasi, aga tore.
    Objektide ühisliikumine on Unity objektide hierarhia kaudu hõlpsasti rakendatav, kuna lapsed on osa vanemast. Näiteks on kirjeldatud taseme struktuur loogiliselt rakendatud järgmiselt:
    - pöörlemistelg
    -- Tase
    --- 1. segment
    - - - - plokk 1 (põrgeti)
    - - - - ...
    - - - - Plokk N
    - - - Segment 2 ...
    - - - Segment 3 ...
    - - - Segment 4 ...
    (Saate isegi ilma tasemeobjektita hakkama)

    Teljel olev skript saab güroskoobilt andmeid ja määrab selle jaoks sobiva nurga ... Ja see rikub kohe paljusid reegleid, sest pöörlemine kandub läbi hierarhia põrkuritele, mis hullutab füüsikamootori. Peate telje tegema jäiga korpuse ja pöörama seda sobiva meetodi abil. Aga kuidas on lood tasemel liikumisega? Ilmselgelt ei liigu pöörlemistelg ja tasapinnaline objekt, iga segmenti tuleb liigutada eraldi, vastasel juhul seisame silmitsi lõpmatuse probleemiga. See tähendab, et segmendid peavad olema jäigad kehad. Kuid jäik keha on meil juba hierarhias kõrgemal ja jäik keha ei saa olla jäiga keha osa. Loogiline ja elegantne hierarhia ei sobi, kõike tuleb teha käsitsi - nii pööramist kui ka tõlkimist, ilma pöörlemistelje jaoks objekti kasutamata. Olge selleks valmis, kui teil on ainulaadsed mängufunktsioonid.

    Kui peaksite segmente niikuinii otse liigutama, peate neid pöörama. Peamine raskus seisneb selles, et Unity füüsikamootoris puudub meetod "pööra objekt ümber suvalise punkti" (Transformil on see olemas, kuid ärge laske end kiusata). On ainult "pööra ümber selle keskpunkti". See on loogiline, sest ümber suvalise telje pöörlemine on samaaegselt nii pöörlemine kui ka liikumine ning need on kaks erinevat operatsiooni. Kuid seda saab jäljendada. Esiteks pöörame segmenti ümber oma telje, seejärel pöörame ümber lennuki „oma telje” koordinaate. Kuna lennuk on meil lähtepunktis, ei pea te isegi kooli geomeetriat meeles pidama ja Wikipediasse minema, on Unityl juba kõik olemas. Piisab, kui teisendada pöördenurk kvaterniooniks ja korrutada see punkti koordinaatidega. Muide, sain sellest teada kohe artikli kirjutamise ajal, enne seda kasutati rotatsioonimaatriksit.

    Meil on vaenlasi, kes suruvad lennuki seina sisse, lootes tappa. Seal on kilp, mis tõrjub lennuki seintelt, aidates ellu jääda. Seda rakendatakse triviaalselt - on nihkevektor, mis lisatakse iga kaadri iga segmendi koordinaatidele ja lähtestatakse pärast seda. Igaüks, kes soovib lennukit spetsiaalse meetodi abil jalaga lüüa, võib lahkuda oma löögi vektorist, mis lisatakse sellele nihkevektorile.

    Lõppkokkuvõttes arvutab taseme liikumisjuhtimiskeskus segmendi tegelikud koordinaadid, iga kaader, umbes järgmiselt:
    Vector3 asukoht = segment.CachedRigidbody.position; Vector3 deltaPos = Time.deltaTime * Vector3.left * settings.Speed; segment.truePosition = Quaternion.Euler(0, 0, deltaAngle) * (positsioon + deltaPoss + liikumise nihe);
    Pärast kõiki arvutusi ja karkusid, mis on vajalikud segmentide täpseks dokkimiseks regenereerimise ajal, saadetakse segment.truePosition segmendi jäiga keha meetodile MovePosition.

    järeldused

    Kui kiiresti see kõik töötab? Vanadel lipulaevadel – Nexus 5 ja LG G2 – lendab mäng kiirusega 60 kaadrit sekundis, vaevumärgatava langusega uute põrkajate kaasamisel segmendi genereerimisel (see on vältimatu ja seda ei saa kuidagi vältida) ja usside väljatõukamisel. maa (võid kuhjata mingi põrgu, et sellest mööda saada, aga nüüd rikutakse tahtlikult kolmandat seadust). 40 stabiilset FPS-i annab välja kõik güroskoobiga seadmed, mille peale sattusime. Kõiki seadusi teadmata ja arvestamata oli jõudlus pehmelt öeldes mitterahuldav ning telefonid kuumenesid üle. Nii palju, et mõtlesin kirjutada oma lihtsa 2D-füüsika jaoks spetsiaalse mootori. Õnneks osutus Unity füüsika piisavalt paindlikuks, et kõigist probleemidest sai mööda minna ja neid luua ainulaadne mäng, piisas vaid paarinädalastest katsetest.

    Nüüd, teades kõiki Unity füüsikamootori peamisi lõkse, saate meie mängu kiiresti kloonida, hävitades kolme vaese õpilase unistused, elud ja usu inimkonda. Loodan, et see artikkel säästab teid tulevikus palju aega ja aitab teil leida oma projektides mitte päris ilmseid produktiivse füüsika seaduste rikkumisi.

    Lugege dokumentatsiooni ja katsetage, isegi kui kasutate lihtsaid ja intuitiivseid tööriistu.



    Toeta projekti – jaga linki, aitäh!
    Loe ka
    kukevõitlus mängureeglid kukevõitlus mängureeglid Modifikatsioon minecraft 1.7 jaoks 10 vaatamise retsepti.  Retseptid esemete meisterdamiseks Minecraftis.  Relvad Minecraftis Modifikatsioon minecraft 1.7 jaoks 10 vaatamise retsepti. Retseptid esemete meisterdamiseks Minecraftis. Relvad Minecraftis Šilling ja naelsterling – sõnade päritolu Šilling ja naelsterling – sõnade päritolu