GDScript向量计算原理与输入方向数值问题咨询
GDScript 2D角色移动函数疑问解答
先贴出你用到的代码:
extends CharacterBody2D @export var speed = 400 func get_input(): var input_direction = Input.get_vector("left", "right", "up", "down") velocity = input_direction * speed print(input_direction) print(velocity) func _physics_process(delta): get_input() move_and_slide()
针对你的疑问逐一解答:
疑问1:get_vector()返回类型与向量标量乘法逻辑
Input.get_vector()在2D场景下返回的是Vector2类型,这是Godot专为2D空间设计的内置向量类型,自带标量乘法重载:当你用向量和一个数值(标量)相乘时,向量的x、y两个分量会分别和这个数值相乘,所以(-1,0)*400会得到(-400,0)。- 对于3D场景的Vector3类型,标量乘法逻辑完全一致:
Vector3(0, 0, 2) * 2会让三个分量各自乘以2,最终得到Vector3(0, 0, 4)。
疑问2:斜向移动时的向量数值逻辑
- 当你同时按下左和上方向键时,原始输入组合出的向量是
(-1, 1),这个向量的长度是√[(-1)² + 1²] = √2 ≈1.4142。如果直接用这个向量乘以speed,斜向移动的速度会比单方向快约41%,导致移动速度不一致。 Input.get_vector()会自动对输入向量做归一化处理:把向量的每个分量除以它的长度,得到长度为1的单位向量。√2的倒数约为0.7071,所以归一化后的向量就是(-1/√2, 1/√2) ≈ (-0.707107, 0.707107)。- 之后乘以speed=400,每个分量的结果就是
400*0.7071≈282.8427,这样斜向移动的速度大小依然是400,和单方向移动速度保持一致,避免了速度失衡的问题。
内容的提问来源于stack exchange,提问作者user3531149
相关产品推荐
相关产品推荐

