Zunächst fügen wir jetzt eine neue Variabel zur Variabel Liste hinzu:
//Variable List var name EyeSocket; //Name des Sockets an dem die Kamera befestigt werden soll
Anschließend weisen wir dieser Variabel in den Default-Properties den Namen unseres Augen-Sockets zu:
Am Ende der Zuweisung fehlt kein Semikolon, bei den Default Eigenschaften, werden keine verwendet.
defaultproperties { EyeSocket=Eyes }
Nun überschreiben wir eine Funktionen um die Kamera an dem Socket zu befestigen:
//Functions /* GetViewRotation Aufgerufen von UDKPlayerController::GetPlayerViewPoint(), welche wiederum von der aktuellen Kamera aufgerufen wird */ //Entferne die Kommentarzeichen (/* */) um die folgende Funktion um immer die genaue Rotation des Sockets zu nutzen //Das bedeutet, dass auch die Bewegung der Animation mit einbezogen wird. /* simulated event rotator GetViewRotation() { local vector out_Loc; local rotator out_Rot; // Pruefen ob EyeSocket korrekt zu gewiesen wurde if (EyeSocket == '') return Super.GetViewRotation(); Mesh.GetSocketWorldLocationAndRotation(EyeSocket, out_Loc, out_Rot); return out_Rot; } */ /* GetPawnViewLocation Eine andere Klasse möchte die Position unserer Augen haben */ simulated event Vector GetPawnViewLocation() { local vector viewLoc; // Pruefen ob EyeSocket korrekt zu gewiesen wurde if (EyeSocket == '') return Location + BaseEyeHeight * vect(0,0,1); Mesh.GetSocketWorldLocationAndRotation(EyeSocket, viewLoc); return viewLoc; }
Okay, die Kernfunktionen sind nun implementiert. Nun müssen wir nur noch unserem Pawn sagen, welches SkeletalMesh er benutzen soll:
Dieser Code kommt nun zu der Zuweisung von oben in die Default-Properties:
Begin Object Class=SkeletalMeshComponent Name=PawnSkeletalMeshComponent //Your Mesh Properties SkeletalMesh=SkeletalMesh'CH_IronGuard_Male.Mesh.SK_CH_IronGuard_MaleA' AnimTreeTemplate=AnimTree'CH_AnimHuman_Tree.AT_CH_Human' PhysicsAsset=PhysicsAsset'CH_AnimCorrupt.Mesh.SK_CH_Corrupt_Male_Physics' AnimSets(0)=AnimSet'CH_AnimHuman.Anims.K_AnimHuman_BaseMale' Translation=(Z=8.0) Scale=1.075 //General Mesh Properties bCacheAnimSequenceNodes=FALSE AlwaysLoadOnClient=true AlwaysLoadOnServer=true bOwnerNoSee=false CastShadow=true BlockRigidBody=TRUE bUpdateSkelWhenNotRendered=false bIgnoreControllersWhenNotRendered=TRUE bUpdateKinematicBonesFromAnimation=true bCastDynamicShadow=true RBChannel=RBCC_Untitled3 RBCollideWithChannels=(Untitled3=true) bOverrideAttachmentOwnerVisibility=true bAcceptsDynamicDecals=FALSE bHasPhysicsAssetInstance=true TickGroup=TG_PreAsyncWork MinDistFactorForKinematicUpdate=0.2 bChartDistanceFactor=true RBDominanceGroup=20 bUseOnePassLightingOnTranslucency=TRUE bPerBoneMotionBlur=true End Object Mesh=PawnSkeletalMeshComponent Components.Add(PawnSkeletalMeshComponent)
Okay, jetzt müssen wir lediglich noch eine neue „GameInfo“, also quasi einen Spielmodus erstellen, der dem Spiel sagt, dass wir unseren MyPawn verwenden wollen.
Wir legen eine neue Datei MyGameInfo.uc in unserem Ordner an und tragen dort diesen Code ein:
class MyGameInfo extends UDKGame; defaultproperties { DefaultPawnClass=class'MyPawn' Name="Default__MyGameInfo" }
Jetzt starten wir das UnrealFrontend (im bin Ordner von UDK) und compilieren unsere Scripte.
Lief die Compelierung erfolgreich ab:
Können wir unser VR-Spiel in UDK Testen!
Jetzt legen wir eine neue Karte an oder wählen die, die wir an Tag 1 erstellt haben, und wählen unseren Spieltyp in den World Properties aus:
In dem Feld „Game Type For PIE“ sollte derselbe Modus ausgewählt werden. Dieser Spielmodus wird verwendet, wenn man das Spiel über das blaue „Play“ Symbol im Editor startet.
Auf der nächsten Seite gibt es dann nochmal den Code von der MyPawn.uc im Ganzen und Screenshots von unserem Ergebnis:
[…] Woche folgt eine News der anderen, daher komme ich gar nicht dazu dem UDK Tag 2 Tutorial den letzten Schliff zu geben, aber es kommt – versprochen! Es wurden noch einige weitere […]
[…] die meisten sind aber empfehlenswert. Diese Anleitung geht noch nicht auf die Kombination “Full Body Awareness” und Oculus Rift ein, sondern soll erst einmal erklären wie man das Rift zusammen mit UDK zum […]