39 lines
1.2 KiB
GDScript
39 lines
1.2 KiB
GDScript
# MsaMotion —— 读 .msa 文本里的根运动:移动动作每秒位移(cm/s,movSpd 100 时)。
|
||
#
|
||
# MotionDuration 0.600000
|
||
# Accumulation 0.00 -255.45 0.00
|
||
#
|
||
# 服务端 CHARACTER::GetMoveMotionSpeed = -Accumulation.y / MotionDuration;
|
||
# 客户端 CActorInstance::AccumulationMovement 按同一累计量推进。这里取 xy 长度。
|
||
extends RefCounted
|
||
|
||
static var _cache := {} # path -> float
|
||
|
||
static func move_speed(path: String) -> float:
|
||
if path == "" or not path.to_lower().ends_with(".msa"):
|
||
return 0.0
|
||
if _cache.has(path):
|
||
return float(_cache[path])
|
||
var speed := 0.0
|
||
var f := FileAccess.open(path, FileAccess.READ)
|
||
if f:
|
||
var duration := 0.0
|
||
var accum := Vector2.ZERO
|
||
while not f.eof_reached():
|
||
var parts := _fields(f.get_line())
|
||
if parts.size() < 2:
|
||
continue
|
||
match String(parts[0]):
|
||
"MotionDuration":
|
||
duration = String(parts[1]).to_float()
|
||
"Accumulation":
|
||
if parts.size() >= 3:
|
||
accum = Vector2(String(parts[1]).to_float(), String(parts[2]).to_float())
|
||
if duration > 0.0:
|
||
speed = accum.length() / duration
|
||
_cache[path] = speed
|
||
return speed
|
||
|
||
static func _fields(line: String) -> PackedStringArray:
|
||
return line.strip_edges().replace("\t", " ").split(" ", false)
|