class_animationtree.rst 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555
  1. :github_url: hide
  2. .. DO NOT EDIT THIS FILE!!!
  3. .. Generated automatically from Godot engine sources.
  4. .. Generator: https://github.com/godotengine/godot/tree/4.0/doc/tools/make_rst.py.
  5. .. XML source: https://github.com/godotengine/godot/tree/4.0/doc/classes/AnimationTree.xml.
  6. .. _class_AnimationTree:
  7. AnimationTree
  8. =============
  9. **Inherits:** :ref:`Node<class_Node>` **<** :ref:`Object<class_Object>`
  10. A node used for advanced animation transitions in an :ref:`AnimationPlayer<class_AnimationPlayer>`.
  11. .. rst-class:: classref-introduction-group
  12. Description
  13. -----------
  14. A node used for advanced animation transitions in an :ref:`AnimationPlayer<class_AnimationPlayer>`.
  15. \ **Note:** When linked with an :ref:`AnimationPlayer<class_AnimationPlayer>`, several properties and methods of the corresponding :ref:`AnimationPlayer<class_AnimationPlayer>` will not function as expected. Playback and transitions should be handled using only the **AnimationTree** and its constituent :ref:`AnimationNode<class_AnimationNode>`\ (s). The :ref:`AnimationPlayer<class_AnimationPlayer>` node should be used solely for adding, deleting, and editing animations.
  16. .. rst-class:: classref-introduction-group
  17. Tutorials
  18. ---------
  19. - :doc:`Using AnimationTree <../tutorials/animation/animation_tree>`
  20. - `Third Person Shooter Demo <https://godotengine.org/asset-library/asset/678>`__
  21. .. rst-class:: classref-reftable-group
  22. Properties
  23. ----------
  24. .. table::
  25. :widths: auto
  26. +------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------+-------------------+
  27. | :ref:`bool<class_bool>` | :ref:`active<class_AnimationTree_property_active>` | ``false`` |
  28. +------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------+-------------------+
  29. | :ref:`NodePath<class_NodePath>` | :ref:`advance_expression_base_node<class_AnimationTree_property_advance_expression_base_node>` | ``NodePath(".")`` |
  30. +------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------+-------------------+
  31. | :ref:`NodePath<class_NodePath>` | :ref:`anim_player<class_AnimationTree_property_anim_player>` | ``NodePath("")`` |
  32. +------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------+-------------------+
  33. | :ref:`int<class_int>` | :ref:`audio_max_polyphony<class_AnimationTree_property_audio_max_polyphony>` | ``32`` |
  34. +------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------+-------------------+
  35. | :ref:`AnimationProcessCallback<enum_AnimationTree_AnimationProcessCallback>` | :ref:`process_callback<class_AnimationTree_property_process_callback>` | ``1`` |
  36. +------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------+-------------------+
  37. | :ref:`NodePath<class_NodePath>` | :ref:`root_motion_track<class_AnimationTree_property_root_motion_track>` | ``NodePath("")`` |
  38. +------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------+-------------------+
  39. | :ref:`AnimationNode<class_AnimationNode>` | :ref:`tree_root<class_AnimationTree_property_tree_root>` | |
  40. +------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------+-------------------+
  41. .. rst-class:: classref-reftable-group
  42. Methods
  43. -------
  44. .. table::
  45. :widths: auto
  46. +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  47. | :ref:`Variant<class_Variant>` | :ref:`_post_process_key_value<class_AnimationTree_method__post_process_key_value>` **(** :ref:`Animation<class_Animation>` animation, :ref:`int<class_int>` track, :ref:`Variant<class_Variant>` value, :ref:`Object<class_Object>` object, :ref:`int<class_int>` object_idx **)** |virtual| |const| |
  48. +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  49. | void | :ref:`advance<class_AnimationTree_method_advance>` **(** :ref:`float<class_float>` delta **)** |
  50. +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  51. | :ref:`Vector3<class_Vector3>` | :ref:`get_root_motion_position<class_AnimationTree_method_get_root_motion_position>` **(** **)** |const| |
  52. +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  53. | :ref:`Vector3<class_Vector3>` | :ref:`get_root_motion_position_accumulator<class_AnimationTree_method_get_root_motion_position_accumulator>` **(** **)** |const| |
  54. +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  55. | :ref:`Quaternion<class_Quaternion>` | :ref:`get_root_motion_rotation<class_AnimationTree_method_get_root_motion_rotation>` **(** **)** |const| |
  56. +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  57. | :ref:`Quaternion<class_Quaternion>` | :ref:`get_root_motion_rotation_accumulator<class_AnimationTree_method_get_root_motion_rotation_accumulator>` **(** **)** |const| |
  58. +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  59. | :ref:`Vector3<class_Vector3>` | :ref:`get_root_motion_scale<class_AnimationTree_method_get_root_motion_scale>` **(** **)** |const| |
  60. +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  61. | :ref:`Vector3<class_Vector3>` | :ref:`get_root_motion_scale_accumulator<class_AnimationTree_method_get_root_motion_scale_accumulator>` **(** **)** |const| |
  62. +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  63. .. rst-class:: classref-section-separator
  64. ----
  65. .. rst-class:: classref-descriptions-group
  66. Signals
  67. -------
  68. .. _class_AnimationTree_signal_animation_finished:
  69. .. rst-class:: classref-signal
  70. **animation_finished** **(** :ref:`StringName<class_StringName>` anim_name **)**
  71. Notifies when an animation finished playing.
  72. \ **Note:** This signal is not emitted if an animation is looping or aborted. Also be aware of the possibility of unseen playback by sync and xfade.
  73. .. rst-class:: classref-item-separator
  74. ----
  75. .. _class_AnimationTree_signal_animation_player_changed:
  76. .. rst-class:: classref-signal
  77. **animation_player_changed** **(** **)**
  78. Emitted when the :ref:`anim_player<class_AnimationTree_property_anim_player>` is changed.
  79. .. rst-class:: classref-item-separator
  80. ----
  81. .. _class_AnimationTree_signal_animation_started:
  82. .. rst-class:: classref-signal
  83. **animation_started** **(** :ref:`StringName<class_StringName>` anim_name **)**
  84. Notifies when an animation starts playing.
  85. \ **Note:** This signal is not emitted if an animation is looping or playbacked from the middle. Also be aware of the possibility of unseen playback by sync and xfade.
  86. .. rst-class:: classref-section-separator
  87. ----
  88. .. rst-class:: classref-descriptions-group
  89. Enumerations
  90. ------------
  91. .. _enum_AnimationTree_AnimationProcessCallback:
  92. .. rst-class:: classref-enumeration
  93. enum **AnimationProcessCallback**:
  94. .. _class_AnimationTree_constant_ANIMATION_PROCESS_PHYSICS:
  95. .. rst-class:: classref-enumeration-constant
  96. :ref:`AnimationProcessCallback<enum_AnimationTree_AnimationProcessCallback>` **ANIMATION_PROCESS_PHYSICS** = ``0``
  97. The animations will progress during the physics frame (i.e. :ref:`Node._physics_process<class_Node_method__physics_process>`).
  98. .. _class_AnimationTree_constant_ANIMATION_PROCESS_IDLE:
  99. .. rst-class:: classref-enumeration-constant
  100. :ref:`AnimationProcessCallback<enum_AnimationTree_AnimationProcessCallback>` **ANIMATION_PROCESS_IDLE** = ``1``
  101. The animations will progress during the idle frame (i.e. :ref:`Node._process<class_Node_method__process>`).
  102. .. _class_AnimationTree_constant_ANIMATION_PROCESS_MANUAL:
  103. .. rst-class:: classref-enumeration-constant
  104. :ref:`AnimationProcessCallback<enum_AnimationTree_AnimationProcessCallback>` **ANIMATION_PROCESS_MANUAL** = ``2``
  105. The animations will only progress manually (see :ref:`advance<class_AnimationTree_method_advance>`).
  106. .. rst-class:: classref-section-separator
  107. ----
  108. .. rst-class:: classref-descriptions-group
  109. Property Descriptions
  110. ---------------------
  111. .. _class_AnimationTree_property_active:
  112. .. rst-class:: classref-property
  113. :ref:`bool<class_bool>` **active** = ``false``
  114. .. rst-class:: classref-property-setget
  115. - void **set_active** **(** :ref:`bool<class_bool>` value **)**
  116. - :ref:`bool<class_bool>` **is_active** **(** **)**
  117. If ``true``, the **AnimationTree** will be processing.
  118. .. rst-class:: classref-item-separator
  119. ----
  120. .. _class_AnimationTree_property_advance_expression_base_node:
  121. .. rst-class:: classref-property
  122. :ref:`NodePath<class_NodePath>` **advance_expression_base_node** = ``NodePath(".")``
  123. .. rst-class:: classref-property-setget
  124. - void **set_advance_expression_base_node** **(** :ref:`NodePath<class_NodePath>` value **)**
  125. - :ref:`NodePath<class_NodePath>` **get_advance_expression_base_node** **(** **)**
  126. The path to the :ref:`Node<class_Node>` used to evaluate the AnimationNode :ref:`Expression<class_Expression>` if one is not explicitly specified internally.
  127. .. rst-class:: classref-item-separator
  128. ----
  129. .. _class_AnimationTree_property_anim_player:
  130. .. rst-class:: classref-property
  131. :ref:`NodePath<class_NodePath>` **anim_player** = ``NodePath("")``
  132. .. rst-class:: classref-property-setget
  133. - void **set_animation_player** **(** :ref:`NodePath<class_NodePath>` value **)**
  134. - :ref:`NodePath<class_NodePath>` **get_animation_player** **(** **)**
  135. The path to the :ref:`AnimationPlayer<class_AnimationPlayer>` used for animating.
  136. .. rst-class:: classref-item-separator
  137. ----
  138. .. _class_AnimationTree_property_audio_max_polyphony:
  139. .. rst-class:: classref-property
  140. :ref:`int<class_int>` **audio_max_polyphony** = ``32``
  141. .. rst-class:: classref-property-setget
  142. - void **set_audio_max_polyphony** **(** :ref:`int<class_int>` value **)**
  143. - :ref:`int<class_int>` **get_audio_max_polyphony** **(** **)**
  144. The number of possible simultaneous sounds for each of the assigned AudioStreamPlayers.
  145. For example, if this value is ``32`` and the animation has two audio tracks, the two :ref:`AudioStreamPlayer<class_AudioStreamPlayer>`\ s assigned can play simultaneously up to ``32`` voices each.
  146. .. rst-class:: classref-item-separator
  147. ----
  148. .. _class_AnimationTree_property_process_callback:
  149. .. rst-class:: classref-property
  150. :ref:`AnimationProcessCallback<enum_AnimationTree_AnimationProcessCallback>` **process_callback** = ``1``
  151. .. rst-class:: classref-property-setget
  152. - void **set_process_callback** **(** :ref:`AnimationProcessCallback<enum_AnimationTree_AnimationProcessCallback>` value **)**
  153. - :ref:`AnimationProcessCallback<enum_AnimationTree_AnimationProcessCallback>` **get_process_callback** **(** **)**
  154. The process mode of this **AnimationTree**. See :ref:`AnimationProcessCallback<enum_AnimationTree_AnimationProcessCallback>` for available modes.
  155. .. rst-class:: classref-item-separator
  156. ----
  157. .. _class_AnimationTree_property_root_motion_track:
  158. .. rst-class:: classref-property
  159. :ref:`NodePath<class_NodePath>` **root_motion_track** = ``NodePath("")``
  160. .. rst-class:: classref-property-setget
  161. - void **set_root_motion_track** **(** :ref:`NodePath<class_NodePath>` value **)**
  162. - :ref:`NodePath<class_NodePath>` **get_root_motion_track** **(** **)**
  163. The path to the Animation track used for root motion. Paths must be valid scene-tree paths to a node, and must be specified starting from the parent node of the node that will reproduce the animation. To specify a track that controls properties or bones, append its name after the path, separated by ``":"``. For example, ``"character/skeleton:ankle"`` or ``"character/mesh:transform/local"``.
  164. If the track has type :ref:`Animation.TYPE_POSITION_3D<class_Animation_constant_TYPE_POSITION_3D>`, :ref:`Animation.TYPE_ROTATION_3D<class_Animation_constant_TYPE_ROTATION_3D>` or :ref:`Animation.TYPE_SCALE_3D<class_Animation_constant_TYPE_SCALE_3D>` the transformation will be canceled visually, and the animation will appear to stay in place. See also :ref:`get_root_motion_position<class_AnimationTree_method_get_root_motion_position>`, :ref:`get_root_motion_rotation<class_AnimationTree_method_get_root_motion_rotation>`, :ref:`get_root_motion_scale<class_AnimationTree_method_get_root_motion_scale>` and :ref:`RootMotionView<class_RootMotionView>`.
  165. .. rst-class:: classref-item-separator
  166. ----
  167. .. _class_AnimationTree_property_tree_root:
  168. .. rst-class:: classref-property
  169. :ref:`AnimationNode<class_AnimationNode>` **tree_root**
  170. .. rst-class:: classref-property-setget
  171. - void **set_tree_root** **(** :ref:`AnimationNode<class_AnimationNode>` value **)**
  172. - :ref:`AnimationNode<class_AnimationNode>` **get_tree_root** **(** **)**
  173. The root animation node of this **AnimationTree**. See :ref:`AnimationNode<class_AnimationNode>`.
  174. .. rst-class:: classref-section-separator
  175. ----
  176. .. rst-class:: classref-descriptions-group
  177. Method Descriptions
  178. -------------------
  179. .. _class_AnimationTree_method__post_process_key_value:
  180. .. rst-class:: classref-method
  181. :ref:`Variant<class_Variant>` **_post_process_key_value** **(** :ref:`Animation<class_Animation>` animation, :ref:`int<class_int>` track, :ref:`Variant<class_Variant>` value, :ref:`Object<class_Object>` object, :ref:`int<class_int>` object_idx **)** |virtual| |const|
  182. A virtual function for processing after key getting during playback.
  183. .. rst-class:: classref-item-separator
  184. ----
  185. .. _class_AnimationTree_method_advance:
  186. .. rst-class:: classref-method
  187. void **advance** **(** :ref:`float<class_float>` delta **)**
  188. Manually advance the animations by the specified time (in seconds).
  189. .. rst-class:: classref-item-separator
  190. ----
  191. .. _class_AnimationTree_method_get_root_motion_position:
  192. .. rst-class:: classref-method
  193. :ref:`Vector3<class_Vector3>` **get_root_motion_position** **(** **)** |const|
  194. Retrieve the motion delta of position with the :ref:`root_motion_track<class_AnimationTree_property_root_motion_track>` as a :ref:`Vector3<class_Vector3>` that can be used elsewhere.
  195. If :ref:`root_motion_track<class_AnimationTree_property_root_motion_track>` is not a path to a track of type :ref:`Animation.TYPE_POSITION_3D<class_Animation_constant_TYPE_POSITION_3D>`, returns ``Vector3(0, 0, 0)``.
  196. See also :ref:`root_motion_track<class_AnimationTree_property_root_motion_track>` and :ref:`RootMotionView<class_RootMotionView>`.
  197. The most basic example is applying position to :ref:`CharacterBody3D<class_CharacterBody3D>`:
  198. .. tabs::
  199. .. code-tab:: gdscript
  200. var current_rotation: Quaternion
  201. func _process(delta):
  202. if Input.is_action_just_pressed("animate"):
  203. current_rotation = get_quaternion()
  204. state_machine.travel("Animate")
  205. var velocity: Vector3 = current_rotation * animation_tree.get_root_motion_position() / delta
  206. set_velocity(velocity)
  207. move_and_slide()
  208. By using this in combination with :ref:`get_root_motion_position_accumulator<class_AnimationTree_method_get_root_motion_position_accumulator>`, you can apply the root motion position more correctly to account for the rotation of the node.
  209. .. tabs::
  210. .. code-tab:: gdscript
  211. func _process(delta):
  212. if Input.is_action_just_pressed("animate"):
  213. state_machine.travel("Animate")
  214. set_quaternion(get_quaternion() * animation_tree.get_root_motion_rotation())
  215. var velocity: Vector3 = (animation_tree.get_root_motion_rotation_accumulator().inverse() * get_quaternion()) * animation_tree.get_root_motion_position() / delta
  216. set_velocity(velocity)
  217. move_and_slide()
  218. .. rst-class:: classref-item-separator
  219. ----
  220. .. _class_AnimationTree_method_get_root_motion_position_accumulator:
  221. .. rst-class:: classref-method
  222. :ref:`Vector3<class_Vector3>` **get_root_motion_position_accumulator** **(** **)** |const|
  223. Retrieve the blended value of the position tracks with the :ref:`root_motion_track<class_AnimationTree_property_root_motion_track>` as a :ref:`Vector3<class_Vector3>` that can be used elsewhere.
  224. This is useful in cases where you want to respect the initial key values of the animation.
  225. For example, if an animation with only one key ``Vector3(0, 0, 0)`` is played in the previous frame and then an animation with only one key ``Vector3(1, 0, 1)`` is played in the next frame, the difference can be calculated as follows:
  226. .. tabs::
  227. .. code-tab:: gdscript
  228. var prev_root_motion_position_accumulator: Vector3
  229. func _process(delta):
  230. if Input.is_action_just_pressed("animate"):
  231. state_machine.travel("Animate")
  232. var current_root_motion_position_accumulator: Vector3 = animation_tree.get_root_motion_position_accumulator()
  233. var difference: Vector3 = current_root_motion_position_accumulator - prev_root_motion_position_accumulator
  234. prev_root_motion_position_accumulator = current_root_motion_position_accumulator
  235. transform.origin += difference
  236. However, if the animation loops, an unintended discrete change may occur, so this is only useful for some simple use cases.
  237. .. rst-class:: classref-item-separator
  238. ----
  239. .. _class_AnimationTree_method_get_root_motion_rotation:
  240. .. rst-class:: classref-method
  241. :ref:`Quaternion<class_Quaternion>` **get_root_motion_rotation** **(** **)** |const|
  242. Retrieve the motion delta of rotation with the :ref:`root_motion_track<class_AnimationTree_property_root_motion_track>` as a :ref:`Quaternion<class_Quaternion>` that can be used elsewhere.
  243. If :ref:`root_motion_track<class_AnimationTree_property_root_motion_track>` is not a path to a track of type :ref:`Animation.TYPE_ROTATION_3D<class_Animation_constant_TYPE_ROTATION_3D>`, returns ``Quaternion(0, 0, 0, 1)``.
  244. See also :ref:`root_motion_track<class_AnimationTree_property_root_motion_track>` and :ref:`RootMotionView<class_RootMotionView>`.
  245. The most basic example is applying rotation to :ref:`CharacterBody3D<class_CharacterBody3D>`:
  246. .. tabs::
  247. .. code-tab:: gdscript
  248. func _process(delta):
  249. if Input.is_action_just_pressed("animate"):
  250. state_machine.travel("Animate")
  251. set_quaternion(get_quaternion() * animation_tree.get_root_motion_rotation())
  252. .. rst-class:: classref-item-separator
  253. ----
  254. .. _class_AnimationTree_method_get_root_motion_rotation_accumulator:
  255. .. rst-class:: classref-method
  256. :ref:`Quaternion<class_Quaternion>` **get_root_motion_rotation_accumulator** **(** **)** |const|
  257. Retrieve the blended value of the rotation tracks with the :ref:`root_motion_track<class_AnimationTree_property_root_motion_track>` as a :ref:`Quaternion<class_Quaternion>` that can be used elsewhere.
  258. This is necessary to apply the root motion position correctly, taking rotation into account. See also :ref:`get_root_motion_position<class_AnimationTree_method_get_root_motion_position>`.
  259. Also, this is useful in cases where you want to respect the initial key values of the animation.
  260. For example, if an animation with only one key ``Quaternion(0, 0, 0, 1)`` is played in the previous frame and then an animation with only one key ``Quaternion(0, 0.707, 0, 0.707)`` is played in the next frame, the difference can be calculated as follows:
  261. .. tabs::
  262. .. code-tab:: gdscript
  263. var prev_root_motion_rotation_accumulator: Quaternion
  264. func _process(delta):
  265. if Input.is_action_just_pressed("animate"):
  266. state_machine.travel("Animate")
  267. var current_root_motion_rotation_accumulator: Quaternion = animation_tree.get_root_motion_Quaternion_accumulator()
  268. var difference: Quaternion = prev_root_motion_rotation_accumulator.inverse() * current_root_motion_rotation_accumulator
  269. prev_root_motion_rotation_accumulator = current_root_motion_rotation_accumulator
  270. transform.basis *= difference
  271. However, if the animation loops, an unintended discrete change may occur, so this is only useful for some simple use cases.
  272. .. rst-class:: classref-item-separator
  273. ----
  274. .. _class_AnimationTree_method_get_root_motion_scale:
  275. .. rst-class:: classref-method
  276. :ref:`Vector3<class_Vector3>` **get_root_motion_scale** **(** **)** |const|
  277. Retrieve the motion delta of scale with the :ref:`root_motion_track<class_AnimationTree_property_root_motion_track>` as a :ref:`Vector3<class_Vector3>` that can be used elsewhere.
  278. If :ref:`root_motion_track<class_AnimationTree_property_root_motion_track>` is not a path to a track of type :ref:`Animation.TYPE_SCALE_3D<class_Animation_constant_TYPE_SCALE_3D>`, returns ``Vector3(0, 0, 0)``.
  279. See also :ref:`root_motion_track<class_AnimationTree_property_root_motion_track>` and :ref:`RootMotionView<class_RootMotionView>`.
  280. The most basic example is applying scale to :ref:`CharacterBody3D<class_CharacterBody3D>`:
  281. .. tabs::
  282. .. code-tab:: gdscript
  283. var current_scale: Vector3 = Vector3(1, 1, 1)
  284. var scale_accum: Vector3 = Vector3(1, 1, 1)
  285. func _process(delta):
  286. if Input.is_action_just_pressed("animate"):
  287. current_scale = get_scale()
  288. scale_accum = Vector3(1, 1, 1)
  289. state_machine.travel("Animate")
  290. scale_accum += animation_tree.get_root_motion_scale()
  291. set_scale(current_scale * scale_accum)
  292. .. rst-class:: classref-item-separator
  293. ----
  294. .. _class_AnimationTree_method_get_root_motion_scale_accumulator:
  295. .. rst-class:: classref-method
  296. :ref:`Vector3<class_Vector3>` **get_root_motion_scale_accumulator** **(** **)** |const|
  297. Retrieve the blended value of the scale tracks with the :ref:`root_motion_track<class_AnimationTree_property_root_motion_track>` as a :ref:`Vector3<class_Vector3>` that can be used elsewhere.
  298. For example, if an animation with only one key ``Vector3(1, 1, 1)`` is played in the previous frame and then an animation with only one key ``Vector3(2, 2, 2)`` is played in the next frame, the difference can be calculated as follows:
  299. .. tabs::
  300. .. code-tab:: gdscript
  301. var prev_root_motion_scale_accumulator: Vector3
  302. func _process(delta):
  303. if Input.is_action_just_pressed("animate"):
  304. state_machine.travel("Animate")
  305. var current_root_motion_scale_accumulator: Vector3 = animation_tree.get_root_motion_scale_accumulator()
  306. var difference: Vector3 = current_root_motion_scale_accumulator - prev_root_motion_scale_accumulator
  307. prev_root_motion_scale_accumulator = current_root_motion_scale_accumulator
  308. transform.basis = transform.basis.scaled(difference)
  309. However, if the animation loops, an unintended discrete change may occur, so this is only useful for some simple use cases.
  310. .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)`
  311. .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)`
  312. .. |vararg| replace:: :abbr:`vararg (This method accepts any number of arguments after the ones described here.)`
  313. .. |constructor| replace:: :abbr:`constructor (This method is used to construct a type.)`
  314. .. |static| replace:: :abbr:`static (This method doesn't need an instance to be called, so it can be called directly using the class name.)`
  315. .. |operator| replace:: :abbr:`operator (This method describes a valid operator to use with this type as left-hand operand.)`