Entwicklung einer beweglichen Welt

*Dieser Inhalt wurde mit KI (Beta) übersetzt und kann Fehler enthalten. Um diese Seite auf Englisch zu sehen, klicke hier.

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:

  1. TweenService > - Für Cloud-Bewegungen.
  2. Änderungen der Beleuchtung - Um die Cloud zum Blitzen zu erstellen.
  3. Strahlen - Für die "volumetrische Beleuchtung" und die Blitzschläge.
  4. Partikel-Emitter - Für Trümmer, die bis zum Portal fliegen und wegen des Windes fliegen.
  5. 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

Ein einzelnes Cloud-Mesh.
mehrstufige Wolkenmeshes ohne ihre Texturen!

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.

Als wir mit dem Hinzufügen von Beleuchtung zu ihm begonnen, mussten wir Details zu den Meshes hinzufügen, um sie besser auf Beleuchtung reagieren zu lassen!

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 parentTransform
if parentObj:IsA("Model") then
if not parentObj.PrimaryPart then
-- die primäre part könnte noch nicht gestreamt sein
continue -- warten, bis der primäre teil sich repliziert
end
parentTransform = parentObj.PrimaryPart.CFrame
else
parentTransform = parentObj.CFrame
end
curObjInfo.curAngle += dT * curObjInfo.timeToAngle
local rotatedLocalCFrame = curObjInfo.origLocalCFrame * CFrame.Angles( curObjInfo.axisMask.X * curObjInfo.curAngle, curObjInfo.axisMask.Y * curObjInfo.curAngle, curObjInfo.axisMask.Z * curObjInfo.curAngle )
if obj:IsA("Model") then
obj.PrimaryPart.CFrame = parentTransform * rotatedLocalCFrame
else
obj.CFrame = parentTransform * rotatedLocalCFrame
end

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:

  1. Elemente der Blitzschläge, wie ihre Texturen, Helligkeit und Verzögerungen, werden mit jedem Schlag zufälligisiert.
  2. Audio- und Post-FX-Änderungen sind mit Strike FX in Einklang.
  3. 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öschen
beam.Brightness = 10
ppCC.Brightness = maxPPBrightness
ppBloom.Intensity = 1.1
bottom.Position = top.Position
tweenBrightness:Play()
tweenPPBrightness:Play()
tweenPPBrightness:Play()
tweenBottomPos:Play()
tweenBrightness.Completed:Wait()
-- audiodateien
if audioFolder and audioPart then
if audioFolder.Value and audioPart.Value then
audioUtils.PlayOneShot(audioObj, audioFolder.Value, audioPart.Value)
end
end
task.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.

Das Forest-Paket enthält mehrere Baumarten, die Ihnen Zeit in Ihren eigenen Erlebnissen sparen können.

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

Die Bäume haben primäre, sekundäre und tertiäre Verbindungen, damit wir glaubwürdige Bewegung haben, wenn wir vom Wind umgeblasen werden.

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

Die gleiche Hierarchie innerhalb von Studio.

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!

Die Animation, die wir auf dem Redwood-Baum importiert haben.

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!

Der Baum hat die gleiche genaue Namensgebung für seine Verzahnungen, nur nicht die gleiche Menge. Dies ist in Ordnung, da das Animationssystem nur Animationen auf diese spezifischen Verzahnungen anwendet, die den Namen in der Animation enthalten! Aus diesem Grund können wir die gleichen Animationen auf alles anwenden, was die Verzahnungennamen entspricht!

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.

Mit dem Animations-Editor könnten wir die gleiche Redwood-Baum-Animation auf den Beechwood-Baum anwenden!

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

Wir haben sofort nach dem Haus gegangen, wo der Vortex am stärksten war und der visuelle Effekt am meisten beeindruckend für Spieler war.

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

Wir haben mehrere Lautstärken verwendet, um sowohl die Menge des Regens zu erhalten, als auch die spezifische Abdeckung des Regens, die wir wollten.

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,

Ein Squash-Wert von 3 beginnt, die Textur länger zu verlängern.
Ein Wert von 20 schießt die Partikel viel länger, aber wir mussten auch den Größenwert erhöhen.

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.

Es gab einige Partikelmengen, weshalb wir keine Partikel in das Haus einschleifen konnten, und weil wir nicht fühlten, dass sie durch die Bäume wie der Nebel bewegt werden mussten.
Der Nebelpartikel-Volumen war viel größer, da die Partikel groß waren, und wir nicht so genau sein mussten, wo wir sind.

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.

Nebelpartikel
Blattpartikel

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 frühe Beleuchtung in deiner Szene kann dir eine Menge Arbeit sparen. Du könntest nicht die Oberfläche-Details auf den Ringen sehen, da unsere Szene die finale Beleuchtung noch nicht einsatzbereit ist. Es würde also nicht notwendig sein, die Zeit zu verschwenden, um sie dort zu platzieren!

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.

Hoch poly Skulpturen
Niedrige Poly-Mesh-Netzwerke
Das niedrige Poly-Mesh mit den normalen Informationen aus der hohen Poly-Skulptur, die gebacken ist

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

Die Verzahnung der Innensphäre. Wir haben einen Gradienten erstellt, der am leichtesten um den Blick herum ist, um eine größere Tiefe und visuelle Interesse zu geben.

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,

Das Bild, das wir verwendet haben, um eine Illusion einer Welt jenseits der Wolken zu erstellen. Wenn Spieler weit von etwas entfernt sind, kann ein einfaches Bild genug sein, um die Illusion von mehr Tiefe und Komplexität in deiner Szene zu erstellen!

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!

Der korrupte Zustand der Küchen-Pantry.
Die falsche Wand, die von Spielern wegzieht.

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,

Die Teilvolumen-Tranche hat eine falsche Wand hinter dem Teil, um zu seinem Endpunkt zu verschieben. Sie wird in diesem Bild mit einem gelben Farbton sichtbar gemacht.
Target_Closed war eine generische Ziel partei, die wir auf all unseren Türen verwendet haben, wo sie drehensollen. Hier wurde sie wiederverwendet, um der Flurwand zu sagen, wo sie hin müssen.

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

Das Rätsel des Sohnes hat mit den Spielern im selben Raum begonnen, aber alles war seitlich.

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.

Die Verwirrung der Gedanken hat die Tatsache verbergt, dass das Gameplay hier sehr einfach war.

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

Sie könnten auch beobachten, wie sich Ihre Freunde drehen, während Sie versuchen, den Hindernisparcours zu meistern.

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.

Attachment0 war im Grunde der Anker für die Schiene und Attachment1 repräsentierte die Schiene selbst. Wir hatten die Schiene ständig drehend, aber Sie können auch einen Schrauben约束 für Türen verwenden.

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 wollten so viel der tatsächlichen Baumhaus-Meshes wiederverwenden, um auf der Erfüllungzu sparen, also folgten wir einem ähnlichen Pfad wie die Plattformen. Mehrere Wandtypen wurden erstellt, die in verschiedenen Kombinationen zusammenstehen konnten, um eine bestimmte Variante zu ermöglichen.

Wir verwendeten Texture Objekte auf dem SurfaceAppearance Objekten, um einige Variationen zu unseren Basismaterialien hinzuzufügen

Sie können sowohl das ähnliche Verhalten als auch die Konfiguration für die Gelenkeinschränkung sehen, und auch, wie wir Texture Objekte verwendet haben.

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.

A close up view of the 3D viewport with the Visualization Options button indicated in the upper-right corner.
Wenn die Kollision visualisierung deaktiviert ist, können Sie die normale Geometrie darstellen sehen, die im Spiel angezeigt wird.
Wenn die Kollisionsvisualisierung aktiviert ist, können Sie die Blätter des Baums sehen, haben keine Kollisionen und werden nicht mit den drehenden Plattformen oder Wänden interferieren.

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