美文网首页
UNITY实现UI根据螺旋仪移动

UNITY实现UI根据螺旋仪移动

作者: 小骄傲999 | 来源:发表于2020-04-28 10:29 被阅读0次

将下方代码复制到脚本中,更改参数就可以实现目标根据手机螺旋仪进行移动,赶快拿去试试吧!!!

using System;

using UnityEngine;

[Serializable]

public class SetUpX

{

    [Tooltip("敏感度")]

    public float sensitivity = 15f;  //敏感度

    [Tooltip("最大水平移动速度")]

    public float maxturnSpeed = 35f;    // 最大移动速度

    [Tooltip("最大垂直傾斜角移动速度")]

    public float maxTilt = 35f;    // 最大倾斜角

    [Tooltip("位移加成速率")]

    public float posRate = 1.5f;

}

[Serializable]

public class SetUpY

{

    [Tooltip("敏感度")]

    public float sensitivity = 15f;  //敏感度

    [Tooltip("最大水平移动速度")]

    public float maxturnSpeed = 35f;    // 最大移动速度

    [Tooltip("最大垂直傾斜角移动速度")]

    public float maxTilt = 35f;    // 最大倾斜角

    [Tooltip("位移加成速率")]

    public float posRate = 1.5f;

}

[Serializable]

public class SetUpZ

{

    [Tooltip("敏感度")]

    public float sensitivity = 15f;  //敏感度

    [Tooltip("最大水平移动速度")]

    public float maxturnSpeed = 35f;    // 最大移动速度

    [Tooltip("最大垂直傾斜角移动速度")]

    public float maxTilt = 35f;    // 最大倾斜角

    [Tooltip("位移加成速率")]

    public float posRate = 1.5f;

}

public class MobileScreenOrientation : MonoBehaviour

{

    public enum MotionAxial

    {

        All = 1,  //全部轴

        None = 2,

        x = 3,

        y = 4,

        z = 5

    }

    public enum MotionMode

    {

        Postion = 1,  //只是位置辩护

        Rotation = 2,

        All = 3    //全部变化

    }

    //就是这里比较笨了。本来使用UnityEditor类库的多选功能。但是这个类库不支持移动平台。

    public MotionAxial motionAxial1 = MotionAxial.y;

    public MotionAxial motionAxial2 = MotionAxial.None;

    public MotionMode motionMode = MotionMode.Rotation;  //运动模式

    public SetUpX setUpX;

    public SetUpY setUpY;

    public SetUpZ setUpZ;

    public GameObject tager;    //被移动的对象

    Vector3 m_MobileOrientation;  //手机陀螺仪变化的值

    Vector3 m_tagerTransform;

    Vector3 m_tagerPos;

    public Vector3 ReversePosition = Vector3.one; //基于陀螺仪方向的取反

    void Awake()

    {

        Screen.orientation = ScreenOrientation.Landscape;

        m_tagerTransform = Vector3.zero;

        m_tagerPos = Vector3.zero;

    }

    void LateUpdate()

    {

        if (tager == null)

            return;

        m_MobileOrientation = Input.acceleration;

        if (motionAxial1 == MotionAxial.None && motionAxial2 == MotionAxial.None)  //不操作任何轴

            return;

        else if (motionAxial1 == MotionAxial.x && motionAxial2 == MotionAxial.None)  // X轴

        {

            m_tagerTransform.x = Mathf.Lerp(m_tagerTransform.x, m_MobileOrientation.y * setUpX.maxTilt * ReversePosition.x, 0.2f);

        }

        else if (motionAxial1 == MotionAxial.y && motionAxial2 == MotionAxial.None)  //Y 轴

        {

            m_tagerTransform.y = Mathf.Lerp(m_tagerTransform.y, -m_MobileOrientation.x * setUpY.maxturnSpeed * ReversePosition.y, 0.2f);

        }

        else if (motionAxial1 == MotionAxial.z && motionAxial2 == MotionAxial.None)  // z轴

        {

            m_tagerTransform.z = Mathf.Lerp(m_tagerTransform.z, -m_MobileOrientation.z * setUpZ.maxTilt * ReversePosition.z, 0.2f);

        }

        else if (motionAxial1 == MotionAxial.x && motionAxial2 == MotionAxial.y)  // X和Y轴

        {

            m_tagerTransform.y = Mathf.Lerp(m_tagerTransform.y, -m_MobileOrientation.x * setUpY.maxturnSpeed * ReversePosition.y, 0.2f);

            m_tagerTransform.x = Mathf.Lerp(m_tagerTransform.x, m_MobileOrientation.y * setUpX.maxTilt * ReversePosition.x, 0.2f);

        }

        else if (motionAxial1 == MotionAxial.y && motionAxial2 == MotionAxial.x) // Y和X轴

        {

            m_tagerTransform.y = Mathf.Lerp(m_tagerTransform.y, -m_MobileOrientation.x * setUpY.maxturnSpeed * ReversePosition.y, 0.2f);

            m_tagerTransform.x = Mathf.Lerp(m_tagerTransform.x, m_MobileOrientation.y * setUpX.maxTilt * ReversePosition.x, 0.2f);

        }

        else if (motionAxial1 == MotionAxial.x && motionAxial2 == MotionAxial.z)  // x 和 Z 轴

        {

            m_tagerTransform.x = Mathf.Lerp(m_tagerTransform.x, m_MobileOrientation.y * setUpX.maxTilt * ReversePosition.x, 0.2f);

            m_tagerTransform.z = Mathf.Lerp(m_tagerTransform.z, -m_MobileOrientation.z * setUpZ.maxTilt * ReversePosition.z, 0.2f);

        }

        else if (motionAxial1 == MotionAxial.z && motionAxial2 == MotionAxial.x)  // Z 和 X 轴

        {

            m_tagerTransform.x = Mathf.Lerp(m_tagerTransform.x, m_MobileOrientation.y * setUpX.maxTilt * ReversePosition.x, 0.2f);

            m_tagerTransform.z = Mathf.Lerp(m_tagerTransform.z, -m_MobileOrientation.z * setUpZ.maxTilt * ReversePosition.z, 0.2f);

        }

        else if (motionAxial1 == MotionAxial.y && motionAxial2 == MotionAxial.z)  // Y和Z 轴

        {

            m_tagerTransform.y = Mathf.Lerp(m_tagerTransform.y, -m_MobileOrientation.x * setUpY.maxturnSpeed * ReversePosition.y, 0.2f);

            m_tagerTransform.z = Mathf.Lerp(m_tagerTransform.z, -m_MobileOrientation.z * setUpZ.maxTilt * ReversePosition.z, 0.2f);

        }

        else if (motionAxial1 == MotionAxial.z && motionAxial2 == MotionAxial.y)  // Z和 Y轴

        {

            m_tagerTransform.y = Mathf.Lerp(m_tagerTransform.y, -m_MobileOrientation.x * setUpY.maxturnSpeed * ReversePosition.y, 0.2f);

            m_tagerTransform.z = Mathf.Lerp(m_tagerTransform.z, -m_MobileOrientation.z * setUpZ.maxTilt * ReversePosition.z, 0.2f);

        }

        else if (motionAxial1 == MotionAxial.All && motionAxial2 == MotionAxial.All)  // 所有轴向都运动

        {

            m_tagerTransform.y = Mathf.Lerp(m_tagerTransform.y, -m_MobileOrientation.x * setUpY.maxturnSpeed * ReversePosition.y, 0.2f);

            m_tagerTransform.x = Mathf.Lerp(m_tagerTransform.x, m_MobileOrientation.y * setUpX.maxTilt * ReversePosition.x, 0.2f);

            m_tagerTransform.z = Mathf.Lerp(m_tagerTransform.z, m_MobileOrientation.z * setUpZ.maxTilt * ReversePosition.z, 0.2f);

        }

        m_tagerPos.x = m_tagerTransform.y;

        m_tagerPos.y = -m_tagerTransform.x;

        m_tagerPos.z = m_tagerTransform.z;

        if (motionMode == MotionMode.Postion)

        {

            float m_x = Vector3.Lerp(tager.transform.localPosition, m_tagerPos * setUpX.posRate, Time.deltaTime * setUpX.sensitivity).x;

            float m_y = Vector3.Lerp(tager.transform.localPosition, m_tagerPos * setUpY.posRate, Time.deltaTime * setUpY.sensitivity).y;

        }

        else if (motionMode == MotionMode.Rotation)

        {

            tager.transform.localRotation = Quaternion.Lerp(tager.transform.localRotation, Quaternion.Euler(m_tagerTransform), Time.deltaTime * setUpX.sensitivity);

        }

        else

        {

            tager.transform.localPosition = Vector3.Lerp(tager.transform.localPosition, m_tagerPos * setUpX.posRate, Time.deltaTime * setUpX.sensitivity);

            tager.transform.localRotation = Quaternion.Lerp(tager.transform.localRotation, Quaternion.Euler(m_tagerTransform), Time.deltaTime * setUpX.sensitivity);

        }

    }

}

相关文章

网友评论

      本文标题:UNITY实现UI根据螺旋仪移动

      本文链接:https://www.haomeiwen.com/subject/whzmwhtx.html