randf_range
2026/4/14大约 3 分钟
最后同步日期:2026-04-15 | Godot 官方原文 — randf_range
randf_range
定义
randf_range() 用于生成一个指定范围内的随机浮点数(小数)。你告诉它最小值和最大值,它就在这个范围内随机挑一个小数给你。
它和 randf() 的关系就像:randf() 只能在 0 到 1 之间挑数,而 randf_range() 可以在任意范围内挑数。比如你可以让它生成一个 5.0 到 10.0 之间的随机小数。
函数签名
C#
// C# 中使用 GD.RandRange
float value = GD.RandRange(float from, float to);GDScript
func randf_range(from: float, to: float) -> float参数说明
| 参数 | 类型 | 必需 | 说明 |
|---|---|---|---|
from | float | 是 | 范围的下限(最小值) |
to | float | 是 | 范围的上限(最大值) |
from 和 to 的大小关系不限——from 大于 to 也可以正常工作。
返回值
float —— 一个在 from 和 to 之间的随机浮点数。范围是闭区间,即返回值可以是 from 或 to 本身。
代码示例
基础用法:生成指定范围的随机小数
C#
using Godot;
public partial class RandfRangeExample : Node
{
public override void _Ready()
{
// 生成 5.0 到 10.0 之间的随机小数
float value1 = (float)GD.RandRange(5.0, 10.0);
GD.Print($"5~10 之间: {value1}");
// 运行结果: 5~10 之间: 7.382
// 生成 -1.0 到 1.0 之间的随机小数
float value2 = (float)GD.RandRange(-1.0, 1.0);
GD.Print($"-1~1 之间: {value2}");
// 运行结果: -1~1 之间: 0.541
}
}GDScript
extends Node
func _ready():
# 生成 5.0 到 10.0 之间的随机小数
var value1 = randf_range(5.0, 10.0)
print("5~10 之间: ", value1)
# 运行结果: 5~10 之间: 7.382
# 生成 -1.0 到 1.0 之间的随机小数
var value2 = randf_range(-1.0, 1.0)
print("-1~1 之间: ", value2)
# 运行结果: -1~1 之间: 0.541实际场景:随机敌人出现位置
C#
using Godot;
public partial class EnemySpawner : Node2D
{
[Export] public float ExSpawnXMin = -500f;
[Export] public float ExSpawnXMax = 500f;
[Export] public float ExSpawnY = -100f;
public override void _Ready()
{
// 在随机位置生成 5 个敌人
for (int i = 0; i < 5; i++)
{
float x = (float)GD.RandRange(ExSpawnXMin, ExSpawnXMax);
float y = ExSpawnY + (float)GD.RandRange(-20f, 20f);
GD.Print($"敌人 {i + 1} 位置: ({x:F1}, {y:F1})");
}
}
}GDScript
extends Node2D
@export var ex_spawn_x_min: float = -500.0
@export var ex_spawn_x_max: float = 500.0
@export var ex_spawn_y: float = -100.0
func _ready():
# 在随机位置生成 5 个敌人
for i in range(5):
var x = randf_range(ex_spawn_x_min, ex_spawn_x_max)
var y = ex_spawn_y + randf_range(-20.0, 20.0)
print("敌人 %d 位置: (%.1f, %.1f)" % [i + 1, x, y])进阶用法:随机抖动和噪声效果
C#
using Godot;
public partial class CameraShake : Camera2D
{
[Export] public float ExShakeStrength = 5.0f;
[Export] public float ExShakeDecay = 5.0f;
private float _currentStrength;
public override void _Ready()
{
_currentStrength = 0f;
}
public void Shake(float intensity = 1.0f)
{
_currentStrength = ExShakeStrength * intensity;
}
public override void _Process(double delta)
{
if (_currentStrength > 0.01f)
{
// 用 randf_range 生成随机偏移
float offsetX = (float)GD.RandRange(-_currentStrength, _currentStrength);
float offsetY = (float)GD.RandRange(-_currentStrength, _currentStrength);
Offset = new Vector2(offsetX, offsetY);
_currentStrength = Mathf.Lerp(_currentStrength, 0f, (float)delta * ExShakeDecay);
}
else
{
Offset = Vector2.Zero;
}
}
}GDScript
extends Camera2D
@export var ex_shake_strength: float = 5.0
@export var ex_shake_decay: float = 5.0
var _current_strength: float = 0.0
func shake(intensity: float = 1.0) -> void:
_current_strength = ex_shake_strength * intensity
func _process(delta: float) -> void:
if _current_strength > 0.01:
# 用 randf_range 生成随机偏移
var offset_x = randf_range(-_current_strength, _current_strength)
var offset_y = randf_range(-_current_strength, _current_strength)
offset = Vector2(offset_x, offset_y)
_current_strength = lerpf(_current_strength, 0.0, delta * ex_shake_decay)
else:
offset = Vector2.ZERO注意事项
与
randf()的关系:randf_range(from, to)等价于from + randf() * (to - from)。randf_range()只是帮你省去了手动计算的步骤。from可以大于to:randf_range(10.0, 5.0)和randf_range(5.0, 10.0)的效果完全一样,不需要确保from < to。C# 中的类型注意:C# 的
GD.RandRange对浮点数和整数都有重载。如果传入浮点数参数,返回浮点数;如果传入整数参数,返回整数。注意显式指定参数类型以获得正确的行为。
