Die Erstellung von Bewegung in einer Umgebung innerhalb eines Erlebnisses hilft, es sofort fühlerbarer und realistischer zu fühlen, in unserer Welt, egal ob das von Umgebungsbäumen, reaktiven Türen aus Spielerinteraktionen oder sogar Boxen, die aufstoßen, oder sogar Animation
Erstellen des Sturms
Der Sturm hat viele Iterationen durchlaufen, bevor wir uns auf das ausgewählte "Lebensraum" von Duvall Drive einigten. Früher dachten wir den Sturm als einen riesigen Obsidian-Pfeiler und in späteren Iterationen betrachteten wir ihn als ein riesiges Portal zum korrupten Platz. Nach dem Experimentieren mit vielen verschiedenen Stürmen mit einzigartigen Aussehen und Gefühlen zu ihnen, haben wir uns auf einen Sturm mit einem kleineren zentralen "Auge" beschlossen,
- Der Sturm soll den Spielern ein Gefühl für die Wirkung dieses Ereignisses auf die Welt geben, einschließlich der Bäume, die fliegen und Trümmer fliegen.
- Der drehende Vortex der Cloud selbst sollte den Spielern einen Blick auf das zentrale Portal ohne alles preiszugeben geben. Dies würde die Spieler ermutigen, sich näher anzusehen, um zu sehen, was vor sich geht.
- Der enger Punkt des Lichts erlauben uns, uns auf die Zusammensetzung des Hauses zu konzentrieren, was sowohl der Hauptcharakter als auch der Ort ist, an dem die meiste Spielzeit stattfindet.
Um den Sturm in seinem Umgebungdynamisch, aggressiv und ständig zu machen, verwendeten wir die folgenden Systeme und Funktionen:
- TweenService > - Für Cloud-Bewegungen.
- Änderungen der Beleuchtung - Um die Cloud zum Blitzen zu erstellen.
- Strahlen - Für die "volumetrische Beleuchtung" und die Blitzschläge.
- Partikel-Emitter - Für Trümmer, die bis zum Portal fliegen und wegen des Windes fliegen.
- Animationen > - Für die Bäume, die im Wind pusteten.
Clouds mit Texturen hinzufügen
Während dynamische Wolken fantastisch für normale, hohe Altitude-realistische Wolken sind, brauchten wir etwas, das sich dramatisch fühlte
Da jedes Cloud-Mesh, das für die vollständige Umgebung des Hauses erforderlich war und wie enorm der Sturm war, wussten wir, dass wir die Textur, die wir verwenden wollten, auf den einzelnen Cloud-Meshs ausbreiten müssen, damit sie auf der Oberfläche des Meshs massiv wiederholt wird. Wir haben die Materialien, die wir für die Cloud auf diesen einfachen Teilen getestet haben, dann auf den Vortex aufgetragen!
Anders als Partikel-Emitter oder Strahlen ermöglichten uns Netzwerke, Licht von jedem Meshabzusenden, was wichtig war, wenn wir Cloud-to-Cloud-Blitze implementieren wollten. Wir modellierten auch in dem Twisting, damit das Licht, das von ihm abgesprungen ist, wie von ihm tief ausging! Dies war besonders in Situationen wichtig, in denen die Leistungsanforderungen des Erlebnisses die Qualitätslevel unserer Oberflächen-Ansicht-Objekte senkte.
Drehende Cloud-Meshes
Nachdem wir mit der Gesamtwohnung des Wolkenbildes zufrieden waren, mussten wir es in Gang bringen! Wir hatten die allgemeinen Formen jeder Wolkenschicht vor Ort, aber es dauerte etwas, um sicherzustellen, dass der drehende Effekt gut in der Praxis aussieht. Wir haben zuerst versucht, Einschränkungen zu verwenden, um Geschwindigkeit zu ermöglichen,
Wir wollten eine einfache zu verwendende Methode, um Instanzen zu drehen, die entweder zu weit interagierbar waren, wie Wolken, oder zu klein oder dekorativ, um wichtig
Wie in vielen Fällen in der Demo verwendeten wir ein LocalSpaceRotation -Tag, damit wir betroffene Instanzen in Studio mit einem Plug-inverwalten konnten. Wir verwendeten nur ein einzelnes LocalScript, das alle betroffenen Instanzen verwaltete, indem es das CollectionService verwendet. Wir hatten also keine Menge an Skripten, die während des Entwick
local function Init()
for _, obj in CollectionService:GetTagged("LocalSpaceRotation") do
if obj:IsDescendantOf(workspace) then
SetupObj(obj)
end
end
end
CollectionService:GetInstanceAddedSignal("LocalSpaceRotation"):Connect(function(obj)
objInfoQueue[obj] = true
end)
CollectionService:GetInstanceRemovedSignal("LocalSpaceRotation"):Connect(function(obj)
if objInfo[obj] then
objInfo[obj] = nil
if objInfoQueue[obj] then
objInfoQueue[obj] = nil
end
end
end)
Init()
obj
Wir haben die Instanzen in der Update -Funktion, die mit dem Herzschlag verbunden ist, drehten. W
local parentTransformif parentObj:IsA("Model") thenif not parentObj.PrimaryPart then-- die primäre part könnte noch nicht gestreamt seincontinue -- warten, bis der primäre teil sich repliziertendparentTransform = parentObj.PrimaryPart.CFrameelseparentTransform = parentObj.CFrameendcurObjInfo.curAngle += dT * curObjInfo.timeToAnglelocal rotatedLocalCFrame = curObjInfo.origLocalCFrame * CFrame.Angles( curObjInfo.axisMask.X * curObjInfo.curAngle, curObjInfo.axisMask.Y * curObjInfo.curAngle, curObjInfo.axisMask.Z * curObjInfo.curAngle )if obj:IsA("Model") thenobj.PrimaryPart.CFrame = parentTransform * rotatedLocalCFrameelseobj.CFrame = parentTransform * rotatedLocalCFrameend
Wir haben nach einem gültigen Model.PrimaryPart überprüft, um die Verarbeitung von Streaming zu behandeln. Wenn ein Update auf unserem Objekt aufgerufen wurde, während ein Model.PrimaryPart (der auf ein Meshzeigen kann) noch nicht gestreamt wurde, würden wir einfach das Update übersp
Entwerfen von Blitzschlägen
Da Studio keinen Lichtning-Generator aus der Box anbietet und das Partikelsystem einige Einschränkungen hat, die bei Helden-Blitzschlägen nicht funktionieren würden, mussten wir mit einer Lösung für die Helden-Blitzschläge kreativ werden. Wir entschieden uns für zwei Hauptsysteme, um die Lichtning: texturierten Strahlen für die Helden-Blitzschläge aus dem Auge des Sturms zu skriptieren und mit Audio- und Post
Strahlen texturieren
Wir verwenden in der Regel entweder ein Sequenz- oder Zeitlinien-Tool, um die Timing eines Beleuchtungsschlag-Effekts wie diesem zu steuern, aber da Studio diese Funktionalität noch nicht bietet, haben wir uns entschieden, Skripte zu schreiben, die die Timing eines Beleuchtungsschlag-Effekts steuern. Die Skriptierung dieses Effekts ist ziemlich einfach, aber es erreicht die folgenden wichtigen Ziele:
- Elemente der Blitzschläge, wie ihre Texturen, Helligkeit und Verzögerungen, werden mit jedem Schlag zufälligisiert.
- Audio- und Post-FX-Änderungen sind mit Strike FX in Einklang.
- Spieler, die entweder im Innenraum oder in der beschädigten Zone sind, würden sie nicht sehen oder hören können.
Wir haben eine serverübergreifende Script, die verschiedene Parameter und Zeitungen berechnet, sie an alle Clients sendet und auf eine zufällige Weise wartet:
local function LightningUpdate()
while true do
task.wait(rand:NextNumber(3.0, 10.0))
local info = CreateFXData()
lightningEvent:FireAllClients(info)
end
end
In CreateFXData füllen wir die Info-Struktur, damit alle Clients die gleichen Argumente erhalten.
Auf der Client-Seite ( LightningVFXClient ) prüfen wir, ob dieser Client die FX ausführen soll:
local function LightningFunc(info)
…
-- keine FX im Innenraum
if inVolumesCheckerFunc:Invoke() then
return
end
-- keine FX, wenn Sie nicht in der "normalen" Welt sind
if not gameStateInfoFunc:Invoke("IsInNormal") then
return
end
…
Darüber hinaus führen wir die Sequenz aus, um Texturen, Positionen und Helligkeit festzulegen, Tweens auszuführen und task.wait(number) zu verwenden. Zufällige Parameter sind aus der Info-Struktur, die wir vom Server erhalten haben, und einige Zahlen sind fixiert.
beam.Texture = textures[info.textIdx]beamPart.Position = Vector3.new(info.center.X + og_center.X, og_center.Y, info.center.Y + og_center.Z)-- Löschenbeam.Brightness = 10ppCC.Brightness = maxPPBrightnessppBloom.Intensity = 1.1bottom.Position = top.PositiontweenBrightness:Play()tweenPPBrightness:Play()tweenPPBrightness:Play()tweenBottomPos:Play()tweenBrightness.Completed:Wait()-- audiodateienif audioFolder and audioPart thenif audioFolder.Value and audioPart.Value thenaudioUtils.PlayOneShot(audioObj, audioFolder.Value, audioPart.Value)endendtask.wait(info.waitTillFlashes)-- and so on
Um zu überprüfen, ob ein Spieler drinnen ist, verwenden wir eine Funktion inVolumesCheckerFunc, die auf vorher platzierte Lautstärken zugreift und prüft, ob die Spielerposition in einem von ihnen (PointInABox) ist. Wir könnten Touch-basierte Detection verwenden, aber wir haben festgestellt, dass, wenn ein Spieler sich in den Lautstärken set
Um zu überprüfen, ob ein Spieler in korrupten Bereichen ist, verwenden wir einen Helper gameStateInfoFunc -Funktion, der den aktuellen Spielzustand überprüft. Um einen zufälligen Sound aus einem Ordner zu spielen, verwenden wir auch eine Helper PlayOneShot -Funktion. Für die Blitzschlag-Elemente selbst waren diese super einfach in Photoshop zu erstellen; wir haben eine sch
Partikel-Emitter-Systeme verwenden
Die Helden-Blitzschläge werden durch ein Partikelsystem unterstützt, das entfernte Blitze erzeugt, indem es den Eindruck eines Wolkenefekts im Hintergrund erzeugt, oder Cloud-to-Cloud-Beleuchtung. Wir erreichten diesen Effekt durch ein sehr einfaches Partikelsystem, das eine Wolken-Werbetafel auf der Peripherie der Hauptsturmwolke flackert. Das System emittiert eine Wolkenpartikelperiode periodisch mit einer zufälligen Transparenz Kurve:
Bäume im Wind pusten
Nachdem wir die Wolken und den Blitz hatten, wie wir es wollten, mussten wir dann zwei weitere Hauptkomponenten eines Sturms hinzufügen: den Wind und den Regen! Diese Elemente präsentierten einige Herausforderungen, einschließlich der Notwendigkeit, innerhalb der aktuellen Einschränkungen von Studio's Physik und Spezialeffsystemen zu arbeiten. Zum Beispiel ist es nicht möglich, Bäume mit aktuellen Wind zu
Wir wussten, dass wir den Effekt des Windes und Regens wirklich verkaufen mussten, wir brauchten die Bäume selbst, um sich zu Verschiebungswerkzeug. Es gibt einige Möglichkeiten, dies innerhalb des Engines zu tun, indem Sie Teile mit Plugins , die öffentlich verfügbar sind, verwenden oder Modelle direkt animieren. Für unsere Zwecke gaben uns Animationen die Fähigkeit, den Bewegungs
Wir haben mit der Rindenserien mehrere Bäume aus dem Endorse Model Pack - Forest Assets . Da diese Bäume bereits existierten, und unsere Erfahrung in Nordwest-Pacific stattfand, sparte uns etwas Zeit am Anfang, wenn wir jedes Modellerstellen mussten.
Nachdem wir unsere Bäume ausgewählt hatten, wussten wir, dass wir sie skinnen müssen. Skinning a mesh ist die Handlung, bei der wir Joints (oder Knochen) zu einem Mesh in einer anderen 3D-Modellierungsanwendung hinzufügen (z. B. Blender oder Maya), und dann Einfluenz auf diese Joints/K
Wir wussten, dass wir unsere Zeit sparen wollten und dieselbe Animationenwiederverwenden wollten, also bauten wir unser erstes Baumgerät und stellen sicher, dass die gemeinsamen Namen generisch sind, da wir diese Namen in den Rigen für die anderen Bäume verwenden wollten. Wir wussten auch, dass wir einen
Nachdem wir unsere Gelenke/Knochen erstellt hatten, war es an der Zeit, eine Test-Animation zu erstellen, um alle Gelenke und Knochen in Studio zu sehen, ob sie sich bewegten, wie wir es wollten. Um dies zu tun, mussten wir den Baum durch den Custom Rig -Einstellung im 3D Importer
Nachdem wir mit den Ergebnissen auf diesem Baum zufrieden waren, war es Zeit, die gleiche Animation auf einem anderen Baum zu testen! Wir wussten bereits, dass es die gleiche Animation zwischen den verschiedenen Ricks für jeden eingebensein wird, also stellen wir sicher, dass unsere Animation so aussieht, wie sie zwischen einem großen Rotwood und einem stolzen Beechwood-Baum aussehen würde!
Um dies zu tun, haben wir den Beechwood-Baum aus diesem Forest Pack genommen und ein ähnliches Rig aufgebaut, indem wir die gleiche genaue Namensgebung für die Verbindungen verwendet haben. Dies ermöglichte es der Animation, die wir zuvor importiert hatten, auch auf diesen Baum angewendet zu werden. Da die Animationen alle basieren auf drehenden Verbindungen, hatte es keine Bedeutung, wie groß, klein, hoch oder breit der Baum war!
Nachdem wir Rig und Skin des Beechwood-Baumes, konnten wir ihn dann importieren und die exakte gleiche Animation anwenden. Dies bedeutete, dass die Iteration und Bearbeitung nur auf einer Datei durchgeführt und die Leistung mit weniger Animationen beim Laufen des Erlebnisses gespeichert wurde.
Als wir alle Baumtypen hatten, die wir animiert wollten, machten wir jeden in Pakete, damit wir weiterhin bearbeiten und aktualisieren können, während wir mehrere der Animationen in der Hauptbereich des Erlebnisses spielen. Da wir wussten, dass sie eine Leistungskosten haben, verwendeten wir sie sparsam um das Haus herum, wo der Effekt am wertvollste ist! In der Zukunft, wenn dies effizienter wird, können Sie mehr und mehr skalierte M
Sturm Debris machen
Wir wollten, dass der Regen schwer aussieht, und dass der Nebel und die Schmutz durch die Bäume wehen. Um dies zu tun, haben wir einige unsichtbare Teile eingerichtet, die als Partikelvolumen mit Kindern Partikel-Emitter sofort unter den großen Sturmwolken blasen. Aufgrund der Partikelanzahlbegrenzung in Studio konnten wir keinen Partikel-Em
Die Regenpartikel nutzten eine neue TexturParticleEmitter.Squash, mit der Sie eine Partikel länger machen oder sie verlegen können. Es ist besonders nützlich für Regen,
Für Nebel, Nebel und Blätter, die durchblasen, war es viel einfacher, ein einzelnes größeres Teilvolumen für weniger Bereiche hinzuzufügen, da wir keine Tonne von Partikeln gleichzeitig laufen lassen mussten. Wir starteten, indem wir ein Volumen einrichteten und die Frequenz der Partikel festlegten, wo sie benötigt wurden.
Danach haben wir unsere Blattblasen und Windtexturen gemacht, und die Partikel so eingestellt, dass sie alle in unterschiedlichen Tempi drehen/ bewegen und bei verschiedenen Geschwindigkeiten beginnen. Dies bedeutete, dass die größeren Nebelpartikel interagieren, und nicht so viel wie eine sich wiederholende Textur aussehen, vor allem, wenn ihre Größe so groß ist.
Das Ergebnis war eine großartige Aktion zwischen den Bäumen, die sich bewegten, dem Fenster, das zugeblasen wurde, und dem Blitz, um den Effekt des Sturms um das zentrale Auge des Sturms zu erstellen.
Das Auge des Sturms einrichten
Das zerbrochene Steineye mit einem glühenden Kern ist so konzipiert, dass die Spieler den ersten Hinweis darauf erhalten, dass etwas böses und okkulte im Haus passiert, das sie weiter erkunden sollen. Da unser Szenario dunkel ist und der Kern weit in der Luft ist, war es wichtig, eine glaubwürdige zerbro
Die Entfernung vom Spieler bedeutete auch, dass wir uns vollständig auf eine normale Karte für die Oberflächendetails des Auges verlassen konnten, damit die Mesh einfach eine einfache Kugel ist! Wir haben die Details in ein hochpoliges Mesh geschnitzt und seine normale Karte auf eine viel niedrigere Polkugel gebacken, damit wir all diese schönen Details bekommen können, ohne die hohe Leistungskosten.
Um dem Auge ein übernatürliches Gefühl zu geben und seine Präsenz zu betonen, haben wir uns entschieden, ein glühendes, neonmagmas zu erstellen, das durch seine Risse eindringt. Während es keine emittierende Kanal für
Eine weitere Herausforderung, die wir beim Erstellen des Auges auftaten, war die von unserer Verwendung von Streaming kombiniert mit der Entfernung des Auges von dem Spieler:in
Wir konnten Bewegung in das Auge und seine Ringe hinzufügen, dank des gleichen Skripts, das wir verwendet haben, um die Wolken-Meshes zu drehen. Für einen finalen Touch haben wir uns entschieden,
Erweiterung der Pantry
Eine der lustigsten Dinge, die zu produzieren waren, waren die korrupten Räume, in denen wir Spieler Erwartungen an Realität buchstäblich ändern konnten, indem wir sie um sie herum verschieben. Zum Beispiel in dem Vater's Puzzle wollten wir einen Moment emulieren, in dem keine Matter wie schnell Sie ausführen, die Room fühlt sich wie es weiter wird. Wir entschieden uns, eine erweiterte Pantry zu erstellen, die weg von den Spielern, wenn
Wir haben dies mit einem einfachen Bewegung der Wände und einer klugen Anordnung unserer Räume eingerichtet, die auf beiden Seiten der Pantry erscheinen würde. Im normalen Zustand des Raums war die Pantry ein einfacher Flur, aber im beschädigten Platzwar sie tatsächlich viel länger mit mehreren Flügeln und einer falschen Wand!
Die falsche Wand war eine Modellgruppe, die wir zurückkehren würden, wenn Spieler einen Trigger-Volumen betreten, was ein durchsichtiger Teil früher in der Pantry war, durch den sie gehen würden. Dieser Trigger wurde auch in einem Skript verwendet, das ähnlich ist wie die verwendeten auf all unseren Türen, die als TweenService bekannt ist, um von einem Ziel zu einem anderen zu bewegen. Wir verwendeten Teilvolumen,
Da TweenService ein solches Allgemein-System ist, mussten alle unsere Wand-Datenmodelle dieselben Komponenten enthalten. Zum Beispiel ist das folgende Bild ein Beispiel für ein allgemeines Türskript, das ein Sound definiert, der von einem "Wert" unter dem "Grow_Wall"-Modell aufgerufen wird.
Das gleiche Skript, das. PL: die Skripts, mit einigen Änderungen in der folgenden Codebeispiel, hat auch Audio für die Pantry-Bewegung ausgelöst. Dies hat viel zum Bewegung hinzugefügt!
local Players = game:GetService("Players")
local TweenService = game:GetService("TweenService")
local model = script.Parent
local sound = model.Sound.Value
local trigger = model.Trigger
local left = model.TargetL_Closed
local right = model.TargetR_Closed
local tweenInfo = TweenInfo.new(
model.Speed.Value, --Zeit/Geschwindigkeit der Tür öffnen
Enum.EasingStyle.Quart, --Stil einfahren
Enum.EasingDirection.InOut, --Richtung leiten
0, --Count wiederholen
false, --Reverse true
0 --Verzögerung
)
local DoorState = {
["Closed"] = 1,
["Opening"] = 2,
["Open"] = 3,
["Closing"] = 4,
}
local doorState = DoorState.Closed
local playersNear = {}
local tweenL = TweenService:Create(left, tweenInfo, {CFrame = model.TargetL_Open.CFrame})
local tweenR = TweenService:Create(right, tweenInfo, {CFrame = model.TargetR_Open.CFrame})
local tweenLClose = TweenService:Create(left, tweenInfo, {CFrame = model.TargetL_Closed.CFrame})
local tweenRClose = TweenService:Create(right, tweenInfo, {CFrame = model.TargetR_Closed.CFrame})
local function StartOpening()
doorState = DoorState.Opening
sound:Play()
tweenL:Play()
tweenR:Play()
end
local function StartClosing()
doorState = DoorState.Closing
--Modell["Tür"]:Spielen()
tweenLClose:Play()
tweenRClose:Play()
end
local function tweenOpenCompleted(playbackState)
if next(playersNear) == nil then
StartClosing()
else
doorState = DoorState.Open
end
end
local function tweenCloseCompleted(playbackState)
if next(playersNear) ~= nil then
StartOpening()
else
doorState = DoorState.Closed
end
end
tweenL.Completed:Connect(tweenOpenCompleted)
tweenLClose.Completed:Connect(tweenCloseCompleted)
local function touched(otherPart)
if otherPart.Name == "HumanoidRootPart" then
local player = Players:GetPlayerFromCharacter(otherPart.Parent)
if player then
--print("触摸")
playersNear[player] = 1
if doorState == DoorState.Closed then
StartOpening()
end
end
end
end
Als wir die falsche Wand hinter dem Raum bewegten, mussten wir den Rest des Inhalts bewegen, um mit ihm zu gehen. Um dies zu tun, mussten wir alle lose Gegenstände auf der Pantry anbringen, um sie mit der Wand zu verbinden. Um dies zu tun, mussten wir alle Objekte auf der Pantry zu verschweißen, um sie als einzelnes Objekt zu verschieben. Wenn wir dies taten, hatten wir die Option, diese Gegenstände
Das Verdorbene Baumhaus erstellen
Studio ist ein fantastisches physikalisch basiertes Engine, das du verwenden kannst, um alles zu erstellen, von einer Schwingtür bis zu einer drehenden Plattform. Mit unserer Demo wollten wir Physik verwenden, um ein Gefühl von Realismus in einer sonst unrealistischen Reihe von Umgebungen zu erstellen. Mit nur ein paar Einschränkungen kannst du einige lustige und herausfordernde Hindernisläufe innerhalb deiner eigenen Erlebnisse erstellen!
Einschränkungen sind eine Gruppe von physisch basierten Motoren, die Objekte ausrichten und das Verhalten begrenzen. Zum Beispiel können Sie einen Rod-Einschränkung verwenden, um sich mit Objekten in einer bestimm
Als Spieler in den Hauptbereich des Puzzles gingen, begrüßten sie einen Blick auf Roblox: einen Hindernisparcours. Dieser spezielle Hindernisparcours bestand aus mehreren drehenden Plattformen und drehenden Wänden, sowie "sicheren Bereichen", die die Geschichte fortsetzten. Wir konzentrieren uns auf die drehenden/drehenden Elemente.
Warum haben wir hier Einschränkungen verwendet? Weil TweenService oder andere Methoden den Spieler nicht bewegen würden, während sie auf ihnen standen. Ohne das Objekt, das den Spieler:inbewegt, könnte jemand auf eine Plattform springen und sie aus ihnen herausbiegen. Stattdessen wollten wir, dass Spieler durch eine drehende Plattform navig
Um dies zu tun, mussten wir zuerst Assets aus unserer aktuellen Kit verwenden und irgendeinen neuen Inhalt für einen visuellen Effekt hinzufügen. Wir haben einige unvollständige Wände und Plattformen mit Löchern in ihnen erstellt, um die Geschichte des Großmutters zu erzählen, der den Baumhausbaum erbaute. Da wir keine ganzen Plattformen und Schienenstücke erstellen wollten, haben wir 4 verschiedene Basisstücke und Schienenstücke separ
Wir wussten, dass da wir Einschränkungen verwendet haben, würden wir nicht in der Lage sein, diese Meshes zu verankern, da sie nicht mit der Präsenz eines Einschränkung/M
Es war jetzt an der Zeit, das tatsächliche Verhalten der Hintergriffsbeschränkung selbst einzurichten, und die Anhänge hinzuzufügen, die als Ausrichtung des Teils und der Beschränkung zusammen agieren würden. Wir platzierten den drehenden Anhang auf dem Motor_Turn, der die
Um die Plattformen mit konstanter Geschwindigkeit zu drehen, stellen wir dann die HingeConstraint.AngularVelocity, HingeConstraint.MotorMaxAcceleration und HingeConstraint.MotorMaxTorque Eigenschaften auf Werte ein, die die Bewegung und den Rückgang verhindern, wenn ein Spieler darauf springt.
Jetzt mussten wir die drehenden Wände herstellen. Die Wände mussten auf ihrem offensichtlichen Zentrum drehen, und wir wussten, dass wir sie so konstruieren, dass alle Wände relativ zu anderen Ausrichtungen in der restlichen Stufeverwaltet werden können. Wie die Plattformen bauten wir diese, damit alle Wände frei von Anker und verschweißt an den Motor_Turn.
Wir verwendeten Texture Objekte auf dem SurfaceAppearance Objekten, um einige Variationen zu unseren Basismaterialien hinzuzufügen
Nachdem wir ein paar Plattformen und drehende Wände getestet hatten, machten wir mehrere Variationen und spielten mit ihrem Platz, um sicherzustellen, dass der Hinderniskurs herausfordernd, beeindruckend und auch klar war, wo der Spieler Losmuss! Es dauerte einige Anpassungen an ihren Werten und Positionen, um sie gut auszuführen. Wir hatten mehrere Punkte, an denen die Plattformen und Wände m
Wenn Sie sich nicht sicher sind, was Ihre physischen Objekte treffen, können Sie Kollisionsfähigkeit von der Visualisierungsoptionen-Werke in der oberen rechten Ecke der Ansichtsfensterein-/ausschalten.
Wie Sie unten sehen können, sind die Tür/Fenster-Löcher sichtbar, aber die kleineren Details wie die Sub-Panelling sind nicht. Dies liegt daran, dass die CollisionFidelity -Eigenschaft für die Wände auf Box festgelegt wurde. Wir benötigten keine Präzision für diese Panels, daher mussten wir diese Assets nicht für die Leistung optimieren