所以我一直在学习 godot,现在我想在游戏中实现随机生成位置,现在我只能在一侧生成,而且我至少想要 4 个。
extends Path3D
var timer = 0
var spawntime = 2
var enemy = preload("res://whitecube.tscn")
func _process(delta):
timer += delta
if (timer > spawntime)
var newenemy = enemy.instantiate()
add_child(newenemy)
timer = 0
这是我在 path3D 中每 2 秒生成一次的代码 扩展 PathFollow3D
@export var movespeed = 6
func _process(delta):
set_progress(get_progress() + movespeed * delta)
这就是他们所遵循和加速的路径
我尝试创建1个markers3d并将path/pathfollow3d场景拖到里面,然后复制并粘贴4次,但路径都是连接的,所以如果我移动path1,路径2也会移动,我不知道为什么。无论如何创建后我考虑创建一个node3d,它将用作生成位置和一个从1到4的随机数生成器,在“if(计时器>生成时间)”内,我会为每个位置执行一个if并设置spawnlocation=marker1, 2 ,3 或 4 取决于随机数。
我学习这门语言只花了大约两个月的时间。因此,如果我所说的是愚蠢的,我深表歉意并请求您的帮助。谢谢你。
在下面的代码中,
path
是对Path3D
的引用。由于您正在使用附加到 Path3D
的脚本编写,因此不需要 path
。因此,您可以写 path.curve.get_baked_length()
或简单地写 self.curve.get_baked_length()
,而不是 - 例如 - curve.get_baked_length()
。不过,为了一般性,我会继续写path
。
此外,如果您需要在多个
Path3D
之间进行选择,您可以在 Array
中引用它们,从数组中随机选择一个(例如使用 pick_random
),这将是您的 path
.
现在,任务是从
Path3D
中随机获取一个位置,对吗?
我将从获取
Path3D
的长度开始:
var path_length := path.curve.get_baked_length()
现在我们可以沿着
Path3D
选择距离,如下所示:
var path_length := path.curve.get_baked_length()
var offset := randf_range(0.0, path_length)
然后我们在该距离上采样
Path3D
:
var path_length := path.curve.get_baked_length()
var offset := randf_range(0.0, path_length)
var result_path_position := path.curve.sample_baked(offset)
假设我们要添加一个新实例作为不同节点的子节点,让我们将其转换为全局坐标:
var path_length := path.curve.get_baked_length()
var offset := randf_range(0.0, path_length)
var result_global_position := path.to_global(path.curve.sample_baked(offset))
在以下代码中,
node_parent
是对 Node3D
的引用,您将在其下添加新实例作为子实例。同样,如果您在附加的脚本上编写代码 Node3D
,则不需要编写 node_parent
。
下一个任务是在该位置实例化一个新子项,对吧?
所以让我们从全局坐标转到
node_parent
的局部坐标:
var path_length := path.curve.get_baked_length()
var offset := randf_range(0.0, path_length)
var result_global_position := path.to_global(path.curve.sample_baked(offset))
var result_position := node_parent.to_local(result_global_position)
注意:如果
node_parent
和path
是同一个节点,则根本不需要这些全局和局部转换。您可以使用我们上面的result_path_position
。
New 让我们实例化、设置位置并将实例添加为子实例:
var path_length := path.curve.get_baked_length()
var offset := randf_range(0.0, path_length)
var result_global_position := path.to_global(path.curve.sample_baked(offset))
var result_position := node_parent.to_local(result_global_position)
var instance := scene.instantiate()
instance.position = result_position
node_parent.add_child(instance)
我相信您可以根据您的需求进行调整。