Есть ли способ переместить игровой объект с жестким телом - PullRequest
0 голосов
/ 25 декабря 2018

Ссылка на изображение для более легкого понимания дела.

board.

Я занимаюсь 3D-игрой и хочу иметь возможность поднимать доску и вращать ее.ось Z с помощью одного пальца.Если палец скользит вверх - доска поднимается.Если палец сдвинут влево или вправо, доска наклоняется влево или вправо.

Все дело в том, чтобы доска приносила мяч, находящийся сверху, вверх, а когда доска наклоняется / поворачивается всбоку мяч начинает скользить и падать в сторону.

К доске и мячу прикреплены твердые тела.

Что я пробовал до сих пор:

  • Использование ползунка, который при изменении значения поворачивает плату с помощью Quaternion.Euler.
  • Использование интерфейса IDragHandler и изменение положения платы на EventData, полученную при регистрации касания.
  • Попробовал его с помощью кнопок, которые изменяют положение доски на некотором расстоянии по вертикали - это происходит мгновенно, и шарик падает через доску.
  • Создание изображения / джойстика интерфейса пользователя и использование данных касания / события(из IDragHandler) для перемещения преобразования доски при каждом перемещении джойстика пользовательского интерфейса.

Я перепробовал еще несколько вариантов, к сожалению, не могу записатьвсе они прямо сейчас, и ничего из того, что я уже пробовал, не работает.

1 Ответ

0 голосов
/ 25 декабря 2018

Я понял это.Я добавил игровой объект с изображением (UI) к пустому игровому объекту, чтобы он мог перемещаться от 0 по оси X и 0 по оси Y.Добавлено 3 трансформации - 1 наклонен влево, 1 наклонен вправо и 1 в середине верхней части экрана, чтобы служить ориентирами в игре, а затем отключил их, чтобы они не отображались в реальной игре.Прикрепил скрипт к моему игровому объекту Image UI и назначил необходимые преобразования в инспекторе и вуаля, он работает.

using UnityEngine;
using UnityEngine.EventSystems;

public class MoveStick : MonoBehaviour, IDragHandler, IEndDragHandler {

    public Transform leftTarget;
    public Transform rightTarget;
    public float rotateSpeed;

    [Space]

    Vector2 joyStartPosition;
    public Transform stick;
    public Transform topTarget;
    public float speed;

    bool goingUp;

    void Start()
    {
        joyStartPosition = transform.position;
        goingUp = false;
    }

    public void OnDrag(PointerEventData eventData)
    {
        transform.position = eventData.position;
        if (transform.localPosition.y > 80f || transform.localPosition.x > 50 || transform.localPosition.x < -50)
        {
            goingUp = true;

            var step = speed * Time.deltaTime;
            stick.position = Vector3.MoveTowards(stick.position, topTarget.position, step);

            Debug.Log("Going  up: " + goingUp);
        }
        else if (transform.localPosition.y < 80f)
        {
            goingUp = false;
            Debug.Log("Going  up: " + goingUp);
        }
        if (transform.localPosition.x > 80 && transform.localPosition.y > 80)
        {
            stick.rotation = Quaternion.RotateTowards(stick.rotation, rightTarget.rotation, rotateSpeed * Time.deltaTime);
        }
        else if (transform.localPosition.x < -80 && transform.localPosition.y > 80)
        {
            stick.rotation = Quaternion.RotateTowards(stick.rotation, leftTarget.rotation, rotateSpeed * Time.deltaTime);
        }
    }

    public void OnEndDrag(PointerEventData eventData)
    {
        transform.position = joyStartPosition;
        eventData.position = joyStartPosition;
        Debug.Log("Joystick is not moving");
        goingUp = false;
    }

}

Еще многое нужно сгладить и улучшить, однако в качестве базового кода он работает нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...