调整角色移速
This commit is contained in:
@@ -39,7 +39,7 @@ transform = Transform3D(10.406274, 0, 0, 0, 10.406274, 0, 0, 0, 10.406274, 0, -0
|
||||
|
||||
[node name="InteractionRay" type="RayCast3D" parent="CameraRig/Camera" unique_id=388601766]
|
||||
transform = Transform3D(1, 0, 0, 0, -4.371139e-08, 1, 0, -1, -4.371139e-08, 0, 0, 0)
|
||||
target_position = Vector3(0, 0.2, 0)
|
||||
target_position = Vector3(0, 0.25, 0)
|
||||
|
||||
[node name="InteractionPos" type="Marker3D" parent="CameraRig/Camera" unique_id=816323614]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -0.2425185)
|
||||
|
||||
@@ -145,8 +145,9 @@ func _resolve_state(
|
||||
velocity: Vector3, on_floor: bool, sprinting: bool, crouching: bool
|
||||
) -> int:
|
||||
if not on_floor:
|
||||
# 上升用 jump、越过顶点用 fall。jump 片段长 0.5s,比「jump_velocity / 重力」
|
||||
# 的上升时间略长,所以上升段不会播完 —— 越过顶点立刻切 fall,观感上是连贯的。
|
||||
# 上升用 jump、越过顶点用 fall。jump 片段长 0.5s,而上升时间是
|
||||
# jump_velocity / 有效重力(1.5 / 4.9 ≈ 0.31s),片段只播得完约六成 ——
|
||||
# 越过顶点立刻切 fall,观感上是连贯的。
|
||||
return AnimState.JUMP if velocity.y > 0.0 else AnimState.FALL
|
||||
var moving := Vector2(velocity.x, velocity.z).length() >= idle_threshold
|
||||
if crouching:
|
||||
|
||||
@@ -13,7 +13,7 @@ const JUMP_BUFFER_TIME: float = 0.1
|
||||
## 本角色身高 0.15 m,系数 k = 0.15 / 1.75 ≈ 0.0857,下面所有线性量都是原值 × k。
|
||||
## 这样「每秒走过几个自身体长」和人类一致,动作比例看起来才对。
|
||||
##
|
||||
## 换尺寸时的公式:线性量(速度/加速度)× k',跳跃初速度 × √k'(因为跳跃高度 = v²/2g)。
|
||||
## 换尺寸时的公式:线性量(速度/加速度)× k';跳跃那两个数(gravity_scale 与 jump_velocity)用下面的反解公式重算。
|
||||
##
|
||||
## 常规移动速度(米/秒)—— 约 2.9 身长/秒,和人类走路同一比例
|
||||
@export var walk_speed: float = 0.4286
|
||||
@@ -26,9 +26,28 @@ const JUMP_BUFFER_TIME: float = 0.1
|
||||
@export var acceleration: float = 3.8571
|
||||
## 空中加速度(米/秒²)
|
||||
@export var air_acceleration: float = 1.0286
|
||||
## 起跳初速度(米/秒)—— 跳跃高度 ≈ 0.109 m,约 0.73 身高
|
||||
## 注意是 ×√k 而不是 ×k:跳跃高度 = v² / 2g,想让高度也等比缩,速度就得开方。
|
||||
@export var jump_velocity: float = 1.4639
|
||||
## 起跳初速度(米/秒)—— 配下面的 gravity_scale 0.5(g = 4.9)时,
|
||||
## 跳跃高度 ≈ 0.230 m(约 1.53 身高)、滞空 ≈ 0.61 s。
|
||||
## 这两个数是**配对**的:改重力必须按「反解公式」重算它,否则跳跃高度按 1/g 暴涨。
|
||||
@export var jump_velocity: float = 1.5
|
||||
|
||||
@export_group("重力")
|
||||
## 重力缩放系数。0.5 = 重力减半(有效 g = 4.9 m/s²)。
|
||||
##
|
||||
## 为什么不用 1.0(物理真实的 9.8):重力加速度本身和物体大小无关,但我们的速度是按身材
|
||||
## 等比缩过的,于是落体相对过快。更关键的是跳跃 —— 由 h = v²/2g 和 T = 2v/g 可得
|
||||
## h = g·T²/8:**固定重力下滞空翻倍、高度要涨 4 倍**。所以「想跳得久又不想跳太高」
|
||||
## 只能降重力。取 0.5 时:跳高 0.230 m(1.53 身高)、滞空 0.61 s;
|
||||
## 若维持 1.0,同样 0.23 m 的高度只有 0.43 s 滞空,落地明显仓促。
|
||||
##
|
||||
## ⚠ 改这个值必须同步改 jump_velocity(跳跃高度 = v²/2g)。
|
||||
## 反解公式 —— 定目标高度 h(米)与滞空 T(秒):
|
||||
## g = 8h / T² → gravity_scale = g / 9.8
|
||||
## jump_velocity = 4h / T
|
||||
##
|
||||
## 只影响本角色。**不要**去改 ProjectSettings 的 physics/3d/default_gravity ——
|
||||
## 那是全局的,会连带把拖拽/投掷的刚体一起变飘。
|
||||
@export_range(0.0, 2.0, 0.01) var gravity_scale: float = 0.5
|
||||
|
||||
## 本帧是否在疾跑 / 是否按住蹲键。
|
||||
## Player 读这两个值转交给 PlayerAnimator 切片段,crouching 还用来压低摄像机。
|
||||
@@ -37,6 +56,7 @@ var crouching: bool = false
|
||||
|
||||
var _body: CharacterBody3D
|
||||
var _look_rig: Node3D
|
||||
## 项目设置里的默认重力(9.8)。实际用的是它 × gravity_scale。
|
||||
var _gravity: float = 9.8
|
||||
var _jump_buffer: float = 0.0
|
||||
|
||||
@@ -64,7 +84,8 @@ func step(delta: float) -> void:
|
||||
if _body.velocity.y < 0.0:
|
||||
_body.velocity.y = 0.0
|
||||
else:
|
||||
_body.velocity.y -= _gravity * delta
|
||||
# gravity_scale 每帧现读,方便运行中拖着试手感(1.0 = 物理真实的 9.8)
|
||||
_body.velocity.y -= _gravity * gravity_scale * delta
|
||||
|
||||
# --- 跳跃(读取输入缓冲)---
|
||||
if _jump_buffer > 0.0:
|
||||
|
||||
Reference in New Issue
Block a user