Как перетащить 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.

Кроме того, математика Годотса для векторов очень полезна, и я очень рекомендую вам прочитать документацию, прежде чем продолжить. Это помогает сделать ваш код максимально простым.

Другие вопросы по тегам