🐡

[Godot] 物理エンジンで複雑な計算を行いたいときの注意点

2024/07/08に公開

Rigidbody3Dには物理的状態にかかわるプロパティがありますが、このプロパティを頻繁に変更すると予期しない挙動を示すことがあるため、複雑な物理シミュレーションを行うには直接物理エンジンのプロパティを変更することがおすすめです。

そのためにRigidbody3Dの_integrate_forces()を使います。

ドキュメントではRigidbody2Dのサンプルコードがあります。

integrate_forces_2d.gd
extends RigidBody2D

var thrust = Vector2(0, -250)
var torque = 20000

func _integrate_forces(state):
	if Input.is_action_pressed("ui_up"):
		state.apply_force(thrust.rotated(rotation))
	else:
		state.apply_force(Vector2())
	var rotation_direction = 0
	if Input.is_action_pressed("ui_right"):
		rotation_direction += 1
	if Input.is_action_pressed("ui_left"):
		rotation_direction -= 1
	state.apply_torque(rotation_direction * torque)

_integrate_forces()は_physics_process()内で毎回実行されます。
たとえば以下のようなコードだとconstant_forceとconstant_torpueはphysics_process()内で毎回変更されます。

integrate_forces_3d.gd
extends RigidBody3D

func _ready():
	pass
func _process(delta):
	pass

func _physics_process(delta):
	pass

func _integrate_forces(state):
	state.apply_central_force(Vector3(0, randf_range(9.4, 10.4), 0))
	state.apply_torque(Vector3(0, randf_range(-0.1, 0.1), 0))
	if Input.is_action_just_pressed("ui_accept"):
		state.apply_central_impulse(-transform.basis.z * 15.0)

Discussion