戈多随机生成位置

问题描述 投票:0回答:1

所以我一直在学习 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 取决于随机数。

我学习这门语言只花了大约两个月的时间。因此,如果我所说的是愚蠢的,我深表歉意并请求您的帮助。谢谢你。

godot spawn gdscript godot4
1个回答
0
投票

在下面的代码中,

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)

我相信您可以根据您的需求进行调整。

© www.soinside.com 2019 - 2024. All rights reserved.