absf
2026/4/14大约 4 分钟
最后同步日期:2026-04-16 | Godot 官方原文 — absf
absf
定义
absf() 用来返回一个浮点数(小数)的绝对值——简单说,就是"把负号去掉"。
想象你正在看温度计:不管是零上 5.2 度还是零下 5.2 度,你只关心"温度差了多少度",不看是正还是负。absf(-5.2) 返回 5.2,absf(3.8) 也返回 3.8。
absf() 和 abs() 的区别在于:absf() 明确指定只处理浮点数(小数)。如果你传入一个整数,它也会被当作浮点数处理。
在游戏开发中,浮点数绝对值常用于:计算两个物体之间的精确距离差(不管谁在左边谁在右边)、判断速度偏差是否超出范围、处理物理模拟中的力的大小等。
函数签名
C#
public static float Abs(float x)GDScript
func absf(x: float) -> float参数说明
| 参数 | 类型 | 必需 | 说明 |
|---|---|---|---|
x | float | 是 | 要求绝对值的浮点数 |
返回值
float —— x 的绝对值。如果 x 是负数,去掉负号返回;如果是正数或 0,原样返回。返回值一定是非负数。
代码示例
基础用法:浮点数取绝对值
C#
float a = Mathf.Abs(-3.5f); // 运行结果: 3.5
float b = Mathf.Abs(2.0f); // 运行结果: 2.0
float c = Mathf.Abs(0.0f); // 运行结果: 0.0
float d = Mathf.Abs(-0.01f); // 运行结果: 0.01GDScript
var a = absf(-3.5) # 运行结果: 3.5
var b = absf(2.0) # 运行结果: 2.0
var c = absf(0.0) # 运行结果: 0.0
var d = absf(-0.01) # 运行结果: 0.01实际场景:判断速度偏差是否过大
C#
// 当前速度和目标速度的偏差
float currentSpeed = 65.3f;
float targetSpeed = 60.0f;
float deviation = Mathf.Abs(currentSpeed - targetSpeed);
// 运行结果: 5.3
if (deviation > 3.0f)
{
GD.Print("速度偏差过大!需要调整。");
// 运行结果: 速度偏差过大!需要调整。
}
// 如果偏差在允许范围内则不做处理
float smallDeviation = Mathf.Abs(60.5f - 60.0f);
// 运行结果: 0.5(在 3.0 的允许范围内)GDScript
# 当前速度和目标速度的偏差
var current_speed = 65.3
var target_speed = 60.0
var deviation = absf(current_speed - target_speed)
# 运行结果: 5.3
if deviation > 3.0:
print("速度偏差过大!需要调整。")
# 运行结果: 速度偏差过大!需要调整。
# 如果偏差在允许范围内则不做处理
var small_deviation = absf(60.5 - 60.0)
# 运行结果: 0.5(在 3.0 的允许范围内)进阶用法:在角色控制器中计算方向无关的距离
C#
using Godot;
public partial class Enemy : CharacterBody2D
{
[Export] public float ExPatrolRange = 200.0f;
[Export] public float ExChaseSpeed = 150.0f;
private float _startX;
private bool _chasingPlayer = false;
public override void _Ready()
{
_startX = GlobalPosition.X;
}
public override void _Process(double delta)
{
// 计算敌人离巡逻起点的距离(不关心方向)
float distanceFromStart = Mathf.Abs(GlobalPosition.X - _startX);
// 如果超过巡逻范围,转向
if (distanceFromStart > ExPatrolRange)
{
GD.Print("超过巡逻范围,返回中...");
// 运行结果: 超过巡逻范围,返回中...
}
// 计算与玩家的水平距离
float playerX = 500.0f;
float distanceToPlayer = Mathf.Abs(playerX - GlobalPosition.X);
if (distanceToPlayer < 100.0f)
{
_chasingPlayer = true;
GD.Print("发现玩家!开始追击!");
// 运行结果: 发现玩家!开始追击!
}
}
}GDScript
extends CharacterBody2D
@export var patrol_range: float = 200.0
@export var chase_speed: float = 150.0
var _start_x: float
var _chasing_player: bool = false
func _ready():
_start_x = global_position.x
func _process(delta):
# 计算敌人离巡逻起点的距离(不关心方向)
var distance_from_start = absf(global_position.x - _start_x)
# 如果超过巡逻范围,转向
if distance_from_start > patrol_range:
print("超过巡逻范围,返回中...")
# 运行结果: 超过巡逻范围,返回中...
# 计算与玩家的水平距离
var player_x = 500.0
var distance_to_player = absf(player_x - global_position.x)
if distance_to_player < 100.0:
_chasing_player = true
print("发现玩家!开始追击!")
# 运行结果: 发现玩家!开始追击!注意事项
- 此函数只处理浮点数(float):如果需要对整数求绝对值,请使用
absi()。 - C# 中没有单独的
Absf函数:C# 统一使用Mathf.Abs(float)来处理浮点数绝对值,效果和 GDScript 的absf()完全相同。 Mathf.AbsvsSystem.Math.Abs:Mathf.Abs()返回float类型(32 位),System.Math.Abs()返回double类型(64 位)。在 Godot 中推荐使用Mathf.Abs(),与引擎的 float 类型保持一致。- 绝对值永远返回非负数:无论输入是正是负,结果都不会是负数。
- NaN 和无穷大:如果传入
float.NaN,结果也是NaN;如果传入正无穷或负无穷,结果是正无穷。
