Flipbook-Textur · der komplette Leitfaden

Flipbook-Textur: So animieren Sie Sprites in Unity, Godot & VRChat

Erstellen Sie Ihre eigene Flipbook-Textur

Eine Flipbook-Textur spielt ein Sprite-Sheet auf einer Oberfläche Frame für Frame ab. Lernen Sie, wie Sie eine in Unity, Godot und VRChat erstellen, und spielen Sie ein echtes Sprite-Sheet live in 3D ab.

✦Sprite
Erstellen Sie eine Flipbook-Textur aus einer magischen Portalschleife

Eine Flipbook-Textur ist ein Sprite-Sheet, das ein Shader Frame für Frame auf einer einzelnen Oberfläche abspielt. Es gibt kein Rig und keine Timeline: Das Sheet hält jeden Frame in einem festen Raster, und das Material bewegt ein kleines Fenster mit konstanter Geschwindigkeit über dieses Raster. Ein 8 x 8 großes Sheet enthält 64 Frames; bei 12 Frames pro Sekunde wiederholt es sich in etwa 5,3 Sekunden. Das Mesh ändert sich nie, keine Textur wird erneut hochgeladen, und die gesamte Animation kostet einen einzigen Texture-Lookup.

Diese Seite behandelt die vier Zahlen, die ein Flipbook-Shader benötigt, und wie der Frame-Index auf UV-Koordinaten abgebildet wird, die zwei Möglichkeiten, eine Flipbook-Textur in Unity anzusteuern, wie ein Poiyomi-Flipbook auf einem VRChat-Avatar eingerichtet wird, das Äquivalent in Godot und Phaser und wie Sie Ihr eigenes Sheet aus einem GIF oder aus einer schriftlichen Beschreibung erstellen.

Kurzantwort

Eine Flipbook-Textur ist ein Sprite-Sheet, das als Shader-Animation verwendet wird und über die Zeit nach Zeile und Spalte indiziert wird. Das Sheet belegt einen Texture-Slot; jede Shader-Auswertung berechnet aus verstrichener Zeit und einer Frame-Rate einen Frame-Index, reduziert diesen Index auf eine Spalte und eine Zeile und bildet die Oberflächen-UVs auf diese einzelne Zelle ab. Frame = floor(time * fps) mod frameCount, column = frame mod columns, row = floor(frame / columns). Ein 6 x 6 großes Sheet durchläuft bei 10 FPS 36 Frames in 3,6 Sekunden, vollständig auf der GPU, ohne Upload pro Frame und ohne Änderung des Draw Calls.

So funktioniert eine Flipbook-Textur

Vier Zahlen definieren die Animation. Columns und Rows beschreiben das Sheet-Layout. Frame count ist normalerweise columns mal rows und ist der Wert, bei dem der Index umschlägt. Frame rate gibt an, wie schnell der Index voranschreitet. Alles andere — Filterung, Wrap Mode, UV-Insets — existiert, damit der Sampler nicht außerhalb der aktuellen Zelle liest.

Die Index-Mathematik ist kurz und es lohnt sich, sie auszuschreiben. Bei verstrichener Zeit t: frame = floor(t * fps) mod frameCount, column = frame mod columns, row = floor(frame / columns). Das UV-Fenster ist dann tiling = (1 / columns, 1 / rows) und offset = (column / columns, row / rows). Die vertikale Richtung ist der Teil, der viele stolpern lässt. Die meisten Tools zum Erstellen von Sheets schreiben Zeile 0 an den oberen Bildrand, während die UV-Ursprünge von Unity und Godot unten links liegen. Bei einem Sheet mit oberster Zeile zuerst wird in Unity offset.y zu 1 - (row + 1) / rows, sonst laufen die Zeilen invertiert ab und der erste Frame der Animation ist die letzte Zeile des Sheets.

Filterung entscheidet, ob das Ergebnis sauber ist. Setzen Sie den Wrap Mode des Sheets auf Clamp. Bei Repeat liest ein Sample am rechten Rand der Textur den linken Rand, sodass eine Pixelspalte aus Frame 0 im letzten Frame jeder Zeile auftaucht. Schalten Sie Mipmaps für hartkantige Pixel Art aus, weil die Mip-Kette benachbarte Zellen mittelt und die Animation zu Brei wird, sobald die Oberfläche einige Meter entfernt ist. Wenn die Ziel-Engine oder der Shader Mipmaps erzwingt, lassen Sie einen ein oder zwei Pixel breiten transparenten Rand um jede Zelle, oder rücken Sie das UV-Fenster an allen vier Seiten um einen halben Texel ein.

WertWas es steuert
ColumnsFrames nebeneinander. Legt das horizontale Tiling einer Zelle fest: 1 / columns.
RowsRows im Sheet. Legt das vertikale Tiling fest: 1 / rows. Verwenden Sie 1 für einen Strip.
Frame countInsgesamt indizierte Frames, normalerweise columns x rows. Hier schlägt der Index um.
FPSWie schnell der Index voranschreitet. floor(time * fps) liefert den aktuellen Frame.
Wrap ModeClamp. Repeat lässt den Sampler über den Sheet-Rand hinweg lesen.
Filter ModePoint, mit ausgeschalteten Mipmaps, oder UVs um einen halben Texel pro Zelle einrücken.

Flipbook-Textur in Unity

Es gibt zwei Wege, und sie scheitern auf unterschiedliche Weise. Weg eins ist ein Shader, dem der Zeilen- und Spaltenindex gehört und der sich selbst animiert. Weg zwei ist das Animation-Fenster, das Tiling und Offset des Materials per Keyframe animiert, während ein einfacher Lit- oder Unlit-Shader das Sampling übernimmt. Weg eins ist besser für Effekte, die mit der Spielzeit synchron bleiben müssen; Weg zwei ist besser, wenn die Animation von einem Animator-State gesteuert und in der Timeline zusammen mit allem anderen in der Szene sichtbar sein soll.

Legen Sie in jedem Fall zuerst den Sprite-Sheet-Import fest: Wrap Mode Clamp, Mip Maps off, Filter Mode Point und keine Kompression bei Pixel Art. Diese drei Einstellungen verursachen mehr Flipbook-Fehler als die Shader-Mathematik.

Weg 1: ein Shader mit Zeilen- und Spaltenindex

In Shader Graph nimmt der Flipbook-Node Columns, Rows und einen zeitgesteuerten Frame-Index und gibt die neu zugeordneten UVs aus. In einem handgeschriebenen Shader legen Sie _Columns, _Rows und _Fps als Properties offen und berechnen die Zelle in der Vertex- oder Fragment-Stufe. Wenn die Animation objektsynchron laufen muss, steuern Sie den Frame-Index über einen Script-Float statt _Time.y in jedem Material unabhängig abzufragen, damit zwei Flipbooks auf demselben Objekt nicht auseinanderdriften.

Weg 2: Das Animation-Fenster steuert Tiling und Offset

Dieser Weg animiert den _ST-Vektor der Textur. Built-in Standard und Unlit verwenden _MainTex_ST; URP Lit und Unlit verwenden _BaseMap_ST. Das Tiling bleibt fest bei (1, 1 / rows) und nur offset.y ändert sich. Die folgenden Schritte gelten für diesen Weg.

1

01

Wählen Sie das Material aus und öffnen Sie das Animation-Fenster. Erstellen Sie einen Clip und fügen Sie dann die _ST-Vektor-Property der Textur als Track hinzu — sie erscheint als Vector4 am Material.

2

02

Setzen Sie die Sample Rate des Clips auf denselben Wert wie Ihre Ziel-FPS. Wenn die Sample Rate niedriger ist als die gewünschten FPS, fallen Keyframes auf dasselbe Sample zusammen und die Animation läuft langsamer als beabsichtigt.

3

03

Setzen Sie offset.y einmal pro Frame: value = 1 - (row + 1) / rows für ein Sheet mit oberster Zeile zuerst, tiling = (1, 1 / rows).

4

04

Setzen Sie die Interpolation jedes Keyframes im Curve Editor auf Constant. Linear mischt zwei Zellen ineinander, und Sie sehen beide Frames gleichzeitig als Ghosting.

5

05

Stellen Sie sicher, dass der letzte Key nicht den Wert des ersten Frames wiederholt, sonst hält die Animation an der Loop-Naht einen Frame lang an.

6

06

Wenn mehrere Renderer dasselbe Material teilen, animieren Sie einen MaterialPropertyBlock pro Renderer, statt renderer.material zu lesen, das beim ersten Zugriff das Material klont und den Klon für die Lebensdauer des Objekts bestehen lässt.

Poiyomi-Flipbook für VRChat

Der Flipbook-Abschnitt des Poiyomi-Shaders scrollt ein UV-Fenster über ein Sheet direkt am Material, sodass ein Material-Slot einen animierten Sprite auf einem Avatar-Mesh anzeigen kann. Er bietet Rows, Columns und eine Frame-Rate sowie einen Modus, in dem Sie den Frame-Index selbst steuern, statt ihn über die Shader-Zeit laufen zu lassen.

Verwenden Sie einen einzeiligen Strip statt eines Rasters. Ein Strip gibt dem Shader nur eine Achse, entlang derer er schreitet, wodurch die vertikale Naht vollständig entfällt. Bei einem Raster muss sich das UV-Fenster am Ende jeder Zeile eine Zeile nach unten bewegen, und jede Filterung, Mip-Stufe oder Halbtexel-Rundungsfehler an dieser Grenze tastet die benachbarte Zeile ab — sichtbar als dünnes Band eines anderen Frames während der Wiedergabe. Ein Strip macht den Frame-Index außerdem zu einer einfachen Multiplikation: Die Frame-Breite in UV ist 1 / frameCount, und der Offset ist einfach frame / frameCount. Für eine 8-Frame-Animation mit 256 x 256 großen Zellen ist der Strip 2048 x 256 und bleibt eine Zweierpotenz.

Alpha ist auf einem Avatar wichtiger als in einer flachen Szene. Wenn der Sprite harte Kanten hat, verwenden Sie Cutout oder Opaque. Flipbooks in der Transparent-Queue schreiben keine Tiefe, und auf einem Avatar sortieren sie sich gegen den Körper und gegeneinander auf Arten, die sich mit dem Kamerawinkel ändern. Behalten Sie die animierte Oberfläche nach Möglichkeit auf einem Material, das bereits am Avatar ist — jeder zusätzliche Material-Slot zählt gegen den Performance-Rang Ihres Avatars. Wenn der Frame-Index von einem Animator-State mit einem synchronisierten Parameter gesteuert wird, sieht jeder Client denselben Frame; ein aus der Shader-Zeit berechneter Frame-Index wird lokal ausgewertet und kann bei verschiedenen Betrachtern an einer anderen Stelle in der Schleife stehen.

1

01

Exportieren Sie die Frames als einen horizontalen Strip. Die Strip-Höhe entspricht der Zellenhöhe; die Strip-Breite entspricht Frame-Anzahl mal Zellenbreite. Lassen Sie am Ende keine leere Zelle übrig.

2

02

Importieren Sie die Textur mit Wrap Mode Clamp, Mip Maps off und sRGB on. Aktivieren Sie Alpha Is Transparency nur, wenn der Strip tatsächlich Alpha enthält.

3

03

Erstellen Sie ein Poiyomi-Material, weisen Sie es dem animierten Mesh zu und öffnen Sie den Flipbook-Abschnitt.

4

04

Setzen Sie Rows auf 1 und Columns auf die Frame-Anzahl. Setzen Sie die Frame-Rate passend zur gewünschten Dauer — 8 Frames bei 8 FPS ergeben eine Schleife von einer Sekunde.

5

05

Wählen Sie die Frame-Quelle. Der Manual-Modus legt einen Frame-Index offen, den Sie von einem Animator-State steuern; der zeitgesteuerte Modus läuft von selbst in einer Schleife.

6

06

Setzen Sie unter Rendering Cutout oder Opaque für hartkantige Sprites. Verwenden Sie Transparent nur für weichkantige Effekte und rechnen Sie mit Eigenheiten beim Depth-Sorting.

7

07

Prüfen Sie die Schleife: Der letzte Frame darf keine Dublette des ersten sein, sonst friert der Sprite jeden Zyklus einen Frame lang ein.

8

08

Testen Sie in einem hochgeladenen Avatar mit einem Spiegel, aus der Nähe und von der anderen Seite der Instanz. Bei Entfernung treten Mip- und Filterprobleme auf.

Flipbook in Godot & Phaser

In Godot 4 ist der 2D-Weg AnimatedSprite2D mit einer SpriteFrames-Ressource. Importieren Sie das Sheet, öffnen Sie SpriteFrames, setzen Sie Hframes und Vframes auf die Spalten- und Zeilenanzahl, fügen Sie die Frames für die Animation hinzu, stellen Sie dann die Geschwindigkeit der Animation in Frames pro Sekunde ein und lassen Sie Loop aktiviert. SpriteFrames speichert die Animation als Liste von Frame-Indizes, sodass sowohl ein Raster-Sheet als auch ein einzelner Strip ohne UV-Mathematik auf Ihrer Seite funktionieren.

Wenn Sie nur eine Animation benötigen, ist ein einfaches Sprite2D leichter: Setzen Sie Hframes und Vframes einmal und lassen Sie dann die Integer-Property frame von einem AnimationPlayer mit Step-Interpolation voranschreiten. Tween Sie frame nicht mit einer Standard-Easing-Kurve — der Wert ist ein Integer-Index, und eine Interpolation rundet entweder auf einen einzelnen Wert ab oder flackert zwischen zwei Zellen.

Für ein Flipbook auf einer 3D-Oberfläche in Godot ist ein ShaderMaterial mit derselben Zeilen- und Spaltenmathematik wie in der Unity-Version der kürzeste Weg: uv = UV * vec2(1.0 / cols, 1.0 / rows) + vec2(col / cols, row / rows), wobei die Zeile aus dem Frame-Index berechnet wird. Godots UV-Ursprung liegt unten links, genau wie in Unity, daher braucht ein Sheet mit oberster Zeile zuerst dieselbe vertikale Spiegelung.

In Phaser 3 wird das Sheet einmal geladen und beim Laden zerlegt. frameWidth und frameHeight definieren die Zelle, Frames werden von links nach rechts und von oben nach unten nummeriert, und die Animation wird über Frame-Nummern statt über Koordinaten identifiziert — es gibt keinen Shader zu schreiben und keine Zeilen- und Spaltenarithmetik, bei der man Fehler machen könnte.

EngineObjektWas Sie einstellen
Godot 4AnimatedSprite2D + SpriteFramesHframes und Vframes auf das Sheet-Layout, dann die Animationsgeschwindigkeit in FPS mit aktiviertem Loop.
Godot 4Sprite2DHframes und Vframes einmal, dann die Integer-Property frame, vorangeschritten durch einen AnimationPlayer mit Step-Interpolation.
Godot 4ShaderMaterial auf einem 3D-MeshColumns, rows und ein Frame-Index im Shader, mit demselben UV-Remap und vertikaler Spiegelung wie in Unity.
Phaser 3this.load.spritesheetframeWidth und frameHeight; Phaser zerlegt das Sheet von links nach rechts, von oben nach unten.
Phaser 3this.anims.createFrames aus anims.generateFrameNumbers, plus frameRate und repeat: -1 zum Loopen.

Ein Sprite-Sheet live in 3D abspielen

Die spielbare Szene in diesem Abschnitt ist The Cyclops' Island, ausgeführt im 3D Game Builder von Neta Studio. Das Flipbook auf dem Bildschirm ist dieselbe Index-zu-UV-Operation, die oben beschrieben wurde, ausgewertet in einem Three.js-Shader auf der GPU — der Unterschied ist, dass sie auf einem echten Mesh in einer echten Szene läuft, mit einer Kamera, die Sie steuern, und Lichtern, die sich bewegen.

Das ist wichtiger, als es klingt. Ein Flipbook in einer flachen Unity-Szene wird normalerweise frontal betrachtet, wo Naht-Bleeding und Mip-Blending schwer zu erkennen sind. Bewegen Sie die Kamera in einem flachen Winkel um eine animierte Oberfläche, und die Probleme zeigen sich sofort: ein Band der benachbarten Zelle am Frame-Rand, die letzte Mip-Stufe, die zwei Frames zu einem Brei mittelt, oder eine Alpha-Kante, die von vorn korrekt aussieht und von der Seite verschwindet. Der Browser-Build macht die Schleife zwischen dem Erstellen eines Sheets und dem Ansehen auf einer Oberfläche kurz genug, um ohne Build-Schritt zu iterieren.

Mini World ist die kleinere Szene, um ein einzelnes Sheet zu testen — weniger Meshes und kürzere Ladezeit. Agent Sprite Forge erzeugt die Frames, wenn Sie noch kein Sheet haben, und beide Szenen verwenden denselben Flipbook-Pfad, sodass ein Sheet, das in Mini World richtig aussieht, sich in The Cyclops' Island genauso verhält.

Magier-Zauber — ein 4-Frame-Strip, genau die Eingabe, die ein Flipbook-Shader möchte.

Erstellen Sie Ihr eigenes Sheet

Es gibt drei Wege zu einem brauchbaren Sheet: ein vorhandenes GIF konvertieren, ein Raster auf einen einzelnen Strip zuschneiden oder Frames aus einer schriftlichen Beschreibung generieren. Alle drei enden in derselben Datei — ein PNG, bei dem jede Zelle dieselbe Größe hat, von links nach rechts und von oben nach unten angeordnet, wobei die Sheet-Breite ein sauberes Vielfaches der Zellenbreite ist.

Ein GIF zu konvertieren ist der Weg mit der meisten versteckten Arbeit, weil ein GIF keine Sequenz vollständiger Frames ist. Frames sind häufig partielle Diffs gegenüber dem vorherigen Frame, und Verzögerungen werden pro Frame in Hundertstelsekunden gespeichert. Ein Flipbook-Shader akzeptiert eine einzige Frame-Rate, daher muss variables Timing vor dem Export in duplizierte Frames eingeebnet werden.

Ein Raster auf einen Strip zuzuschneiden ist mechanisch: Behalten Sie die benötigte Zeile, schneiden Sie die Höhe auf eine Zelle zu und lassen Sie die Breite bei Frame-Anzahl mal Zellenbreite. Das ist der richtige Schritt, wenn ein Raster-Sheet als einzelne Animation verwendet wird, weil er die vertikale Achse und die damit verbundene Naht entfernt. Das Generieren aus einer Beschreibung ist der dritte Weg — Agent Sprite Forge nimmt eine Aktion und eine Frame-Anzahl und gibt ein Sheet mit fester Zellgröße zurück, wodurch die Handarbeit entfällt, Frames einzeln zu exportieren und auszurichten.

1

01

Ebnen Sie jeden GIF-Frame vor dem Export ein. Dekodieren Sie jeden Frame auf eine Canvas, die den vorherigen Frame weiterführt, sonst exportieren Sie die Diff-Rechtecke statt des Bildes.

2

02

Normalisieren Sie das Timing. Wählen Sie die kürzeste oder die mittlere GIF-Verzögerung und duplizieren Sie dann Frames, wo die Quelle länger hielt, damit das Sheet mit einer konstanten FPS wiedergegeben wird.

3

03

Legen Sie die Frames von links nach rechts, von oben nach unten aus, jede Zelle identisch groß. Machen Sie die Sheet-Abmessungen zu einem exakten Vielfachen der Zellgröße — ein Sheet, das 9,5 Zellen breit ist, tastet für immer die falschen Texel ab.

4

04

Zum Zuschneiden auf einen Strip schneiden Sie die Höhe auf eine Zelle zu und behalten die Breite bei Frame-Anzahl mal Zellenbreite. Löschen Sie die leere letzte Zelle, wenn das Quellraster eine hatte.

5

05

Fügen Sie einen ein oder zwei Pixel breiten transparenten Rand um jede Zelle hinzu, wenn die Ziel-Engine Mipmaps nicht deaktivieren lässt. Andernfalls rücken Sie das UV-Fenster an allen vier Seiten um einen halben Texel ein.

6

06

Um statt zu konvertieren zu generieren, schreiben Sie die Aktion, die Frame-Anzahl und die Blickrichtung, und lassen Sie Agent Sprite Forge ein Sheet mit fester Zellgröße zurückgeben, statt Frames einzeln zu exportieren und von Hand auszurichten.

7

07

Verifizieren Sie, indem Sie den Frame-Index in der Engine Schritt für Schritt durchgehen. Wenn eine Zelle am Rand einen Streifen ihres Nachbarn zeigt, sind das Sheet-Layout oder das UV-Inset falsch, nicht der Shader.

The Cyclops' Island — eine Flipbook-Animation, die auf einer Oberfläche in einer live 3D-Szene läuft.

Betreten Sie die Welt, zu der sie gehört

Ein Sprite ist eine Figur ohne Ort zum Stehen. Der letzte Schritt ist der, den sonst niemand bietet: Nehmen Sie das Sheet, das Sie gerade erstellt haben, und setzen Sie es in eine Welt, in der jemand herumlaufen kann — eine kleine Insel, einen Planeten, eine regnerische Straßenecke. Jede Welt auf dieser Seite wurde aus einer schriftlichen Beschreibung erstellt und als spielbare Seite veröffentlicht.

FAQ

Was ist ein Poiyomi-Flipbook? +

Es ist der Flipbook-Abschnitt des Poiyomi-Shaders, der ein UV-Fenster über ein Sprite-Sheet auf einem Material scrollt, sodass ein Material-Slot einen animierten Sprite auf einem Avatar-Mesh anzeigen kann. Sie legen Rows, Columns und eine Frame-Rate fest und lassen den Frame-Index entweder über die Shader-Zeit laufen oder steuern ihn von einem Animator-State. Ein einzeiliger Strip wird bevorzugt, weil er die vertikale Naht zwischen Zeilen entfernt.

Kann man ein GIF direkt als Flipbook verwenden? +

Nein. Ein GIF speichert Verzögerungen pro Frame und oft nur die Pixel, die sich geändert haben, während ein Flipbook-Shader eine Textur und eine konstante Frame-Rate erwartet. Konvertieren Sie es zuerst: Ebnen Sie jeden Frame auf den vorherigen ein, normalisieren Sie das Timing und schreiben Sie das Ergebnis in ein festes Zellenraster. Der Shader sieht das GIF nie.

Warum blutet meine Flipbook-Textur zwischen Frames? +

Der Sampler liest außerhalb des aktuellen Zellenfensters. Setzen Sie den Texture Wrap Mode auf Clamp, schalten Sie Mipmaps für hartkantige Art aus und rücken Sie das UV-Fenster an jeder Seite um einen halben Texel ein. Bleeding wird mit der Entfernung schlimmer, weil dort die Mip-Kette beginnt, benachbarte Zellen miteinander zu mitteln.

Welche Frame-Rate sollte ein Flipbook verwenden? +

8 bis 12 FPS wirken handanimiert und passen zu Charakter-Sprites; 24 bis 30 passen zu Feuer, Wasser und anderen kontinuierlichen Effekten. Der Shader hat genau eine Rate, wenn die Quelle also variables Timing hatte, duplizieren Sie Frames entsprechend, statt zu versuchen, die Geschwindigkeit mitten in der Schleife zu variieren.

Brauche ich ein Raster, oder reicht eine Zeile? +

Eine Zeile reicht für alles, was als Sequenz abgespielt wird, und sie entfernt eine Achse möglicher Nahtfehler. Raster sind für Sheets, die mehrere Animationen in einer Textur bündeln, bei denen der Shader oder die Engine eine Zeile für Idle, Run oder Attack auswählt. Wenn aus einem Raster-Sheet nur eine Animation hervorgeht, schneiden Sie es auf einen Strip zu.

Funktioniert ein Flipbook mit Unity URP's Lit-Shader? +

Nicht ohne Weiteres — URP Lit hat keinen Frame-Index. Verwenden Sie Shader Graph mit dem Flipbook-Node, der Columns, Rows und einen zeitgesteuerten Index entgegennimmt, oder animieren Sie Tiling und Offset von _BaseMap_ST des Materials mit konstanter Keyframe-Interpolation. Built-in Standard und Unlit verwenden _MainTex_ST nach denselben Regeln.

Zurück zum 3D Game Builder

Alle 31 fertigen 3D-Welten, Spiele und Szenen befinden sich auf einer Seite — jede einzelne spielbar.

Plattform: Neta StudioSeite: Flipbook-Textur: So animieren Sie Sprites in Unity, Godot & VRChatAls Nächstes lesen: /explore/tool/gif-to-flipbook · /explore/tool/gif-to-sprite-sheet · /explore/guide/sprite-sheet

Sprite-Asset-Bibliothek öffnen

Jedes Asset in dieser Bibliothek ist ein transparentes, spielbereites PNG mit einem aufgezeichneten Prompt — Sprite-Sheet-Ressourcen und kostenlose Sprite-Sheets, getaggt nach Aktion, Stil und Motiv. Kostenlos zum Ansehen und Herunterladen.

×