Unity 根據手機陀螺儀,實現流動UI效果
設置Canvas
模式設置為 Screen Space - Camera
指定Camera
掛載腳本
掛載Target
using System; using UnityEngine; [Serializable] public class SetUp { [Tooltip("敏感度")] public float sensitivity = 15f; //敏感度 [Tooltip("最大水平移動速度")] public float maxturnSpeed = 30f; [Tooltip("最大垂直傾斜角移動速度")] public float maxTilt = 30f; [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 SetUp setUp; 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 * setUp.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 * setUp.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 * setUp.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 * setUp.maxturnSpeed * ReversePosition.y, 0.2f); m_tagerTransform.x = Mathf.Lerp(m_tagerTransform.x, m_MobileOrientation.y * setUp.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 * setUp.maxturnSpeed * ReversePosition.y, 0.2f); m_tagerTransform.x = Mathf.Lerp(m_tagerTransform.x, m_MobileOrientation.y * setUp.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 * setUp.maxTilt * ReversePosition.x, 0.2f); m_tagerTransform.z = Mathf.Lerp(m_tagerTransform.z, -m_MobileOrientation.z * setUp.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 * setUp.maxTilt * ReversePosition.x, 0.2f); m_tagerTransform.z = Mathf.Lerp(m_tagerTransform.z, -m_MobileOrientation.z * setUp.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 * setUp.maxturnSpeed * ReversePosition.y, 0.2f); m_tagerTransform.z = Mathf.Lerp(m_tagerTransform.z, -m_MobileOrientation.z * setUp.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 * setUp.maxturnSpeed * ReversePosition.y, 0.2f); m_tagerTransform.z = Mathf.Lerp(m_tagerTransform.z, -m_MobileOrientation.z * setUp.maxTilt * ReversePosition.z, 0.2f); } else if (motionAxial1 == MotionAxial.All && motionAxial2 == MotionAxial.All) // 所有軸向都運動 { m_tagerTransform.y = Mathf.Lerp(m_tagerTransform.y, -m_MobileOrientation.x * setUp.maxturnSpeed * ReversePosition.y, 0.2f); m_tagerTransform.x = Mathf.Lerp(m_tagerTransform.x, m_MobileOrientation.y * setUp.maxTilt * ReversePosition.x, 0.2f); m_tagerTransform.z = Mathf.Lerp(m_tagerTransform.z, m_MobileOrientation.z * setUp.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) { tager.transform.localPosition = Vector3.Lerp(tager.transform.localPosition, m_tagerPos * setUp.posRate, Time.deltaTime * setUp.sensitivity); } else if (motionMode == MotionMode.Rotation) { tager.transform.localRotation = Quaternion.Lerp(tager.transform.localRotation, Quaternion.Euler(m_tagerTransform), Time.deltaTime * setUp.sensitivity); } else { tager.transform.localPosition = Vector3.Lerp(tager.transform.localPosition, m_tagerPos * setUp.posRate, Time.deltaTime * setUp.sensitivity); tager.transform.localRotation = Quaternion.Lerp(tager.transform.localRotation, Quaternion.Euler(m_tagerTransform), Time.deltaTime * setUp.sensitivity); } } }
轉自博主 KitStar https://blog.csdn.net/KiTok/article/details/77073860 如有侵權,請告知!