← Zpět na přehled PVR
MI-PVR / NI-PVR • Pokročilá virtuální realita

Úvod do Unity3D

Scény, GameObjecty, komponenty, assety a prefaby architektura projektu pro vývoj aplikací virtuální reality.

Petr Pauš
FIT ČVUT v Praze
Scéna

Scéna (Scene)

Co je scéna?

Hra (projekt) je rozdělena na scény.
Je to hierarchický popis prostředí
uložená struktura objektů a jejich vztahů.

  • Obsahuje GameObjecty: kamery, světla, modely, kolize, zvuky.
  • Hierarchický popis: objekty mají rodiče a potomky, transformace se dědí.
  • Scén může být víc: úvodní menu, levely, ...
  • Přepínání scén: runtime zajišťuje skript (SceneManager.LoadScene() / LoadSceneAsync()).

Scéna vs. projekt

Projekt je celá aplikace včetně všech scén, kódů a assetů.
Scéna je jedna „level“-ová úroveň, kterou editor právě otevírá a kterou spouštíte.

V praxi ve VR

  • U VR aplikací scény přepínat opatrně: načítání scény na okamžik zastaví vykreslování a v headsetu to působí nevolnost.
  • Používá se asynchronní načítání (SceneManager.LoadSceneAsync(), allowSceneActivation = false)
  • Po celou dobu se použije zatmívání (fade-to-black vignette), aby obraz nikdy nezamrzl.
Základní pojmy • GameObject

GameObject

Základní prvek scény

  • GameObject je základní stavební prvek scény.
  • Samotný je prakticky prázdný
  • Vždy má komponentu Transform (pozice, rotace, škálování), nedá se odebrat.
  • Ostatní chování získává z přidaných komponent.

  • Komponent lze přidat neomezeně, libovolná kombinace vlastností.
  • Může být prázdný (create empty) používaný jako „rodič“ pro skupinu objektů.
  • Hierarchie: potomek dědí transformaci rodiče.

Příklady GameObjectů ve scéně

  • Viditelné objekty: 2D sprite i 3D model
  • Kamera: pohled do scény (ve VR headset)
  • Světlo: directionální, bodové, kuželové
  • Částicové systémy: particle systems (oheň, déšť)
  • Zvuk: AudioSource, prostorový poslech

Design v Unity = skládání komponent

  • Místo dědičnosti tříd se objekt sestavuje jako výčet komponent („composition over inheritance“).
  • Chování se mění přidáním či odebráním komponenty, ne přepisováním kódu.
Základní pojmy • Komponenty

Komponenty (Components)

Komponenty přidávají GameObjectu další vlastnosti a chování,
přes menu GameObject > Component nebo tlačítkem Add Component v Inspektoru.

Geometrie a zobrazení

  • Mesh: popis tvaru (vrcholy, hrany, trojúhelníky).
  • Mesh Renderer: zobrazuje objekt ve scéně.
  • Material: zobrazovací vlastnosti: textura, odlesky, stínování, shadery, normálové mapy.

Fyzika

  • Collider: detekce kolizí (box, sféra, kapsle, mesh).
  • Rigidbody: tuhé těleso, fyzikální vlastnosti tělesa (hmotnost, síly).
  • Physics Material: pružnost, tření, disipace energie při srážce.

Skriptování

  • Script v C#: vlastní logika (pro nás nejdůležitější součást).

Chování

  • Script v C#: vlastní logika (pro nás nejdůležitější součást).
  • Audio Source: zvuk.
  • Particle System, Animator, Joint…

Ukázka komponent v Inspektoru

☐ Interaktivní bedna          ← GameObject (jen název + Transform)
  Transform                   pozice / rotace / měřítko
  Mesh Filter                 geometrie bedna.fbx
  Mesh Renderer               materiály, stíny
  Box Collider                tvar pro srážky      ☑ enabled
  Rigidbody                   hmotnost, síly       ☐ Is Kinematic
  Hinge Joint                 pant víka
  MonoBehaviour: BoxOpener    váš C# skript

Unity obsahuje desítky komponent, další přidávají balíčky.
Není třeba je znát všechny: důležitá je myšlenka skládání.

Assets

Veškerá data projektu

  • Assets jsou veškerá binární i textová data potřebná pro projekt.
  • Leží ve složce Assets na disku, která je do Unity přímo zrcadlena.
  • Co se vloží do složky, se okamžitě importuje do editoru.
  • Soubory na disku: editor jen sleduje změny a importuje je.
  • Import: původní soubor se převede na interní formát (a uloží se do Library).
  • Import nastavení: každý asset má v Inspektor vlastní importní parametry (komprese textury, měřítko modelu…).

Pozor na termín: asset je původní soubor (např. beerkeg.fbx), objekt (instance) je to, co z něj po importu vznikne a co vložíte do scény.

Typy assetů

Bitmapové textury 3D modely Skripty (C#) Zvuky Video Fonty Animace Materiály a shadery Obrázky / sprite Prefaby Scény
Soubory .meta: nikdy nemazat!

Ke každému assetu vytvoří Unity vedlejší soubor .meta, který obsahuje GUID a importní nastavení. Veškeré vazby ve projektu (skript → prefab, prefab → textura, animace → kostra) jsou uloženy jako odkazy na toto GUID.

  • bedna.fbx + bedna.fbx.meta: patří k sobě.
  • Smazaný nebo nezacommitovaný .meta → nové GUID → rozbité odkazy („Missing script reference“).
  • .meta soubory musí být v Gitu (jsou textové, malé).

Prefab (předpřipravená šablona)

Šablona objektu

Prefab je předpřipravená šablona prvku scény: uložený GameObject (nebo celá hierarchie) i se všemi komponentami, skripty a texturami.

  • Jeden i více GameObjectů: libovolná hierarchie (auto = karoserie + kola + světla).
  • Společné nastavené vlastnosti: komponenty, skripty, textury...
  • Nová instance: drag–drop v editoru nebo Instantiate().
  • Instance lze měnit: lokálně u jedné, nebo hromadně pro všechny (úprava prefabu).

Instance si nese odkaz na svůj prefab. V Inspektoru vidíte tlačítka Revert (zahození lokálních změn) a Select (skok ke šabloně). Modrá značka = vlastnost odlišená od prefabu.

K čemu to slouží

  • Opakování bez práce: 500 střepů, 40 nepřátel, 30 lektvarů z jedné šablony.
  • Centrální údržba: změníte prefab, změna se promítne do všech instancí.
  • Spawning za běhu: projektily, efekty, nepřátelé se tvoří dynamicky.

Varianty a vnoření

  • Prefab Variant: prefab odvozený od jiného; dědí vše a mění jen co potřebujete. Ve VR velmi časté: Interactable (základ) → varianta Pistol / Button / Knife.
  • Nested Prefab: prefab uvnitř jiného prefabu
    - auto > kolo jako samostatný prefab
    - ruka > model ovladače

Balíčky (Packages)

Window > Package Manager

Rozdělení projektu na balíčky

Projekt v Unity lze rozdělit na samostatné balíčky. Každý balíček je zabalená, znovu použitelná funkcionalita: skripty, shadery, assety i editorová rozšíření : s vlastním rozhraním a verzováním.

  • Soběstačnost: balíček deklaruje, od čeho závisí.
  • Verzování: SemVer, uzamčení verze v manifest.json.
  • Znovupoužití: stejný balíček napříč více projekty a týmy.

Balíčky pro 3D a VR

Např. OpenXR plugin, XR Interaction Toolkit (XRI), Input System, URP, XR Plugin Management a XR Hands.
K nalezení v okně Package Manager > Unity Registry.

Z Asset Store další

  • Základ Unity dodá samo (UGUI, TextMeshPro, testovací funkce, AI Navigation).
  • Z katalogu pak hotové funkce pro hry (FPS controller), modelování terénu, inventory systémy, zvukové knihovny…

Pozor na závislosti

  • Kompatibilita: balíčky nemusí ladit s verzi Unity ani navzájem.
  • Dependency hell: dva balíčky vyžadují různé verze téže závislosti.
Virtuální realita • Architektura

Architektura VR: standard OpenXR

openxr.org

Jedno API pro všechny headsety

  • OpenXR je otevřený standard konsorcia Khronos Group (autoři Vulkanu, OpenGL či glTF).
  • Jednotné rozhraní pro sledování polohy (6DoF), ovladače, haptiku i vlastnosti displejů.
  • Konec fragmentace trhu: aplikace se nepíše pro konkrétní HW; jeden kód běží na Meta Questu (Android/Link), SteamVR (Index, Vive), Apple Vision Pro i WMR.
  • Oddělení aplikace od hardware: OpenXR Loader předává volání do OpenXR Runtime nainstalovaného výrobcem HW/OS.

Interaction Profiles & Akční model

  • Abstraktní akce místo tlačítek: v kódu se neptáme na „stisknutí tlačítka A“, ale definujeme sémantické akce: Select, Activate, AimPose, GripPose.
  • Interaction Profiles: standardizované profily ovladačů (např. /interaction_profiles/oculus/touch_controller, valve/index_controller, khr/simple_controller).
  • Budoucí kompatibilita: připojení nového headsetu nevyžaduje změnu kódu aplikace; runtime sám přemapuje akce na nové fyzické ovladače.

Vrstvy architektury (Stack)

XR Interaction Toolkit (XRI)  interakce: grab, ray, teleport, UI (XR Origin)
Input System (Action Maps)    abstraktní akce ← tlačítka, páčky, 6DoF pose
OpenXR Plugin                 Unity rozhraní překládající akce do OpenXR API
─────────────────────────────────────────────────────────────────────────────
OpenXR Loader & Runtime       Meta Runtime / SteamVR / Monado / Apple …
Hardware                      Meta Quest 3 · Valve Index · HTC Vive · Vision Pro

Aktivace: Edit > Project Settings > XR Plug-in Management > OpenXR (u Questu při vývoji vypněte OpenXR Validation & Faults, jinak build spadne na varování).

OpenXR • Unity3D ekosystém

XR v Unity: balíčky, objekty a prefaby 1/2

Klíčové balíčky

  • XR Interaction Toolkit (XRI): com.unity.xr.interaction.toolkit: oficiální vysokoúrovňový framework pro interakce (grab, ray, poke, UI), rig hráče a pohyb.
  • OpenXR Plugin: com.unity.xr.openxr: Unity bridge implementující OpenXR standard pro desktop i standalone (Android/Quest).
  • XR Plugin Management: centrální aktivace a správa XR loaderů pro jednotlivé platformy.
  • Input System: com.unity.inputsystem: moderní event-driven vstup s Action Maps (povinný pro XRI).
  • XR Hands: standardizovaný subsystém pro hand tracking a rozpoznávání gest bez nutnosti vendor SDK.
  • Doplňkově: Meta XR All-in-One SDK (pokud projekt vyžaduje specifika Meta Passthrough / Scene API).

Prefab XR Origin: rig hráče

XR Origin je kořenový GameObject reprezentující hráče a jeho herní prostor ve scéně.

  • XR Origin (skript): koordinuje měřítko a Tracking Origin Mode (Floor pro room-scale / Device pro sedící).
  • Camera Offset: GameObject kompenzující výšku očí nad podlahou.
  • Main Camera: Tracked Pose Driver mapuje 6DoF pozici a rotaci HMD.
  • Left / Right Controller: XR Controller (Action-based) sleduje pozici rukou a předává stisky tlačítek.
OpenXR • Unity3D ekosystém

OpenXR: Unity3D: balíčky, objekty a prefaby 2/2

Klíčové XRI skripty a komponenty

  • Interaktory (kdo interaguje: na ovladačích / rukách):
    • XR Direct Interactor: uchopení objektu přímým dotykem (kolizí).
    • XR Ray Interactor: laserový paprsek pro dálkovou interakci a 3D UI.
    • XR Poke Interactor: stisknutí tlačítek a UI panelů prstem.
    • XR Socket Interactor: magnetický slot pro odložení předmětu (pouzdro, batoh).
  • Interactables (s čím se interaguje: na předmětech):
    • XR Grab Interactable: zvedání předmětů, házení fyzikou, attach pointy.
    • XR Simple Interactable: reaguje na Hover/Select/Activate (spínače, páky).

Pohyb (Locomotion) a prefaby

  • Locomotion Providers: skripty na rigu hráče: Teleportation Provider (skoky na plochy Teleport Area / Anchor), Continuous Move Provider (pohyb páčkou) a Snap / Continuous Turn Provider (otáčení hráče).
  • Starter Assets prefaby: XRI vzorový balíček obsahuje hotový prefab Complete XR Origin Setup se všemi interaktory a teleportem.
  • Měřítko & Stereo: 1 unit = 1 metr; v Project Settings nastavit Single Pass Instanced pro výkon.
Praktický začátek • Instalace

Unity3D studio: instalace

1. Unity Hub
Instalovat a spustit Unity Hub
2. Účet
Vytvořit osobní (free) účet
3. Verze
Vybrat verzi Unity (LTS)
4. Instalace
Moduly: platforma, IDE, dokumentace
Unity Hub se seznamem nainstalovaných verzí a projektem
Unity Hub: správa instalovaných verzí, licencí a projektů.
  • Unity Hub: centrální správce instalací a projektů; samotné Unity se instalační volbou neovládá.
  • Verze LTS: dlouhodobá podpora, stabilní; pro cvičení vždy shodná verze pro celou skupinu.
  • Instalační moduly: Visual Studio Community, Build Support (Windows / Android…), Local Documentation.
  • Meta Quest = Android: Android Build Support a v něm i OpenJDK a Android SDK & NDK
    bez NDK se Quest build nepodaří.
  • Nový projekt: šablona 3D / URP, případně rovnou VR, která má OpenXR a XRI předpřipravené.
Editor • Orientace v prostředí

Hlavní okno editoru

Hlavní okno editoru Unity s Hierarchy, Scene View, Inspectorem a Project panelem
Hlavní okno editoru: rozložení panelů lze libovolně přetahovat a uložit jako layout

1 • Hierarchie objektů ve scéně

Hierarchy: strom všech GameObjectů scény včetně vnoření.

2 • Okno scény

Scene: editační pohled s gizmos
Game: pohled kamery.

3 • Složka assetů

Project: struktura stejná jako na disku (složka Assets).

4 • Kontextové menu objektů

Pravé tlačítko v Hierarchy: vytvoření objektu, přidání komponenty, duplikace, Create Prefab.

5 • Console & Gizmos

Console (Ctrl+Shift+C): výpisy Debug.Log, chyby a výjimky; klik na chybu skočí na řádek ve skriptu. Přes tlačítko Gizmos v liště Scene View zapínáte vizualizace kolizí, raycastů, lightmapů i XR rigů.

  • Pravé tlačítko + WSAD: Pohyb ve scéně.
  • QWER Select / Move / Rotate / Scale
Editor • Organizace projektu

Uspořádání projektu

Assety

Všechny potřebné soubory musí být uvnitř složky Assets.
Cokoli leží mimo ni, Unity nevidí,
a naopak: co se do Assets nakopíruje, to Unity zkusí naimportovat.

  • Složky podle typu: Textures, Images, Scripts, Models, Prefabs, Materials.
  • Konzistentní pojmenování: objekty pojmenovávat vhodně a stejným vzorem (Enemy_Soldier_01).
  • Znovupoužitelné komponenty: hlavně skripty; raději obecný Health než deset kopií.
  • Způsoby přidání assetu: přes editor, nebo přímým kopírováním souborů do složky projektu.

V projektu rozhoduje dohledatelnost. Bez struktury a názvů se nedá spolupracovat v týmu ani se vrátit ke svému vlastnímu kódu po pár měsících.

Doporučená struktura

Assets/
├── Scenes/       # scény (Main, Menu, Game)
├── Scripts/      # C# skripty
├── Prefabs/      # šablony objektů
├── Models/       # FBX, OBJ
├── Materials/    # materiály a shadery
├── Textures/     # albedo, normálové, ORM
├── ../bordel/images-pvr/       # UI sprite, ikony
├── Audio/        # AudioClips, mixery
└── Settings/     # input actions, XR setup
Co do Gitu

Library/ a Temp/ se tam nedávají
Jen Assets/, Packages/, ProjectSettings/ a všechny .meta soubory.

Git LFS (Large File Sharing): Použít git lfs track "*.fbx" "*.png" "*.tga" "*.wav" "*.psd" selže push na GitHubu/GitLabu na limitech souboru (100 MB). LFS nastavit před prvním commitem.

Editor • Inspektor

Inspektor objektů

Inspector zobrazuje vybraný GameObject a všechny jeho komponenty.
Je to hlavní místo, kde se nastavují vlastnosti.

Záhlaví objektu (společná pro všechny)

  • Jméno objektu: jak je vidět v Hierarchy.
  • Tag: pro rychlé třídění a hledání objektů (FindWithTag).
  • Layer: vrstvy pro kolize a raycasting.
  • Static: objekt se ve scéně nehýbe → editor ho optimalizuje (lightmapping, batching).
Dále následují komponenty objektu
  • Transform: má každý objekt (Position, Rotation, Scale).
  • Mesh Filter: data o geometrii.
  • Mesh Renderer: zobrazuje objekt: materiály, osvícení, stínování.
  • … další komponenty včetně vašich skriptů.
Inspektor objektu se jménem, tagem, vrstvou, zaškrtávkou Static a komponentami Transform, Mesh Filter a Mesh Renderer

Layer Mask: ve VR klíčové

Vrstvy se ve VR používají jako filtr, do jakých objektů paprsek či ruka sahá: vytvořte si vlastní vrstvy Teleport, Grabbable a UI a v komponentách XRI je přiřaďte přes Layer Mask.
Ray interactor pak nechytá stěny a UI se nechová jako uchopitelný předmět.
Nastavení vrstev: Edit > Project Settings > Tags and Layers.

Fyzika • Vybrané komponenty

Důležité komponenty: Fyzika 1/2 (Rigidbody & Materiály)

Přidávají se přes menu GameObject > Component > Physics.

Inspektor komponenty Rigidbody

Rigidbody: tuhé těleso

Řídí fyzikální chování: gravitace, síly, hmotnost (kg), setrvačnost a odpor prostředí (Drag / Angular Drag). Bez Rigidbody se objekt fyzikou neřídí.

  • Interpolate (ve VR povinnost): PhysX počítá ve FixedUpdate (např. 50/90 Hz), displej běží na 90/120 Hz. Bez Interpolate předměty při pohybu mikro-trhají → spouštěč nevolnosti.
  • Collision Detection: Continuous / Continuous Dynamic brání prolétnutí předmětu tenkou stěnou při rychlém švihu rukou (tunneling).
  • Constraints: zamčení pozice / rotace v osách X, Y, Z (např. zásuvka stolu, posuvná páka).
Is Kinematic: předání kontroly skriptu

Vypne vliv gravitace a sil; polohu určuje skript či XRI. Při uchopení se předmět přepne na isKinematic = true a drží v ruce. Po puštění se vrátí na false a padá podle fyziky.

Physics Material s nastavením tření a odrazivosti

Physics Material: povrchy

Přiřazuje se do Collideru a definuje tření a pružnost při kontaktu:

  • Dynamic / Static Friction: odpor při skluzu vs. síla nutná k uvedení do pohybu. Ve VR nutné nastavit > 0, jinak odložené předměty na stole samovolně kloužou jako na ledu.
  • Bounciness (0 až 1): odrazivost povrchu (0 = plastelína pohlcující energii, 1 = dokonale pružný míček).
  • Friction / Bounce Combine: jak se hodnoty obou dotýkajících se těles kombinují (Average, Minimum, Multiply, Maximum).

Fyzika a Rigidbody ve VR

  • Fixed Timestep: výchozích 50 Hz (0,02 s) nestačí pro 72/90 Hz headsety. V Project Settings > Time změnit na 0,0111 s (pro 90 Hz) nebo 0,0138 s (pro 72 Hz).
Fyzika • Vybrané komponenty

Důležité komponenty: Fyzika 2/2 (Collidery)

Collider: typy a výkon

  • Inspektor komponenty Box Collider Primitivní collidery (Box, Sphere, Capsule): analyticky přesné a extrémně rychlé na výpočet.
  • Compound collidery: složení tvaru z několika primitivních colliderů (např. meč = rukojeť capsule + čepel box); výrazně levnější než mesh.
  • Mesh Collider: kopíruje trojúhelníky 3D modelu. Pro dynamické Rigidbody musí mít zaškrtnuto Convex, jinak nejdou kolize s jinými tělesy.

Pevná kolize vs. Is Trigger

  • Pevný collider (Solid): neprostupný, působí odpudivé síly, odrazy a tření. Volá OnCollisionEnter(Collision).
  • Trigger (Is Trigger): nebrání pohybu, funguje jako neviditelná detekční zóna. Volá událost OnTriggerEnter(Collider).
  • Aby vznikla kolizní událost, alespoň jeden ze dvou kolidujících objektů musí mít Rigidbody!

Collidery v XR: interaktory a detekce

  • interaktory neinteragují s mesh, ale jen s collidery.
  • XR Direct Interactor (ruka): vyžaduje collider nastavený jako Trigger (typicky SphereCollider o $r\approx10$ cm).
  • XR Ray Interactor (paprsek): vysílá fyzikální Raycast proti colliderům ve scéně: uchopení z dálky, teleportace a interakce s World Space UI.
  • XR Poke Interactor (prst): miniaturní trigger na špičce ukazováčku pro fyzické stlačování tlačítek.

Kolize ve VR: vrstvy a průchod zdí

  • Self-collision & Layer Matrix: předmět v ruce nesmí narážet do collideru ruky ani hráče (jinak začne nekontrolovaně kmitat).
  • Kinematic: předmět věrně kopíruje ruku a projde zdí (rozpad imerze).
  • Velocity Tracking: předmět zůstává dynamický, o pevnou zeď se zastaví a k ruce ho dotahuje virtuální pružina.
Fyzika • Spoje

Joints: spoje

Pevné spoje: hierarchie

Nejjednodušší pevné spojení vytvoříte hierarchií ve scéně: potomek pevně dědí transformaci rodiče.
Je to levné a spolehlivé, vhodné pro jednoduché spoje (auto a jeho kola, postava a meč).
Nevýhoda: žádná fyzika, jen pevný vztah.

Joint komponenty: fyzikální spoje

  • Fixed Joint: pevný spoj, ale s víc možností než hierarchie: lze ho silou přetrhnout (breakForce), nastavit vzájemnou transformaci.
  • Spring Joint: pružný spoj; Spring (tuhost), Damper (tlumení), Target Position (klidová délka). Ve VR: pružné lano, přitahování uchopeného objektu k ruce.
  • Hinge Joint: pant / otáčení kolem osy s mezemi a motorem. Ve VR nejčastější spoj vůbec: dveře, páky, kohoutky, otočný volant: stačí uchopit a zatáhnout rukou.
  • Configurable / Character / Constant Force Joint: atd.
  • Rigidbody u obou konců
  • Connected Body: s čím je spojeno
  • Auto Configure Connected Mass
Scéna • Kamera

Kamera

  • Může být víc kamer ve scéně: aktivní je ta s nejvyšším Depth.
  • Skybox: pozadí scény (obloha, environment); volí se přes Clear Flags > Skybox Material.
  • Volba perspektivy: Perspective vs. Orthographic (rovnoběžné paprsky, technické pohledy, 2D).
  • Field of View: zorný úhel; ve VR ho nikdy nenastavovat ručně: získá se z headsetu a XR rozhraní (ruční změna rozbije stereo).
  • Vlastnosti grafiky: Clear Flags, Background Color, Clipping Planes, Culling Mask, HDR / MSAA, Target Texture.
Inspektor komponenty Camera s Clear Flags, Background Color, Culling Mask, Clipping Planes, Projection a Field of View

Ve VR se kamera nedělá ručně: XR Origin
XR Origin                    kořen rigu = pozice hráče v místnosti (0)
└── Camera Offset            výška očí (~1,6 m), lze doladit
    └── Main Camera          Tracked Pose Driver → sledování hlavy
                             FOV a eye offset diktuje headset
├── Left Hand                pose levého ovladače
└── Right Hand               pose pravého ovladače

Prefab XR Origin (XR rig)). Pohyb hlavy do kamery přenáší komponenta Tracked Pose Driver;
Výška hráče se mění na Camera Offset, nikdy ne na kameře.

Virtuální realita • Vstup

Input System a VR ovladače

com.unity.inputsystem

Od Input.GetAxis k akcím

Starý Input.GetAxis("Vertical") předpokládá jednu klávesnici a jeden gamepad.
Ve VR nestačí: ovladače pro dvě ruce, joystick, trigger s plynulou hodnotou, grip a sledování polohy v prostoru. Nový Input System proto pracuje s akcemi (actions) a mapováním.

Action maps: asset .inputactions

ActionMap "VR"
├── Pose        (Pose)     pose levé / pravé ruky v prostoru
├── Move        (Vector2)  thumbstick ← osy X/Y
├── Grab        (Button)   grip / squeeze
├── Select      (Button)   trigger (axis 0…1, plynulý stisk)
├── Teleport    (Button)   stisk pro teleportaci
└── Haptic      (Pose+axis) vibrační odezva (amplituda, frekvence)

Přepnutí: Edit > Project Settings > Player > Active Input Handling → Both / Input System Package (new).
XRI má předpřipravené mapování XRI Default Input Actions.

Čtení dat z ovladače

[SerializeField] InputActionReference grab;

void OnEnable()  => grab.action.performed += OnGrab;
void OnDisable() => grab.action.performed -= OnGrab;

void OnGrab(InputAction.CallbackContext ctx)
{
    float t = ctx.ReadValue<float>();
    xrDevice.SendHapticImpression(0, t); 
}

Reference se přiřadí z Inspektoru: žádné pevně zapsané názvy tlačítek, hra pak funguje s jakýmkoli profilem ovladače.

Rozdíl od normálních her

  • Pose: ne osy, ale poloha a rotace ruky v prostoru.
  • Analogový trigger: plynulá hodnota.
  • Grip / thumbstick / A B X Y: zvlášť za každou ruku.
  • Haptika: odezva při uchopení, nárazu, zásahu.
  • Hand tracking: místo tlačítek póza ruky (pinch, ...).
Programování • Komponenta Script

Komponenta Script

Pro nás velmi důležitá

Třída odvozená od MonoBehaviour se chová jako komponenta: lze ji připojit k libovolnému GameObjectu.

  • Komponenta ScriptPVR v Inspektoru zobrazená s poli Speed a PrefabKód v C#: Create > C# Script v Project panelu.
  • Běžný textový soubor: Unity sleduje změny a po uložení znovu zkompiluje.
  • Podpora MS Visual Studio: (Mac, Win); alternativně JetBrains Rider nebo VS Code.
  • Vlastní atributy viditelné v editoru: public pole a [SerializeField] se objeví v Inspektoru → ladění bez překladu.
  • Odkazy na jiné komponenty:
    GetComponent<Rigidbody>() (volat v Awake, ne v Update).

Životní cyklus

Awake → OnEnable → Start → (FixedUpdate, Update, LateUpdate) → OnDisable → OnDestroy.
Update() proběhne jednou za vykreslený snímek: jeho četnost kolísá s FPS, proto se násobí Time.deltaTime.
FixedUpdate() běhá v pevném fyzikálním kroku (výchozích 50 Hz → Time.fixedDeltaTime = 0,02 s), tedy nezávisle na snímkové frekvenci.

Ve VR je to klíčové: hlavu i ovladače sleduje headset v pevné frekvenci a fyzika uchopených předmětů se musí počítat v pevném kroku. Síly se dávají výhradně do FixedUpdate: jinak při kolísavém FPS předmět v ruce trhá a kmitá, což vyvolává nevolnost.

using UnityEngine;

public class ScriptPVR: MonoBehaviour
{
    public float speed = 2f;      // viditelné v Inspektoru
    public GameObject prefab;     // reference na šablonu
    Rigidbody rb;                 // odkaz na jinou komponentu

    void Awake()                  // získání komponenty
    {
        rb = GetComponent();
    }

    void Start()                  // jednou při spawnu
    {
        Debug.Log("Start");
    }

    void Update()                 // jednou za snímek
    {   // Time.deltaTime = čas od předchozího snímku
        transform.Translate(0, 0, speed * Time.deltaTime);
    }

    void FixedUpdate()            // pevný krok – síly sem
    {
        if (rb) rb.AddForce(Vector3.up * speed);
    }
}
Praxe • Prefabs

Prefabs v praxi

  • „Šablony“ objektů, které lze staticky i dynamicky duplikovat.
  • Uchovají se všechny komponenty: Mesh, materiály, kolize, fyzika i skripty s nastavenými hodnotami.
  • Vytvoření: přetažením objektu ze scény do složky Assetů, nebo tlačítkem Create Prefab v Inspektoru.
  • Drag&Drop do scény naopak vytvoří novou instanci prefabu.
  • Lze i ze skriptu: Instantiate(prefab, position, rotation); zničení Destroy(go) (zpožděně Destroy(go, 2f)).
  • Instance Modrý název v Hierarchy = instance. Lze posunout, přejmenovat, změnit hodnoty: prefab se nezmění.

  • Prefab (šablona) Úprava v režimu Prefab (dvojklik na asset) se propadne do všech instancí ve všech scénách.

Editor Unity se scénou obsahující dva krychle a prefab Cube vybraný ve složce Prefabs

Object pooling: performance ve VR

Instantiate() / Destroy() za běhu uvolňují paměť a spouštějí garbage collection, který se projeví zamrznutím snímku.
Ve VR, kde musíte držet stabilních 90 FPS, se proto hotové instance recyklují: nepoužité se jen skryjí (SetActive(false)) a příště se znovu vypůjčí z poolu.
Unity má hotový UnityEngine.Pool.ObjectPool<T>.

Virtuální realita • Interakce a pohyb

VR interakce & pohyb (Locomotion)

Komponenty XRI: komponenty na ruce a na předmětu

  • XR Origin: rig hráče (kamera + ruce).
  • XR Direct Interactor: na ruce; fyzický dosah, sahá do trigger collideru ruky.
  • XR Ray Interactor: na ruce; paprsek na vzdálené objekty a UI.
  • XR Grab Interactable: na předmětu; uchopení, hození, Move Type (Kinematic / Velocity Tracking).
  • XR Teleportation Area / Provider: na podlaze, resp. na rigu.

Vzájemná vazba přes Layer Mask a rozhraní IXRSelectInteractable;
bez collideru na předmětu nelze uchopit.

Reakce na uchopení / puštění

[SerializeField] XRGrabInteractable grab;   // na předmětu
void OnEnable() {
    // ruka předmět vzala / pustila
    grab.selectEntered += e => Haptic(0.4f);
    grab.selectExited  += e => Throw();
}
// XRI při uchopení zapne isKinematic a po puštění vrátí
// na false → předmět pak podléhá gravitaci.

Dva způsoby pohybu

Teleportace: Paprsek → klik → okamžitý přesun.
Nejšetrnější, žádná akcelerace. Nevýhoda: pomalejší, méně přirozené.

Continuous (plynulý): Thumbstick posouvá kameru. Nutné tunelování zorného pole (vignette), konstantní rychlost bez zrychlení.

V XRI: Teleportation Area na podlaze (využívá NavMesh), Teleportation Provider a Teleportation Area Manager na rigu a na ruce XR Ray Interactor, který paprsek vede. Pro semestrální práci je teleportace bezpečná volba: zvlášť když hru předvádíte před publikem.

Důležitá pravidla imerze

  • Gravitace & haptika: předmět by měl po puštění spadnout a při uchopení zavibrovat.
  • Ruce neprocházejí stěnou: bez kolize ruky imerze končí.
  • UI patří do světa: Canvas > World Space + Tracked Device Graphic Raycaster, ne plocha nalepená před obličej.
Práce s daty • Import

Import assetů

1 unit = 1 metr

V klasické 3D hře je měřítko relativní:
záleží jen na poměru věcí.
Ve VR 1 jednotka Unity = 1 metr reálného prostoru (headset zná rozměry místnosti a polohu rukou.
Židle vysoká 10 jednotek se ve VR jeví jako deset metrů vysoký objekt → okamžitý rozpad imerze a nevolnost.

Kompatibilní formáty lze přidat rovnou

Unity umí řadu formátů naimportovat sama (přes Assimp / FBX SDK). Není potřeba je předem převádět na interní formát.

Jak asset přidat

  • Pomocí menu: Assets > Import (Nové Asset > Import Package…).
  • Drag&Drop do okna Assets (Project panel).
  • Přímé kopírování do složky Assets v projektu: nejjednodušší a nejrychlejší.

Měřítko při importu

Každý asset má v Inspektoru záložku importního nastavení: kompresi textury, sRGB, mipmapy; u modelu Scale Factor, vygenerování kolize, přiřazení materiálů.
Z Blenderu exportujte do FBX při měřítku 1.0;
Hlídat osy (Blender +Z up → FBX exporter to řeší, OBJ ne).
Krychle o skutečné velikosti 1 m zůstane po importu krychle o rozměru 1.

Podpora 3D modelů

  • Základní / otevřené: OBJ, FBX (doporučeno, nese i animace, kostry a materiály), COLLADA (dae), STL.
  • Proprietární: Maya, Blender, 3DS Max, SketchUp: vždy je lepší exportovat do FBX/OBJ, ne dávat do projektu originál.
Ekosystém • Asset Store

Asset Store

  • Další možnost přidání assetů a balíčků: oficiální katalog na assetstore.unity.com, propojený s Unity Hubem a Package Managerem.
  • Placené i free assety: od zdarma po desítky tisíc korun; u free balíčků sledujte hodnocení a datum poslední aktualizace.
  • Obsah: skripty, textury, modely, animace, zvuky, scény i celé balíčky.
  • Publikace: své assety tam lze i publikovat a prodávat (po schválení a podepsání smlouvy).

Licence: na co si dát pozor

  • Asset smíte použít ve své hře, nesmíte ho ale přeprodat jako samostatný soubor.
  • Volně šiřitelné assety (CC0) z jiných zdrojů: ověřte licenci, zejména u komerčních projektů.

Zastaralé, nepoužívat

SteamVR Plugin, Vive Input Utility a VRTK v3 jsou dnes deprecated a v Unity 6 způsobují konflikty (vlastní starý input systém, duplicate assemblies, nekompatibilní rigy). Dnes se vývoj nedělá přes proprietární SDK výrobců, ale přes OpenXR a XR Interaction Toolkit; VRTK nahradil přímo XRI.

Praktická poznámka

Vše lze přidat i bez storu manuálně: stačí zkopírovat složku balíčku do Assets/ nebo Packages/, či naimportovat .unitypackage.
Store je jen pohodlná distribuce a hlídání aktualizací.

Vydání • Build

Build projektu

File > Build Settings

Z editoru ke spustitelné aplikaci

Build se spouští z menu File > Build Settings (nebo Ctrl+Shift+B). Otevře se okno, kde vyberete scény, cílovou platformu a název výstupu.

  • Scény v buildu: zaškrtnutí a pořadí; scéna s indexem 0 se startuje první (SceneManager.LoadScene(1) přepne na další).
  • Výběr cílové platformy: PC, Mac & Linux, Android, iOS, PS5, Xbox, Meta Quest… Pro nás použijeme PC (případně Android pro Quest).
  • SDK & licenční omezení: pro iOS, PS4/PS5 a Xbox je třeba mít příslušné SDK a podepsanou NDA s výrobcem konzole.
  • Rychlost: build je oproti Unreal Enginu rychlý; build provede jen to, co se změnilo.

Meta Quest

  • 1. V Build Settings přepnout platformu na Android (přepnutí trvá, naimportuje se Android SDK).
  • 2. Zařídit Developer Mode na Questu (bezplatný vývojářský účet Meta + aplikace Meta Quest na telefonu) a v headsetu povolit neznámé zdroje.
  • 3. Testovat za běhu přes Quest Link / AirLink: File > Build And Run pošle appku do headsetu přes USB či Wi-Fi; odpadá zdlouhavé dokola-buildování APK.
Okno Build Settings s listem scén, volbou platformy a tlačítky Build a Build And Run