[Godot] v4.0.alpha1 GDScript 实现第三人称控制器

版本: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
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值