俺に解るように説明する "Godot Engine 3.x" 入門+

ゲームエンジン Godot Engine に関すること。入門とか使い方とかチュートリアルとか、あれとかこれとか。日本語解説。

Godot キャラコン 20 「dae の import とanimation あれこれ」 6/6

本日はスクリプトの回。

f:id:ore2wakaru:20180510121931g:plain

歩き出す際のアニメションがブレンドされる。GIF にはしなかったが、もちろん反対に、止まる時もそうなる。


シーンへの変更

[1]

メインシーンにはキャラコンの18で作ったスクリプトが張り付いているので、これを剥がす。まー、シーンパネルの右上アイコンから、スクリプトを付けたり外したりしてるとよく落ちるので注意だな。

[2]

そんで、新しくスクリプトを貼る。(もちろん、メインシーンのルートノードに)


スクリプト

f:id:ore2wakaru:20180510111812p:plain

L3~5

  • 「AnimationPlayer」と「AnimationTreePlayer」を操作できるよう変数に。
  • ブレンド値を入れる変数を用意。(値は "0~1")初期値を "0.0" としたので、アニメA(アイドル)をデフォルトのアニメとする方針。

L8~9

  • デフォでは、アニメーションは1回やったら終了の設定になっている。そこで、両アニメとも「ループアニメ」とする設定をする。
  • get_animation()でアニメを指定して、変数のloopを "true" にしてやることで、アニメが「ループアニメ」になる。これをしないと、1回動いて終わっちゃう。
  • get_animation()AnimationPlayerクラス。
    f:id:ore2wakaru:20180510114036p:plain
  • loopAnimationクラス。
    f:id:ore2wakaru:20180510113729p:plain
  • get_animation()関数のリターンタイプがAnimation型であることから、Animationクラスの変数loopを発見する感じか。これに随分てこずったわい。

L12~16

  • デフォのアクションを利用して、上矢印ならブレンド値を "+0.1"、下矢印なら "-0.1" する。
  • ただ、ブレンド値は "0~1" の範囲で指定するため、引きすぎたり足しすぎたりしている場合のため、L16clamp()させている。clamp()は必須の内蔵関数な。(koko参照)

L17

  • blend2_node_set_amount()関数でブレンド値を入れる。blend2_node_set_amount( ノード名, ブレンド値 )と使う。
    f:id:ore2wakaru:20180510115710p:plain
  • blend2_node_set_amount()関数はAnimationTreePlayerクラス。AnimationPlayerクラスじゃないから注意。
    f:id:ore2wakaru:20180510120221p:plain


ゲーム再生

の前に、

f:id:ore2wakaru:20180511085137p:plain

これで、どんな感じにブレンドされるかジックリ確認できる。ループにもなってるしね。ブレンド値が低い場合は、アイドルアニメーションが優先されてほとんど歩幅が無いが、ブレンド値が高くなってくると大きく足を出すようになる。

次は、このシステムをキャラコン本体に組み込む。


こーど

extends Node

onready var node_anim_player = get_node("Scene Root/AnimationPlayer")
onready var node_anim_tree = get_node("AnimationTreePlayer")
var blend_a_b = 0.0

func _ready():
    node_anim_player.get_animation("idle01").loop = true
    node_anim_player.get_animation("walk01").loop = true

func _process(delta):
    if Input.is_action_just_pressed("ui_up"):
        blend_a_b += 0.1
    if Input.is_action_just_pressed("ui_down"):
        blend_a_b -= 0.1
    blend_a_b = clamp(blend_a_b, 0.0, 1.0)
    node_anim_tree.blend2_node_set_amount("blend2",blend_a_b)