123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
- using System;
- using UnityEngine;
- #if UNITY_EDITOR
- using UnityEditor;
- #endif
- namespace UnityStandardAssets.CrossPlatformInput
- {
- // helps with managing tilt input on mobile devices
- public class TiltInput : MonoBehaviour
- {
- // options for the various orientations
- public enum AxisOptions
- {
- ForwardAxis,
- SidewaysAxis,
- }
- [Serializable]
- public class AxisMapping
- {
- public enum MappingType
- {
- NamedAxis,
- MousePositionX,
- MousePositionY,
- MousePositionZ
- };
- public MappingType type;
- public string axisName;
- }
- public AxisMapping mapping;
- public AxisOptions tiltAroundAxis = AxisOptions.ForwardAxis;
- public float fullTiltAngle = 25;
- public float centreAngleOffset = 0;
- private CrossPlatformInputManager.VirtualAxis m_SteerAxis;
- private void OnEnable()
- {
- if (mapping.type == AxisMapping.MappingType.NamedAxis)
- {
- m_SteerAxis = new CrossPlatformInputManager.VirtualAxis(mapping.axisName);
- CrossPlatformInputManager.RegisterVirtualAxis(m_SteerAxis);
- }
- }
- private void Update()
- {
- float angle = 0;
- if (Input.acceleration != Vector3.zero)
- {
- switch (tiltAroundAxis)
- {
- case AxisOptions.ForwardAxis:
- angle = Mathf.Atan2(Input.acceleration.x, -Input.acceleration.y)*Mathf.Rad2Deg +
- centreAngleOffset;
- break;
- case AxisOptions.SidewaysAxis:
- angle = Mathf.Atan2(Input.acceleration.z, -Input.acceleration.y)*Mathf.Rad2Deg +
- centreAngleOffset;
- break;
- }
- }
- float axisValue = Mathf.InverseLerp(-fullTiltAngle, fullTiltAngle, angle)*2 - 1;
- switch (mapping.type)
- {
- case AxisMapping.MappingType.NamedAxis:
- m_SteerAxis.Update(axisValue);
- break;
- case AxisMapping.MappingType.MousePositionX:
- CrossPlatformInputManager.SetVirtualMousePositionX(axisValue*Screen.width);
- break;
- case AxisMapping.MappingType.MousePositionY:
- CrossPlatformInputManager.SetVirtualMousePositionY(axisValue*Screen.width);
- break;
- case AxisMapping.MappingType.MousePositionZ:
- CrossPlatformInputManager.SetVirtualMousePositionZ(axisValue*Screen.width);
- break;
- }
- }
- private void OnDisable()
- {
- m_SteerAxis.Remove();
- }
- }
- }
- namespace UnityStandardAssets.CrossPlatformInput.Inspector
- {
- #if UNITY_EDITOR
- [CustomPropertyDrawer(typeof (TiltInput.AxisMapping))]
- public class TiltInputAxisStylePropertyDrawer : PropertyDrawer
- {
- public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
- {
- EditorGUI.BeginProperty(position, label, property);
- float x = position.x;
- float y = position.y;
- float inspectorWidth = position.width;
- // Don't make child fields be indented
- var indent = EditorGUI.indentLevel;
- EditorGUI.indentLevel = 0;
- var props = new[] {"type", "axisName"};
- var widths = new[] {.4f, .6f};
- if (property.FindPropertyRelative("type").enumValueIndex > 0)
- {
- // hide name if not a named axis
- props = new[] {"type"};
- widths = new[] {1f};
- }
- const float lineHeight = 18;
- for (int n = 0; n < props.Length; ++n)
- {
- float w = widths[n]*inspectorWidth;
- // Calculate rects
- Rect rect = new Rect(x, y, w, lineHeight);
- x += w;
- EditorGUI.PropertyField(rect, property.FindPropertyRelative(props[n]), GUIContent.none);
- }
- // Set indent back to what it was
- EditorGUI.indentLevel = indent;
- EditorGUI.EndProperty();
- }
- }
- #endif
- }
|