2022-12-31 23:03:26 +01:00
|
|
|
extends RigidBody
|
|
|
|
|
|
|
|
|
|
|
|
onready var _forward = - transform.basis.z
|
|
|
|
onready var _collision_shape = $CollisionShape
|
|
|
|
onready var _material = $CollisionShape/MeshInstance.get_surface_material(0)
|
|
|
|
|
|
|
|
var _dir = 1.0
|
|
|
|
var _distance = 10.0
|
|
|
|
var _walk_spd = 100.0
|
|
|
|
var _acceleration = 22.0
|
|
|
|
var _gravity_impulse = 30.0
|
|
|
|
var _is_on_floor = false
|
|
|
|
|
|
|
|
|
|
|
|
func _process(_delta):
|
|
|
|
if _is_on_floor:
|
|
|
|
_material.albedo_color = Color.white
|
|
|
|
else:
|
|
|
|
_material.albedo_color = Color.red
|
|
|
|
|
|
|
|
|
|
|
|
func _integrate_forces(state):
|
|
|
|
var delta = state.step
|
|
|
|
var velocity = (_forward * _dir * _walk_spd * delta) + (state.linear_velocity * Vector3.UP)
|
|
|
|
state.linear_velocity = state.linear_velocity.move_toward(velocity, _acceleration * delta)
|
|
|
|
|
|
|
|
if state.transform.origin.z < -_distance:
|
|
|
|
_dir = -1
|
|
|
|
if state.transform.origin.z > _distance:
|
|
|
|
_dir = 1
|
|
|
|
|
|
|
|
ground_check()
|
|
|
|
|
|
|
|
|
|
|
|
func ground_check():
|
2023-04-06 21:52:34 +02:00
|
|
|
var space_state = get_world_3d().direct_space_state
|
2022-12-31 23:03:26 +01:00
|
|
|
var shape = PhysicsShapeQueryParameters.new()
|
|
|
|
shape.transform = _collision_shape.global_transform
|
|
|
|
shape.shape_rid = _collision_shape.shape.get_rid()
|
|
|
|
shape.collision_mask = 2
|
|
|
|
var result = space_state.get_rest_info(shape)
|
|
|
|
if result:
|
|
|
|
_is_on_floor = true
|
|
|
|
else:
|
|
|
|
_is_on_floor = false
|