我目前正在开发一款游戏,其中玩家可以堆叠一堆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))
答案 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。这有助于使您的代码尽可能简单。