Как я могу вращать свою плоскость в соответствии с вращением джойстика? - PullRequest
0 голосов
/ 30 апреля 2019

В настоящее время я работаю над шутером, это 2D-игра, построенная в 3d.Я хочу использовать джойстик для управления вращением самолета игрока.Я добавил свой джойстик на холст, и с помощью PointersEventData я обрабатываю вращение джойстика.вот код для него: (ControllerBG - externalCircle of Joystick, а Controller - innerCircle of Joystick)

public virtual void OnDrag(PointerEventData eventData)
{
    Vector2 pos;
    if (RectTransformUtility.ScreenPointToLocalPointInRectangle(controllerBG.rectTransform, eventData.position, eventData.pressEventCamera, out pos))
    {
        pos.x = (pos.x / controllerBG.rectTransform.sizeDelta.x);
        pos.y = (pos.y / controllerBG.rectTransform.sizeDelta.y);

        inputVector = new Vector3(pos.x * 2, 0, pos.y * 2);
        inputVector = (inputVector.magnitude > 1.0f) ? inputVector.normalized : inputVector;

        //move the joystick inner circle
        controller.rectTransform.anchoredPosition =
            new Vector3(inputVector.x * (controllerBG.rectTransform.sizeDelta.x / 2),
                        inputVector.z * (controllerBG.rectTransform.sizeDelta.y / 2));
    }
}

Теперь я хочу повернуть джойстик. Я хочу повернуть плоскость игрока, но не получаюкак это сделать, пожалуйста, помогите мне.

пока я пробовал это, но у меня не работает: 1.

Quaternion targetRotation = Quaternion.LookRotation(controller.rectTransform.anchoredPosition);
plane.transform.rotation = Quaternion.RotateTowards(
    plane.transform.rotation,
    targetRotation,
    PlaneController.instance.steeringPower * Time.deltaTime);
также создал функцию
private void Rotate(float dir)
{
    if (plane != null)
        plane.transform.Rotate(Vector3.up * PlaneController.instance.steeringPower * dir * Time.deltaTime * 0.8f);
}

Я создал этот Rotate (), но я не понимаю, как я могу использовать это при движении джойстика, т.е. если контроллер (джойстик) перемещается по часовой стрелке Rotate(1f) еще, если двигается против часовой стрелки. Поверните (-1f).

Пожалуйста, помогите мне решить мою проблему.Заранее спасибо.

1 Ответ

0 голосов
/ 30 апреля 2019

Итак, вот ваша OnDrag функция как:

public virtual void OnDrag(PointerEventData eventData)
    {
        Vector2 pos = Vector2.zero;
        if (RectTransformUtility.ScreenPointToLocalPointInRectangle
        (controllerBG.rectTransform,
        eventData.position,
        eventData.pressEventCamera,
        out pos))
        {
        pos.x = (pos.x / controllerBG.rectTransform.sizeDelta.x);
        pos.y = (pos.y / controllerBG.rectTransform.sizeDelta.y);

        float x = (controllerBG.rectTransform.pivot.x == 1) ? pos.x * 2 + 1 : pos.x * 2 - 1;
        float y = (controllerBG.rectTransform.pivot.x == 1) ? pos.y * 2 + 1 : pos.y * 2 - 1;
        inputVector = new Vector3(x, 0, y);
        inputVector = (inputVector.magnitude > 1.0f) ? inputVector.normalized : inputVector;
        controller.rectTransform.anchoredPosition =
            new Vector3(inputVector.x * (controllerBG.rectTransform.sizeDelta.x / 2),
                        inputVector.z * (controllerBG.rectTransform.sizeDelta.y / 2));
        }
    }

Я предполагаю, что вы уже реализовали OnPointerDown и OnPointerUp для обработки других событий, связанных с джойстиком. Я также предполагаю, что inputVector является публичной переменной, чтобы использовать ее снаружи, или вы можете использовать ее в том же скрипте. Это действительно зависит от вас.

public Transform rot;
    void Update()
    {    
          Vector3 direction = new Vector3();
          direction = inputVector;
          rot.Rotate(direction);
    }

Надеюсь, это поможет вам решить вашу проблему.

...