absi
2026/4/14大约 4 分钟
最后同步日期:2026-04-16 | Godot 官方原文 — absi
absi
定义
absi() 用来返回一个整数的绝对值——简单说,就是"把负号去掉"。
和 absf() 一模一样的道理,只不过 absi() 专门处理整数(没有小数点的数)。比如你欠了别人 5 块钱(-5),不管欠还是赚,钱的"张数"是 5——absi(-5) 返回 5。
为什么要有整数专用版本?因为整数和浮点数在计算机内部存储方式完全不同。整数没有小数部分,运算更快、更精确。当你处理的是纯粹的整数场景(比如棋盘格子、分数、物品数量)时,用 absi() 能避免不必要的类型转换。
在游戏开发中,整数绝对值常用于:计算格子间的距离(棋盘游戏、回合制游戏)、统计分数差、计算物品数量差异等。
函数签名
C#
public static int Abs(int x)GDScript
func absi(x: int) -> int参数说明
| 参数 | 类型 | 必需 | 说明 |
|---|---|---|---|
x | int | 是 | 要求绝对值的整数 |
返回值
int —— x 的绝对值。如果 x 是负数,去掉负号返回;如果是正数或 0,原样返回。返回值一定是非负整数。
代码示例
基础用法:整数取绝对值
C#
int a = Mathf.Abs(-7); // 运行结果: 7
int b = Mathf.Abs(3); // 运行结果: 3
int c = Mathf.Abs(0); // 运行结果: 0
int d = Mathf.Abs(-100); // 运行结果: 100GDScript
var a = absi(-7) # 运行结果: 7
var b = absi(3) # 运行结果: 3
var c = absi(0) # 运行结果: 0
var d = absi(-100) # 运行结果: 100实际场景:棋盘游戏中计算格数距离
C#
// 计算棋盘上两个棋子之间的格子距离
int pieceA = 3; // 第 3 格
int pieceB = 8; // 第 8 格
int gridDistance = Mathf.Abs(pieceA - pieceB);
// 运行结果: 5(两个棋子相距 5 格)
// 统计两队的分数差距
int scoreA = 85;
int scoreB = 92;
int gap = Mathf.Abs(scoreA - scoreB);
// 运行结果: 7(两队相差 7 分)
GD.Print($"两队相差 {gap} 分");
// 运行结果: 两队相差 7 分GDScript
# 计算棋盘上两个棋子之间的格子距离
var piece_a = 3 # 第 3 格
var piece_b = 8 # 第 8 格
var grid_distance = absi(piece_a - piece_b)
# 运行结果: 5(两个棋子相距 5 格)
# 统计两队的分数差距
var score_a = 85
var score_b = 92
var gap = absi(score_a - score_b)
# 运行结果: 7(两队相差 7 分)
print("两队相差 %d 分" % gap)
# 运行结果: 两队相差 7 分进阶用法:背包系统中计算物品数量差
C#
using Godot;
public partial class Inventory : Node
{
[Export] public int ExMaxSlots = 20;
private int _usedSlots = 12;
public void CheckInventoryDifference(int previousUsedSlots)
{
// 计算这次操作用了多少格子
int slotsChanged = Mathf.Abs(_usedSlots - previousUsedSlots);
// 运行结果: 假设 previousUsedSlots=8, slotsChanged=4
GD.Print($"格子数变化: {slotsChanged}");
// 计算剩余空间
int remaining = ExMaxSlots - _usedSlots;
// 运行结果: 8
GD.Print($"背包剩余空间: {remaining}");
}
public void CompareWithOtherInventory(int otherUsedSlots)
{
// 比较两个背包的使用差距
int difference = Mathf.Abs(_usedSlots - otherUsedSlots);
// 运行结果: 假设 otherUsedSlots=18, difference=6
if (difference < 3)
{
GD.Print("两个背包使用情况差不多");
}
else
{
GD.Print($"背包使用差距较大: {difference} 格");
// 运行结果: 背包使用差距较大: 6 格
}
}
}GDScript
extends Node
@export var max_slots: int = 20
var _used_slots: int = 12
func check_inventory_difference(previous_used_slots: int):
# 计算这次操作用了多少格子
var slots_changed = absi(_used_slots - previous_used_slots)
# 运行结果: 假设 previous_used_slots=8, slots_changed=4
print("格子数变化: %d" % slots_changed)
# 计算剩余空间
var remaining = max_slots - _used_slots
# 运行结果: 8
print("背包剩余空间: %d" % remaining)
func compare_with_other_inventory(other_used_slots: int):
# 比较两个背包的使用差距
var difference = absi(_used_slots - other_used_slots)
# 运行结果: 假设 other_used_slots=18, difference=6
if difference < 3:
print("两个背包使用情况差不多")
else:
print("背包使用差距较大: %d 格" % difference)
# 运行结果: 背包使用差距较大: 6 格注意事项
- 此函数只处理整数(int):如果需要对浮点数(小数)求绝对值,请使用
absf()。 - C# 中没有单独的
Absi函数:C# 统一使用Mathf.Abs(int)来处理整数绝对值,效果和 GDScript 的absi()完全相同。 - 整数溢出风险:对于
int类型的最小值(C# 中是-2147483648),取绝对值会溢出,因为正数最大只能表示2147483647,没有对应的正数。在实际游戏中这种情况极其罕见,但需要注意。 - 整数运算更精确:相比浮点数,整数不会出现精度丢失的问题,适合用于计数类场景。
