如何在Godot Engine中拖动KinematicBody(3D)

时间:2018-06-21 03:30:16

标签: 3d mouse drag godot gdscript

我目前正在开发一款游戏,其中玩家可以堆叠一堆3D对象,因此我希望允许他们拖动一个对象并将其放置在上面。

我已经在Google上搜索了很多次如何拖动/使对象跟随鼠标光标,但是不幸的是我还没有找到实现它的方法。如果有人知道该怎么做,请告诉我。

在此附上我的代码。它检测到鼠标的位置,但是当我单击屏幕时,对象沿右方向移动,根本不跟随光标。

extends KinematicBody

var velocity = Vector3()

const SPEED = 300 

func _physics_process(delta):
    if(Input.is_action_pressed("mouse_down")):

        var mouse  = get_viewport().get_mouse_position()

        print(mouse)

        var velocity = Vector3(mouse.x-get_translation().x,mouse.y-get_translation().y,0)

        velocity = velocity.normalized()*SPEED*delta

        velocity = move_and_slide(velocity, Vector3(0,1,0))

1 个答案:

答案 0 :(得分:1)

您的代码存在多个问题,也许您应该在开始3D游戏之前先编写2D游戏以熟悉编程和godot,这会变得更加复杂和令人沮丧。

但是,回答您的问题。您是希望对象跟随鼠标稍微延迟还是要使对象直接位于光标下方。对于后者,您只需将主体位置设置为鼠标位置,例如:

var mouse_pos  = get_viewport().get_mouse_position()
self.position = mouse_pos # The self is just for better understanding

如果要稍稍延迟拖动对象,则必须计算鼠标和对象之间的距离。 这是一个可能的解决方案:

func _physics_process(delta):
    if Input.is_action_pressed("mouse_down"):
        var mouse_pos  = get_viewport().get_mouse_position()
        var direction = mouse_pos - position
        move_and_slide(direction)

就像我说的那样,由于很难获得正确的x,y和z位置,因此3d环境会使一切变得更加困难。

此外,向量的Godots数学非常有用,我真的建议您在继续之前先阅读documentation。这有助于使您的代码尽可能简单。