From b6127fb3cc9c9b9f352ce7ae6b6bc4e5c86ea423 Mon Sep 17 00:00:00 2001 From: Mikulas Florek Date: Sun, 8 Dec 2024 00:42:18 +0100 Subject: [PATCH] animation graph docs wip --- docs/animation/graph.md | 75 +++++++++++++++++++++++++ docs/images/animation/graph_inputs.png | Bin 0 -> 21187 bytes docs/readme.md | 5 ++ 3 files changed, 80 insertions(+) create mode 100644 docs/animation/graph.md create mode 100644 docs/images/animation/graph_inputs.png diff --git a/docs/animation/graph.md b/docs/animation/graph.md new file mode 100644 index 0000000000..b902e17c70 --- /dev/null +++ b/docs/animation/graph.md @@ -0,0 +1,75 @@ +# Animation graph + +The animation graph allows you to define and **control the flow of animations based on various conditions and inputs**. By connecting different nodes, you can create complex animation behaviors that respond dynamically to game events and user inputs. + +## Animator + +Animator is the component that assigns an animation graph to an entity. It has following properties: + +* Source - the [controller](#controller) being used +* Default set - the set that is active by default, see [sets](#sets) +* Use root motion - whether [root motion](#root-motion) is used + +## Controller + +A controller is a resource that contains an animation graph. A single controller can be referenced by multiple animators. A new animation controller can be created from the context menu in the asset browser. To open the animation graph editor, double-click on a controller in the asset browser. + +## Inputs +Inputs are variables that external systems (scripting, etc.) use to communicate with the animation graph. They can be managed (created, removed, edited) on the left side of the animation graph editor. + +![Graph inputs UI](../images/animation/graph_inputs.png) + +Each input have a name and one of the following types: +* Number +* Boolean +* Vector3 + +To set value of an input from Lua script, use the following code: +```lua +local speed_input_idx = this.animator:getInputIndex("speed_y") +local speed_y = 1.5 +this.animator:setFloatInput(speed_input_idx, speed_y) +``` + +## Slots and sets + +Slots and sets are mechanisms used by the animation graph to access actual animations. An animation graph contains a collection of **slots**, which are essentially **strings**. Instead of referencing animations directly, nodes in the graph reference these slots. The actual **mapping between slots and animations is defined by a set**. A set does not necessarily contain mapping for every slot. Slots and sets can be managed on the left side of the animation graph editor. + +For example, we can have following configuration: + +| Slots | Set 1 | Set 2 | +|---------------|----------------------|----------------------| +| move forward | stand_move_f.ani | crouch_move_f.ani | +| move left | stand_move_l.ani | crouch_move_l.ani | +| move right | stand_move_r.ani | crouch_move_r.ani | +| jump | jump.ani | | +| idle | stand_idle.ani | crouch_idle.ani | + +**Notice that Set 2 does not contain a mapping for jump**. This way, we can reuse the same graph for crouching and standing by simply applying a different set. Thanks to sets, we can also reuse the same graph for different types of actors - e.g. a wolf and a lion can share the same graph, just using different sets. + +**We can apply multiple sets to the same animator**. Every time we apply a set to an animator, only the slots contained in the set are overridden. In our example, applying Set 2 after Set 1 does not override the jump slot. + +## Nodes + +The middle part of the animation graph editor contains the graph canvas. Here, you can see the visual representation of nodes in the graph. You can also select, move, delete, and link nodes here. New nodes can be created from the context menu. A newly created graph contains just a single output node. + +### Output +### Animation +### Constant +### Input +### Math + +[Inverse kinematics](inverse_kinematics.md) + +### Tree +### Blend 1D, 2D +### Layers +### Play rate +### Select +### Switch + +## Root motion + +## Debugger + +## Replay \ No newline at end of file diff --git a/docs/images/animation/graph_inputs.png b/docs/images/animation/graph_inputs.png new file mode 100644 index 0000000000000000000000000000000000000000..3d4ad708b38a1b4c6d7046a80a18ffb0eb32ff7b GIT binary patch literal 21187 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 literal 0 HcmV?d00001 diff --git a/docs/readme.md b/docs/readme.md index d4af8efc9b..f75d126230 100644 --- a/docs/readme.md +++ b/docs/readme.md @@ -13,6 +13,11 @@ * [Type checking](lua/type_checking.md) * [Snippets](lua/snippets.md) +# Animation + +* [Animation graph](animation/graph.md) +* [Inverse kinematics](animation/inverse_kinematics.md) + # Renderer * [Shaders](shaders.md)