【AGMaker 深入】プラグイン公開 - GameObject を運動速度の方向へ回転させる

ライセンス条項

このプラグインは、Action Game Maker 内で、無料または商用のプロジェクトを問わず、あらゆる目的で自由に使用または改変することができます。
ただし、再配布は行わないでください。クレジット表示は必須ではありませんが、歓迎されます。

プラグインの効果

このプラグインの名前は ArkAgmRotateToVelocity です。
各フレームでゲームオブジェクトを回転させ、その局所的な物理的な「右側」が常に実際の速度の方向を向くようにします。

要点

  • GameObject の指定が必要です
  • 最小有効速度の二乗値を指定できます(二乗値を使用することでパフォーマンスが向上します)。実際の速度がこの値より大きい場合のみ、スクリプトの機能が有効になります
  • 瞬間回転と滑らかな回転の 2 つのモードを使用できます
  • 滑らかな回転モードでは、回転の速さを表す値を設定できます
  • 当初のアイデアは、常に右側を向くアニメーション方向を持つ弾丸オブジェクトがあり、このスクリプトと組み合わせることで、実際の運動方向に応じて 360° 回転させることでした。

核心

操作手順

  1. GameObject ノードを選択します
  2. Ctrl+A を押し、タイプが Node のノードを追加し、名前を ArkAgmRotateToVelocity に変更します
  3. ArkAgmRotateToVelocity を選択し、空の GDscript を追加します
  4. 以下のスクリプト全体をコピーし、スクリプトに貼り付けて保存します
  5. ArkAgmRotateToVelocity ノードを選択すると、インスペクター上のパラメータを必要に応じて調整し、滑らかな回転などの機能を有効にするかどうかを決定できます

スクリプト

class_name ArkAgmRotateToVelocity extends Node

enum RotationMode {
	INSTANT,     # 即時回転
	SMOOTH,      # 滑らかな回転
}

@export var game_object: GameObject
@export var rotation_mode: RotationMode = RotationMode.INSTANT  # 回転モード
@export var rotation_speed: float = 5.0    # 回転速度(SMOOTH モードを使用する場合)
@export var min_velocity_squared: float = 0.1  # 回転開始の最小速度二乗値

func _ready() -> void:
	if not game_object:
		# 親ノードを game_object として取得しようとする
		var parent = get_parent()
		if parent and parent is GameObject:
			game_object = parent
		else:
			printerr("[ArkAgmRotateToVelocity] game_object が設定されておらず、親が GameObject ではありません")

func _physics_process(delta: float) -> void:
	if not game_object:
		return
	
	var velocity: Vector2 = game_object.get_real_velocity()
	
	# 速度が小さすぎる場合は回転しない
	if velocity.length_squared() < min_velocity_squared:
		return
		
	# 目標角度(速度の方向の角度)を計算
	var target_angle = velocity.angle()
	
	match rotation_mode:
		RotationMode.INSTANT:
			# 目標角度に即時回転
			game_object.rotation = target_angle
		RotationMode.SMOOTH:
			# 目標角度に滑らかに回転
			var current_angle = game_object.rotation
			var angle_diff = wrapf(target_angle - current_angle, -PI, PI)
			game_object.rotation = current_angle + angle_diff * min(1.0, rotation_speed * delta)
「いいね!」 1