版本:v4.0.alpha1.official [31a7ddbf8]
1. 完整代码
https://github.com/CheapMiao/Godot-ThirdPersonController/tree/main/ThirdPersonControllerWithMesh
2. debug 记录
2.1 行走时发生抖动
前文:https://blog.csdn.net/PriceCheap/article/details/122642661
从 3.4 迁移到 4.0 时一开始时是这样
tscn 结构:
控制器代码:
extends CharacterBody3D
# ---对象属性---
# 移动速度
@export var moveSpeed : float = 5
# 跳跃速度
@export var jumpAcceleration : float = 200
# 下落加速度
@export var fallAcceleration : float = 9.8
# 线速度
var linearVelocity : Vector3 = Vector3.ZERO
# 鼠标灵敏度
@export var mouseSensitivity : float = 0.05
# 鼠标最大移动速度
@export var mouseMoveMaxSpeed : float = 10
# 最小俯仰角
@export var cameraMinPitch : float = -45
# 最大俯仰角
@export var cameraMaxPitch : float = 90
# 角色转身速度
@export var playerRotSpeed : float = 0.2
# 角色在斜面上滑动的加速度
@export var slipAcceleration : float = 1
# ---组件引用---
# Mesh
@onready var armature = $Armature
# 弹簧臂
@onready var springarm = $SpringArm
# 摄像机
@onready var camera = $SpringArm/Camera
# ---控制缓存---
# 是否应该旋转弹簧臂
var shouldCameraMove : bool = false
# 物体坐标系二维平面上鼠标运动方向 向上向左为负 向下向右为正
var mouseMoveSpeed = Vector2(0,0)
# y 方向上的加速度
var yAcceleration = 0
# ---控制参数---
# y 方向加速度的缩放比例
# 为了让 fallAcceleration 保持 9.8 不变,符合常识
@export var yAccelerationScale : float = 20
# ---事件---
func _ready():
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
func _unhandled_input(event) -> void:
# 如果获得”鼠标正在运动“事件
if event is InputEventMouseMotion:
# 如果得到鼠标相对于最后一帧的位移不是 0 而是 Vector2,说明鼠标相对于最后一帧移动了
if typeof(event.relative) == TYPE_VECTOR2:
# 应该旋转摄像机
shouldCameraMove = true
# 获得鼠标在一帧内的移动量
mouseMoveSpeed = event.relative
# 如果按退出键
if Input.is_action_just_released("ui_cancel"):
print("cancel")
# 在鼠标隐藏和固定之间切换
if Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED:
Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
else:
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
# ---自定义函数---
# 玩家运动
func playerMove():
# ---水平方向---
# 控制缓存 移动方向
var direction = Vector3.ZERO
# 获取摄像机地前后左右方向
# 注意 xyz 坐标系的方向
if Input.is_action_pressed("move_right"):
direction += camera.get_global_transform().basis.x
if Input.