如何按照操纵杆旋转来旋转飞机?

时间:2019-04-30 06:16:44

标签: c# unity3d canvas rotation joystick

目前,我正在开发一款射击游戏,它是一款3d内置的2d游戏。我想使用操纵杆控制播放机的平面旋转。我将操纵杆添加到画布上,并使用PointersEventData处理操纵杆旋转。 这是它的代码:(ControllerBG是操纵杆的externalCircle,而Controller是操纵杆的innerCircle)

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);
  1. 也创建了一个函数
private void Rotate(float dir)
{
    if (plane != null)
        plane.transform.Rotate(Vector3.up * PlaneController.instance.steeringPower * dir * Time.deltaTime * 0.8f);
}

我已经创建了此Rotate(),但是我不知道如何在操纵杆运动上使用它,即如果控制器(操纵杆)沿顺时针方向旋转Rotate(1f),否则如果逆时针旋转Rotate(-1f)。

请帮助我解决问题。预先谢谢你。

1 个答案:

答案 0 :(得分:0)

因此,您的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));
        }
    }

我假设您已经实现了OnPointerDownOnPointerUp来处理与操纵杆相关的其他事件。我还假设inputVector是一个公共变量,可以在外部使用它,也可以在同一脚本中使用它。真的取决于你。

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

我希望它可以帮助您解决问题。