max
2026/4/14大约 3 分钟
最后同步日期:2026-04-15 | Godot 官方原文 — max
max
定义
max() 用来比较两个数,返回更大的那个——它是 maxf()(浮点数版)和 maxi()(整数版)的"通用版",会根据你传入的参数类型自动判断该用哪个。
就像你去超市比价,两件同样的商品价格不同,你当然选更便宜的那件——max(3, 7) 就是在帮你"挑更大的那个",结果是 7。
在游戏开发中,max() 无处不在:确保角色血量不会降到负数、保证计时器不会小于零、设置最低移动速度等等。它的核心作用就是"设一条底线"——不管数值怎么变,绝对不能低于这个底线。
函数签名
C#
// 浮点数版本
public static float Max(float a, float b)
// 整数版本
public static int Max(int a, int b)GDScript
# 自动适配 int 和 float
func max(a: float, b: float) -> float参数说明
| 参数 | 类型 | 必需 | 说明 |
|---|---|---|---|
a | float 或 int | 是 | 第一个数值 |
b | float 或 int | 是 | 第二个数值 |
返回值
float 或 int —— a 和 b 中较大的那个值(类型与输入一致)。如果两个值相等,返回 a。
代码示例
C#
// ===== 基础用法:比较两个数 =====
int bigger = Mathf.Max(10, 20);
// 运行结果: bigger = 20
float taller = Mathf.Max(3.5f, 7.2f);
// 运行结果: taller = 7.2
// 两个数相等时,返回第一个
int same = Mathf.Max(5, 5);
// 运行结果: same = 5
// ===== 实际场景:确保角色血量不低于 0 =====
[Export] public int ExMaxHealth = 100;
private int _currentHealth = 85;
public void TakeDamage(int damage)
{
_currentHealth -= damage;
// 血量不能低于 0
_currentHealth = Mathf.Max(0, _currentHealth);
GD.Print($"当前血量: {_currentHealth}");
}
// 调用示例:
// TakeDamage(30) → 运行结果: 当前血量: 55
// TakeDamage(40) → 运行结果: 当前血量: 15
// TakeDamage(200) → 运行结果: 当前血量: 0
// ===== 进阶用法:逐帧更新中的速度下限 =====
[Export] public float ExMinSpeed = 2.0f;
[Export] public float ExMaxSpeed = 10.0f;
private float _currentSpeed = 5.0f;
public override void _PhysicsProcess(double delta)
{
// 根据体力消耗速度,但绝不低于最低速度
float staminaFactor = 0.3f; // 体力耗尽时只剩 30%
_currentSpeed = Mathf.Max(ExMinSpeed, _currentSpeed * staminaFactor);
// 同时限制不超过最大速度(链式调用 max + min 实现 clamp 效果)
_currentSpeed = Mathf.Min(ExMaxSpeed, _currentSpeed);
GD.Print($"实际速度: {_currentSpeed}");
}
// 运行结果: 实际速度: 2.0(被最低速度兜底)GDScript
# ===== 基础用法:比较两个数 =====
var bigger = max(10, 20)
# 运行结果: bigger = 20
var taller = max(3.5, 7.2)
# 运行结果: taller = 7.2
# 两个数相等时,返回第一个
var same = max(5, 5)
# 运行结果: same = 5
# ===== 实际场景:确保角色血量不低于 0 =====
@export var ex_max_health: int = 100
var _current_health: int = 85
func take_damage(damage: int) -> void:
_current_health -= damage
# 血量不能低于 0
_current_health = max(0, _current_health)
print("当前血量: %d" % _current_health)
# 调用示例:
# take_damage(30) → 运行结果: 当前血量: 55
# take_damage(40) → 运行结果: 当前血量: 15
# take_damage(200) → 运行结果: 当前血量: 0
# ===== 进阶用法:逐帧更新中的速度下限 =====
@export var ex_min_speed: float = 2.0
@export var ex_max_speed: float = 10.0
var _current_speed: float = 5.0
func _physics_process(delta: float) -> void:
# 根据体力消耗速度,但绝不低于最低速度
var stamina_factor = 0.3 # 体力耗尽时只剩 30%
_current_speed = max(ex_min_speed, _current_speed * stamina_factor)
# 同时限制不超过最大速度(链式调用 max + min 实现 clamp 效果)
_current_speed = min(ex_max_speed, _current_speed)
print("实际速度: %f" % _current_speed)
# 运行结果: 实际速度: 2.0(被最低速度兜底)注意事项
max()是一个通用函数,在 GDScript 中可以同时处理整数和浮点数。如果需要明确类型,请使用maxf()(浮点数)或maxi()(整数)。- C# 中
Mathf.Max()有多个重载版本(overload),编译器会根据你传入的参数类型(int还是float)自动选择对应版本。 max()只能比较两个数。如果需要在多个数中找最大值,需要嵌套调用:max(a, max(b, c))。- 如果需要同时限制最大值和最小值(即把值"夹"在一个范围内),请使用
clamp()——它等价于min(maxValue, max(minValue, value))。 max()常和min()搭配使用来实现简单的范围限制:min(上限, max(下限, 值))就是clamp(值, 下限, 上限)的手动写法。
