abs
2026/4/14大约 3 分钟
最后同步日期:2026-04-16 | Godot 官方原文 — abs
abs
定义
abs 就像计算器上的"正负号去掉"按钮——不管你输入的是正数还是负数,它都返回一个正数。比如 -5 变成 5,3 还是 3,0 还是 0。
打个比方:你在跑步,不管是往前跑还是往后跑,"跑了多远"永远是一个正数。你跑了 -100 米(其实是在倒退跑),距离还是 100 米。
在实际游戏开发中,你经常需要知道两个东西之间的"差距有多大",而不关心谁大谁小、谁在左谁在右,这时就需要绝对值。
函数签名
C#
// Mathf.Abs 有两个重载版本,分别处理整数和浮点数
public static float Abs(float s) // 浮点数版本
public static int Abs(int s) // 整数版本GDScript
func abs(x: Variant) -> Variant # 通用版本,同时支持 int 和 float
# 另外还有两个明确指定类型的专用版本:
func absi(x: int) -> int # 整数专用
func absf(x: float) -> float # 浮点数专用参数说明
| 参数 | 类型 | 必需 | 说明 |
|---|---|---|---|
x | int 或 float | 是 | 要求绝对值的数字,可以是正数、负数或零 |
返回值
与输入类型相同(int 返回 int,float 返回 float)——返回 x 的绝对值。
| 输入 | 输出 |
|---|---|
| 正数 | 原样返回 |
| 负数 | 去掉负号返回 |
| 零 | 返回零 |
代码示例
基础用法:去掉负号
C#
int a = Mathf.Abs(-5); // 运行结果: 5
int b = Mathf.Abs(3); // 运行结果: 3
int c = Mathf.Abs(0); // 运行结果: 0
float d = Mathf.Abs(-3.7f); // 运行结果: 3.7
float e = Mathf.Abs(2.5f); // 运行结果: 2.5GDScript
var a = abs(-5) # 运行结果: 5
var b = abs(3) # 运行结果: 3
var c = abs(0) # 运行结果: 0
var d = abs(-3.7) # 运行结果: 3.7
var e = abs(2.5) # 运行结果: 2.5实际场景:计算两点之间的水平距离
C#
// 玩家在 x=100 的位置,宝箱在 x=30 的位置
// 不管谁在左谁在右,距离都是正数
float playerX = 100.0f;
float chestX = 30.0f;
float distance = Mathf.Abs(playerX - chestX);
// 运行结果: 70.0(两点相距 70 个单位)
// 反过来算也一样
float distance2 = Mathf.Abs(chestX - playerX);
// 运行结果: 70.0(结果不受顺序影响)GDScript
# 玩家在 x=100 的位置,宝箱在 x=30 的位置
# 不管谁在左谁在右,距离都是正数
var player_x = 100.0
var chest_x = 30.0
var distance = abs(player_x - chest_x)
# 运行结果: 70.0(两点相距 70 个单位)
# 反过来算也一样
var distance2 = abs(chest_x - player_x)
# 运行结果: 70.0(结果不受顺序影响)进阶用法:在角色脚本中使用
C#
using Godot;
public partial class Player : CharacterBody2D
{
[Export] public float ExMoveSpeed = 200.0f;
private float _health = 80.0f;
private float _maxHealth = 100.0f;
public override void _Process(double delta)
{
// 计算当前血量和满血的差距
float healthDeficit = Mathf.Abs(_health - _maxHealth);
// 运行结果: 20.0(还差 20 点满血)
// 判断角色是否在目标附近(距离小于 5 就算到达)
float targetX = 500.0f;
float currentX = GlobalPosition.X;
float distanceToTarget = Mathf.Abs(targetX - currentX);
if (distanceToTarget < 5.0f)
{
GD.Print("已到达目标位置!");
}
}
}GDScript
extends CharacterBody2D
@export var move_speed: float = 200.0
var _health: float = 80.0
var _max_health: float = 100.0
func _process(delta):
# 计算当前血量和满血的差距
var health_deficit = abs(_health - _max_health)
# 运行结果: 20.0(还差 20 点满血)
# 判断角色是否在目标附近(距离小于 5 就算到达)
var target_x = 500.0
var current_x = global_position.x
var distance_to_target = abs(target_x - current_x)
if distance_to_target < 5.0:
print("已到达目标位置!")注意事项
- C# 中
Mathf.Abs是重载函数:传入int返回int,传入float返回float,编译器会自动选择正确的版本。 - GDScript 中
abs()通用版本:自动识别输入类型,同时支持int和float。如果需要明确类型,可以使用absi()(整数专用)或absf()(浮点数专用)。 - 绝对值永远是非负数:无论输入什么,结果都不会是负数。
- C# 中也可以用
System.Math.Abs():功能相同,但System.Math.Abs()接受和返回double类型,而Mathf.Abs()接受和返回float类型。在 Godot 中推荐使用Mathf.Abs(),保持和引擎一致。
