简体   繁体   English

CrossplatformInput 操纵杆在 Unity 中不起作用

[英]CrossplatformInput Joystick is not working in Unity

在此处输入图片说明 I have connected a joystick from the standard assets library from the unity store, but the input is not being read.我已经从统一商店的标准资产库中连接了一个操纵杆,但没有读取输入。 The car can be controlled by the arrow keys,but the joystick is not working.可以通过方向键控制汽车,但操纵杆不起作用。

here is my code这是我的代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityStandardAssets.CrossPlatformInput;

public class rearwheeldrive : MonoBehaviour
{
    public float maxAngle = 30;
    public float maxTorque = 300;
    public WheelCollider[] wheelArray;

    // Start is called before the first frame update
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {
        float angle = maxAngle * CrossPlatformInputManager.GetAxis("Horizontal");
        float torque = maxTorque * CrossPlatformInputManager.GetAxis("Vertical");
        wheelArray[0].steerAngle = angle;
        wheelArray[1].steerAngle = angle;

        wheelArray[2].motorTorque = torque;
        wheelArray[3].motorTorque = torque;

        foreach (WheelCollider wheelcollider in wheelArray)
        {
            Vector3 P;
            Quaternion Q;
            wheelcollider.GetWorldPose(out P, out Q);
            Transform wheelshape = wheelcollider.transform.GetChild(0);
            wheelshape.position = P;
            wheelshape.rotation = Q;

        }

    }
}

Even after changing maxAngle * Input.GetAxis("Horizontal");即使改变 maxAngle * Input.GetAxis("Horizo​​ntal"); to maxAngle * CrossPlatformInputManager.GetAxis("Horizontal");到 maxAngle * CrossPlatformInputManager.GetAxis("Horizo​​ntal"); it takes the arrow key input whilst the joystick is not working.当操纵杆不工作时,它需要箭头键输入。

Code Of Joystick object操纵杆对象代码

using System;
using UnityEngine;
using UnityEngine.EventSystems;

namespace UnityStandardAssets.CrossPlatformInput
{
    public class Joystick : MonoBehaviour, IPointerDownHandler, IPointerUpHandler, IDragHandler
    {
        public enum AxisOption
        {
            // Options for which axes to use
            Both, // Use both
            OnlyHorizontal, // Only horizontal
            OnlyVertical // Only vertical
        }

        public int MovementRange = 100;
        public AxisOption axesToUse = AxisOption.Both; // The options for the axes that the still will use
        public string horizontalAxisName = "Horizontal"; // The name given to the horizontal axis for the cross platform input
        public string verticalAxisName = "Vertical"; // The name given to the vertical axis for the cross platform input

        Vector3 m_StartPos;
        bool m_UseX; // Toggle for using the x axis
        bool m_UseY; // Toggle for using the Y axis
        CrossPlatformInputManager.VirtualAxis m_HorizontalVirtualAxis; // Reference to the joystick in the cross platform input
        CrossPlatformInputManager.VirtualAxis m_VerticalVirtualAxis; // Reference to the joystick in the cross platform input

        void OnEnable()
        {
            CreateVirtualAxes();
        }

        void Start()
        {
            m_StartPos = transform.position;
        }

        void UpdateVirtualAxes(Vector3 value)
        {
            var delta = m_StartPos - value;
            delta.y = -delta.y;
            delta /= MovementRange;
            if (m_UseX)
            {
                m_HorizontalVirtualAxis.Update(-delta.x);
            }

            if (m_UseY)
            {
                m_VerticalVirtualAxis.Update(delta.y);
            }
        }

        void CreateVirtualAxes()
        {
            // set axes to use
            m_UseX = (axesToUse == AxisOption.Both || axesToUse == AxisOption.OnlyHorizontal);
            m_UseY = (axesToUse == AxisOption.Both || axesToUse == AxisOption.OnlyVertical);

            // create new axes based on axes to use
            if (m_UseX)
            {
                m_HorizontalVirtualAxis = new CrossPlatformInputManager.VirtualAxis(horizontalAxisName);
                CrossPlatformInputManager.RegisterVirtualAxis(m_HorizontalVirtualAxis);
            }
            if (m_UseY)
            {
                m_VerticalVirtualAxis = new CrossPlatformInputManager.VirtualAxis(verticalAxisName);
                CrossPlatformInputManager.RegisterVirtualAxis(m_VerticalVirtualAxis);
            }
        }


        public void OnDrag(PointerEventData data)
        {
            Vector3 newPos = Vector3.zero;

            if (m_UseX)
            {
                int delta = (int)(data.position.x - m_StartPos.x);
                delta = Mathf.Clamp(delta, - MovementRange, MovementRange);
                newPos.x = delta;
            }

            if (m_UseY)
            {
                int delta = (int)(data.position.y - m_StartPos.y);
                delta = Mathf.Clamp(delta, -MovementRange, MovementRange);
                newPos.y = delta;
            }
            transform.position = new Vector3(m_StartPos.x + newPos.x, m_StartPos.y + newPos.y, m_StartPos.z + newPos.z);
            UpdateVirtualAxes(transform.position);
        }


        public void OnPointerUp(PointerEventData data)
        {
            transform.position = m_StartPos;
            UpdateVirtualAxes(m_StartPos);
        }


        public void OnPointerDown(PointerEventData data) { }

        void OnDisable()
        {
            // remove the joysticks from the cross platform input
            if (m_UseX)
            {
                m_HorizontalVirtualAxis.Remove();
            }
            if (m_UseY)
            {
                m_VerticalVirtualAxis.Remove();
            }
        }
    }
}

Use it Like :使用它喜欢:

  public Joystick mJoystick; 

  float angle = maxAngle * mJoystick.Horizontal;
  float torque = maxTorque * mJoystick.Vertical;

EDIT : I have used the same asset, works fine using the below settings.编辑:我使用了相同的资产,使用以下设置可以正常工作。

在此处输入图片说明 在此处输入图片说明

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 
using UnityStandardAssets.CrossPlatformInput;



public class TestScript : MonoBehaviour 
{

    // Use this for initialization  
   void Start () 
   {

   }        

    // Update is called once per frame  
   void Update ()
   {

        float angle =  CrossPlatformInputManager.GetAxis("Horizontal");
        float torque =  CrossPlatformInputManager.GetAxis("Vertical");


        print("Angle : " + angle + "  ,  Torque : " + torque);

    } 

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM