You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
77 lines
2.4 KiB
77 lines
2.4 KiB
extends CharacterBody3D
|
|
|
|
|
|
|
|
const SPEED = 3.5
|
|
const RUN_MULT = 2.0
|
|
const JUMP_VELOCITY = 4.5
|
|
const LIN_ACCEL = 0.25
|
|
const ANG_ACCEL = 0.25
|
|
const INNERTIA = 0.4
|
|
|
|
var animp : AnimationPlayer
|
|
var anim_tree : AnimationTree
|
|
|
|
# Get the gravity from the project settings to be synced with RigidBody nodes.
|
|
var gravity = ProjectSettings.get_setting("physics/3d/default_gravity")
|
|
var speed = SPEED
|
|
func _ready():
|
|
anim_tree = $Abe_Lo/AnimationTree
|
|
animp = $Abe_Lo/AnimationPlayer
|
|
animp.play("ANIM_Abe_Idle_01")
|
|
animp.speed_scale = 1.5
|
|
|
|
func map( value : float , in_min : float, in_max : float, out_min : float, out_max : float ):
|
|
#=( ( value - in_min ) / ( in_max - in_min ) * ( out_max-out_min ) + out_min)
|
|
var mapped_value = ( value - in_min ) / ( in_max - in_min ) * ( out_max-out_min ) + out_min
|
|
return mapped_value
|
|
|
|
func update_tree():
|
|
anim_tree["parameters/Walk/blend_amount"] = animp.speed_scale / 1.5
|
|
anim_tree["parameters/Run/blend_amount"] = map ( speed , SPEED , SPEED * RUN_MULT , 0 , 1 )
|
|
|
|
|
|
func _physics_process(delta):
|
|
# Add the gravity.
|
|
if not is_on_floor():
|
|
velocity.y -= gravity * delta
|
|
|
|
# Handle jump.
|
|
if Input.is_action_just_pressed("jump") and is_on_floor():
|
|
velocity.y = JUMP_VELOCITY
|
|
|
|
# Get the input direction and handle the movement/deceleration.
|
|
# As good practice, you should replace UI actions with custom gameplay actions.
|
|
var input_dir = Input.get_vector("left", "right", "up", "down")
|
|
var run = Input.is_action_pressed("run")
|
|
|
|
if run:
|
|
speed = move_toward( speed , SPEED * RUN_MULT , LIN_ACCEL )
|
|
else:
|
|
speed = move_toward( speed , SPEED , LIN_ACCEL )
|
|
|
|
# Caculate directions from input
|
|
var direction = (transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized()
|
|
var direction2d = Vector2(-direction.x,direction.z)
|
|
|
|
#moving
|
|
if direction and (is_on_floor() or (not is_on_floor() and is_on_wall()) ):
|
|
animp.speed_scale = 1.5
|
|
velocity.x = direction.x * speed
|
|
velocity.z = direction.z * speed
|
|
#if speed > SPEED:
|
|
#$GPUParticles3D.amount_ratio = speed / ( SPEED * RUN_MULT )
|
|
|
|
var new_rotation = Vector3( 0.0, direction2d.angle() - (PI/2) , 0.0 )
|
|
|
|
$Abe_Lo.rotation = Vector3( 0.0 , rotate_toward( $Abe_Lo.rotation.y , new_rotation.y , ANG_ACCEL ), 0.0)
|
|
else:
|
|
if is_on_floor():
|
|
velocity.x = move_toward(velocity.x, 0, INNERTIA )
|
|
velocity.z = move_toward(velocity.z, 0, INNERTIA )
|
|
animp.speed_scale = move_toward( animp.speed_scale, 0 , .05 )
|
|
|
|
$GPUParticles3D.amount_ratio = 0.0
|
|
update_tree()
|
|
move_and_slide()
|