Godot4 CharacterBody2D で氷の床を滑るような挙動の実装例

無料・軽快な 2D / 3D 用のゲームエンジン Godot Engine 4 で、簡単に落下・ジャンプ・横移動などを実現できる CharacterBody2D クラスのスケルトンコード(自動的に作られるコード)の減速処理のパラメータを調整することで、氷の床などで急に止まれないキャラクターの挙動を実現する例を紹介します。

Godot4 減速の度合いを小さくすると入力がない停止する際に少しすべって止まります。

※ GodotEngine 4.3 を使用しています。.NET 版ではありません。
※紹介するスクリプトは自己責任でお使いください。

前回の記事

前回は、動く地形の上でジャンプをしたときに、地形の加速度を加えて、慣性をつけたジャンプを実装しました。

前回、改造したスクリプト

前回、左右に移動する動く地形にのっているときにジャンプしたときに、その加速度を加えた慣性のあるジャンプを実装しました。

その中に、減速の度合いのパラメータ SPEED_REDUCE を追加しました。

extends CharacterBody2D


const SPEED = 300.0 # 左右入力により設定する水平方向の加速度
const SPEED_REDUCE = 300.0	# 入力がない場合に、水平方向の加速度を減らすフレームあたりの上限値。とまりにくいキャラは SPEED より小さく設定します。
const JUMP_VELOCITY = -700. # ジャンプの加速度です。

# のっている地形の加速度。動いている地形でジャンプする場合に慣性をつけます。
var platform_velocity = Vector2(0, 0)

func _physics_process(delta):
	# 着地しているかどうかを取得(2回呼ぶのでキャッシュ変数に格納)
	var ret_is_on_floor:bool = is_on_floor()

	# Add the gravity.
	if not ret_is_on_floor:
		# 着地していない、空中にいる場合
		velocity += get_gravity() * delta # 重力により落下させます。

	# Handle jump.
	if Input.is_action_just_pressed("ui_accept") and is_on_floor():
		velocity.y = JUMP_VELOCITY
		velocity.x += platform_velocity.x # ジャンプ時に、のっている地形の水平方向の加速度を加えることで慣性のあるジャンプを表現します。

	# Get the input direction and handle the movement/deceleration.
	# As good practice, you should replace UI actions with custom gameplay actions.
	var direction = Input.get_axis("ui_left", "ui_right") # 右入力: + の値, 左右入力なし: 0, 左入力: - の値
	if direction:
		# 左右どちらかに入力された場合
		velocity.x = direction * SPEED # 入力方向に加速
	else:
		# 左右の入力がない場合
		if ret_is_on_floor:
			# 左右移動せずに着地している場合
			
			# SPEED_REDUCE 単位で毎フレーム 0 に向けて減速します。
			# 氷の床などですべりやすくしたい場合、 SPEED_REDUCE をさらに減少させてください。
			velocity.x = move_toward(velocity.x, 0, SPEED_REDUCE) 

	move_and_slide() # 現在の velocity (加速度)で移動して、衝突などの相互作用も行います。
	platform_velocity = get_platform_velocity() # のっている地形に加速度を更新します。move_and_slide() 後に有効です。

少し滑ってから止まるための減速の度合いの調整

スクリプトの 38 行目は、左右移動の入力をしていない着地している場合に移動速度を減速する処理です。

ret = move_toward(a, b, c) は、 a の値を c を上限として b に近づけた値を ret として返します。
move_toward(10, 0, 2) の場合は、 10 から 0 へ 2 を上限に近づけるので 8 が返されます。

スケルトンコードでは、現在の X 方向の加速度を、移動時に設定する加速度 SPEED の値を上限に 0 に近づけるので、左右移動の入力をしなくなると、滑ることなくすぐにキャラクターが止まります。

			# SPEED_REDUCE 単位で毎フレーム 0 に向けて減速します。
			# 氷の床などですべりやすくしたい場合、 SPEED_REDUCE をさらに減少させてください。
			velocity.x = move_toward(velocity.x, 0, SPEED_REDUCE) 

この move_toward 関数の第3引数で最初に使われてた SPEED 定数は、減速の度合いの他に移動速度の意味も持っています。
そこで、減速の度合いになる SPEED_REDUCE 定数を新しく作り、移動速度と減速の度合いのパラメータを分けることで、移動速度と減速の度合いを分けることができます。

const SPEED = 300.0
const SPEED_REDUCE = 3.0 # 300 から 3 に減速の度合いを下げました。

move_toward の第3引数に新しく追加した減速の度合いのパラメータ SPEED_REDUCE を割り当て、それを移動速度 SPEED よりも低い値にすると、少しずつ減速するため、滑ってから止まるような動きを実現できます。

Godot4 減速の度合いを小さくすると入力がない停止する際に少しすべって止まります。
Godot4 CharacterBody2D 減速の度合いを下げることで少し滑ってから止まります

まとめ

今回は、無料・軽快な 2D / 3D 用のゲームエンジン Godot Engine 4 で、簡単に落下・ジャンプ・横移動などを実現できる CharacterBody2D クラスのスケルトンコード(自動的に作られるコード)の減速処理のパラメータを調整することで、氷の床などで急に止まれないキャラクターの挙動を実現する例を紹介しました。

参照サイト Thank You!

記事一覧 → Compota-Soft-Press

コメント

Ads Blocker Image Powered by Code Help Pro

お願い - Ads Blocker Detected

このサイトは広告を掲載して運営しています。

ポップアップを閉じて閲覧できますが、よろしければ

このサイト内の広告を非表示にする拡張機能をオフにしていただけませんか?

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

We have detected that you are using extensions to block ads. Please support us by disabling these ads blocker.

タイトルとURLをコピーしました