init
This commit is contained in:
77
scripts/mech.gd
Normal file
77
scripts/mech.gd
Normal file
@@ -0,0 +1,77 @@
|
||||
class_name Mech extends Node3D
|
||||
|
||||
@export_group("Skeleton")
|
||||
@export var _skeleton: Skeleton3D
|
||||
|
||||
@export_subgroup("Left")
|
||||
@export var _ankle_bone_l: String = "Ankle_L"
|
||||
@export var _leg_ik_l: SkeletonIK3D
|
||||
@export var _leg_foot_body_l: CharacterBody3D
|
||||
@export var _leg_ik_magnet_l: Node3D
|
||||
|
||||
@export_subgroup("Right")
|
||||
@export var _ankle_bone_r: String = "Ankle_R"
|
||||
@export var _leg_ik_r: SkeletonIK3D
|
||||
@export var _leg_foot_body_r: CharacterBody3D
|
||||
@export var _leg_ik_magnet_r: Node3D
|
||||
|
||||
@export_group("Walking")
|
||||
@export var _mouse_walk_sensitivity: float = 1
|
||||
|
||||
var _mouse_relative: Vector2
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
_leg_ik_l.start()
|
||||
_leg_ik_r.start()
|
||||
_ready_leg_ik(_leg_foot_body_l, _ankle_bone_l)
|
||||
_ready_leg_ik(_leg_foot_body_r, _ankle_bone_r)
|
||||
|
||||
|
||||
func _ready_leg_ik(foot_body: Node3D, bone: String) -> void:
|
||||
foot_body.position = (
|
||||
_skeleton.get_bone_global_rest(_skeleton.find_bone(bone)).origin
|
||||
)
|
||||
|
||||
|
||||
func _process(_delta: float) -> void:
|
||||
_process_leg_ik(_leg_ik_l, _leg_ik_magnet_l)
|
||||
_process_leg_ik(_leg_ik_r, _leg_ik_magnet_r)
|
||||
|
||||
|
||||
func _process_leg_ik(ik: SkeletonIK3D, ik_magnet: Node3D) -> void:
|
||||
ik.magnet = to_local(ik_magnet.global_position)
|
||||
|
||||
|
||||
func _physics_process(_delta: float) -> void:
|
||||
if Input.is_mouse_button_pressed(MOUSE_BUTTON_LEFT):
|
||||
_handle_leg_moving(_mouse_relative, _leg_foot_body_l)
|
||||
if Input.is_mouse_button_pressed(MOUSE_BUTTON_RIGHT):
|
||||
_handle_leg_moving(_mouse_relative, _leg_foot_body_r)
|
||||
|
||||
_mouse_relative = Vector2.ZERO
|
||||
|
||||
|
||||
func _handle_leg_moving(mouse_delta: Vector2, foot_body: CharacterBody3D) -> void:
|
||||
var velocity_local := Vector3(
|
||||
0,
|
||||
-mouse_delta.y * _mouse_walk_sensitivity,
|
||||
mouse_delta.x * _mouse_walk_sensitivity
|
||||
)
|
||||
foot_body.velocity = transform.basis * velocity_local
|
||||
foot_body.move_and_slide()
|
||||
|
||||
|
||||
func _unhandled_input(event: InputEvent) -> void:
|
||||
if event is InputEventMouseMotion:
|
||||
var event_mouse := event as InputEventMouseMotion
|
||||
_mouse_relative = event_mouse.screen_relative
|
||||
else:
|
||||
_mouse_relative = Vector2.ZERO
|
||||
|
||||
if event is InputEventMouseButton:
|
||||
var event_mouse := event as InputEventMouseButton
|
||||
if event_mouse.is_pressed():
|
||||
Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
|
||||
else:
|
||||
Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
|
||||
1
scripts/mech.gd.uid
Normal file
1
scripts/mech.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://c5n47rrsak7xb
|
||||
42
scripts/mech_skeleton_modifier.gd
Normal file
42
scripts/mech_skeleton_modifier.gd
Normal file
@@ -0,0 +1,42 @@
|
||||
class_name MechSkeletonModifier extends SkeletonModifier3D
|
||||
|
||||
@export var _pelvis_bone: String = "Pelvis"
|
||||
@export var _ankle_bone_l: String = "Ankle_L"
|
||||
@export var _leg_ik_target_l: Node3D
|
||||
@export var _ankle_bone_r: String = "Ankle_R"
|
||||
@export var _leg_ik_target_r: Node3D
|
||||
|
||||
var _skeleton: Skeleton3D
|
||||
|
||||
var _pelvis_rest_y: float
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
_skeleton = get_skeleton()
|
||||
var pelvis_rest := _skeleton.get_bone_global_rest(_skeleton.find_bone(_pelvis_bone))
|
||||
var ankle_rest_l := _skeleton.get_bone_global_rest(
|
||||
_skeleton.find_bone(_ankle_bone_l)
|
||||
)
|
||||
var ankle_rest_r := _skeleton.get_bone_global_rest(
|
||||
_skeleton.find_bone(_ankle_bone_r)
|
||||
)
|
||||
_pelvis_rest_y = (
|
||||
pelvis_rest.origin.y - (ankle_rest_l.origin.y + ankle_rest_r.origin.y) / 2
|
||||
)
|
||||
|
||||
|
||||
func _process_modification() -> void:
|
||||
if not _skeleton:
|
||||
return
|
||||
|
||||
var pelvis_bone := _skeleton.find_bone(_pelvis_bone)
|
||||
var pelvis_bone_pose := _skeleton.get_bone_global_pose(pelvis_bone)
|
||||
|
||||
var leg_target_pos_l := to_local(_leg_ik_target_l.global_position)
|
||||
var leg_target_pos_r := to_local(_leg_ik_target_r.global_position)
|
||||
|
||||
var pelvis_pos := (leg_target_pos_l + leg_target_pos_r) / 2
|
||||
pelvis_pos.y = minf(leg_target_pos_l.y, leg_target_pos_r.y) + _pelvis_rest_y
|
||||
|
||||
pelvis_bone_pose.origin = pelvis_pos
|
||||
_skeleton.set_bone_global_pose(pelvis_bone, pelvis_bone_pose)
|
||||
1
scripts/mech_skeleton_modifier.gd.uid
Normal file
1
scripts/mech_skeleton_modifier.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://dj5teb5844s8w
|
||||
Reference in New Issue
Block a user