Как перетащить KinematicBody (3D) в движок Годо
В настоящее время я работаю над игрой, в которой игрок может сложить несколько трехмерных объектов, поэтому я хочу позволить им перетаскивать объект и размещать его.
Я много раз гуглял, как перетаскивать объекты, чтобы они следовали за курсором мыши, но, к сожалению, я не нашел способа сделать это. Если кто-нибудь знает, как это сделать, пожалуйста, дайте мне знать.
Здесь я приложил свой код. Он определяет положение мыши, но когда я щелкаю по экрану, объект движется вверх-вправо, совсем не следуя за курсором.
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 ответ
В вашем коде много проблем, и, возможно, вам стоит подумать о написании 2D-игры, чтобы сначала ознакомиться с программированием и Godot, прежде чем начинать 3D-игру, которая намного сложнее и разочаровывает.
Тем не менее, чтобы ответить на ваш вопрос. Хотите ли вы, чтобы объект следовал за мышью с небольшой задержкой, или вы хотите, чтобы объект находился прямо под курсором? Для последнего вы просто устанавливаете положение тел в положение мыши, например:
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.
Кроме того, математика Годотса для векторов очень полезна, и я очень рекомендую вам прочитать документацию, прежде чем продолжить. Это помогает сделать ваш код максимально простым.