Scény, GameObjecty, komponenty, assety a prefaby architektura projektu pro vývoj aplikací virtuální reality.
Hra (projekt) je rozdělena na scény.
Je to hierarchický popis
prostředí
uložená struktura objektů a jejich vztahů.
SceneManager.LoadScene() / LoadSceneAsync()).
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.
SceneManager.LoadSceneAsync(), allowSceneActivation = false)
Komponenty přidávají GameObjectu další vlastnosti a chování,
přes menu GameObject >
Component nebo tlačítkem Add Component 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 na disku, která je do Unity přímo zrcadlena.
Library).
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.
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ě..meta → nové GUID → rozbité
odkazy
(„Missing script reference“)..meta soubory musí být v Gitu (jsou textové, malé).Prefab je předpřipravená šablona prvku scény: uložený GameObject (nebo celá hierarchie) i se všemi komponentami, skripty a texturami.
Instantiate().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.
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.
manifest.json.
Např. OpenXR plugin, XR Interaction Toolkit (XRI), Input System,
URP, XR Plugin Management a XR Hands.
K nalezení v okně Package Manager >
Unity Registry.
Select, Activate,
AimPose, GripPose.
/interaction_profiles/oculus/touch_controller, valve/index_controller,
khr/simple_controller).
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í).
com.unity.xr.interaction.toolkit:
oficiální vysokoúrovňový framework pro interakce (grab, ray, poke, UI), rig hráče a pohyb.com.unity.xr.openxr: Unity bridge implementující
OpenXR standard pro desktop i standalone (Android/Quest).com.unity.inputsystem: moderní event-driven vstup
s Action Maps (povinný pro XRI).XR Origin je kořenový GameObject reprezentující hráče a jeho herní prostor ve scéně.
Tracking Origin Mode
(Floor pro room-scale / Device pro sedící).Tracked Pose Driver mapuje 6DoF pozici a rotaci
HMD.XR Controller (Action-based) sleduje
pozici rukou a předává stisky tlačítek.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).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).
Teleportation Provider (skoky na plochy Teleport Area / Anchor),
Continuous Move Provider (pohyb páčkou) a Snap / Continuous Turn Provider
(otáčení hráče).
Hierarchy: strom všech GameObjectů scény včetně vnoření.
Scene: editační pohled s gizmos
Game: pohled
kamery.
Project: struktura stejná jako na disku (složka Assets).
Pravé tlačítko v Hierarchy: vytvoření objektu, přidání komponenty, duplikace, Create Prefab.
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ů.
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.
Textures, Images,
Scripts, Models, Prefabs, Materials.
Enemy_Soldier_01).Health než deset kopií.
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.
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
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.
Inspector zobrazuje vybraný GameObject a všechny jeho komponenty.
Je to hlavní místo, kde se nastavují vlastnosti.
FindWithTag).
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.
Přidávají se přes menu GameObject > Component > Physics.
Ří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í.
FixedUpdate (např.
50/90 Hz), displej běží na 90/120 Hz. Bez Interpolate předměty při pohybu
mikro-trhají → spouštěč nevolnosti.
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.
Přiřazuje se do Collideru a definuje tření a pružnost při kontaktu:
Primitivní collidery (Box, Sphere,
Capsule):
analyticky přesné a extrémně rychlé na výpočet.
OnCollisionEnter(Collision).
OnTriggerEnter(Collider).Rigidbody!SphereCollider o $r\approx10$ cm).
Raycast proti colliderům
ve scéně: uchopení z dálky, teleportace a interakce s World Space UI.
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.
breakForce), nastavit vzájemnou transformaci.
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.
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.
.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.
[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.
Třída odvozená od MonoBehaviour se chová jako komponenta: lze ji
připojit k libovolnému GameObjectu.
Kód v C#: Create > C#
Script v
Project panelu.
public pole a
[SerializeField] se objeví v Inspektoru → ladění bez překladu.
GetComponent<Rigidbody>()
(volat v Awake, ne v Update).
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);
}
}
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.
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>.
Move Type (Kinematic / Velocity Tracking).
Vzájemná vazba přes Layer Mask a rozhraní IXRSelectInteractable;
bez
collideru na předmětu nelze uchopit.
[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.
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.
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.
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.
Assets v projektu: nejjednodušší a
nejrychlejší.
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.
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.
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í.
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.
SceneManager.LoadScene(1) přepne na další).