using UnityEngine; using Lean.Common; namespace Lean.Touch { /// This component can be added alongside the LeanTouch component to add simulated multi touch controls using the mouse and keyboard. [ExecuteInEditMode] [DisallowMultipleComponent] [RequireComponent(typeof(LeanTouch))] [HelpURL(LeanTouch.HelpUrlPrefix + "LeanTouchSimulator")] [AddComponentMenu(LeanTouch.ComponentPathPrefix + "Touch Simulator")] public class LeanTouchSimulator : MonoBehaviour { /// This allows you to set which key is required to simulate multi key twisting. public KeyCode PinchTwistKey { set { pinchTwistKey = value; } get { return pinchTwistKey; } } [SerializeField] private KeyCode pinchTwistKey = KeyCode.LeftControl; /// This allows you to set which key is required to change the pivot point of the pinch twist gesture. public KeyCode MovePivotKey { set { movePivotKey = value; } get { return movePivotKey; } } [SerializeField] private KeyCode movePivotKey = KeyCode.LeftAlt; /// This allows you to set which key is required to simulate multi key dragging. public KeyCode MultiDragKey { set { multiDragKey = value; } get { return multiDragKey; } } [SerializeField] private KeyCode multiDragKey = KeyCode.LeftAlt; /// This allows you to set which texture will be used to show the simulated fingers. public Texture2D FingerTexture { set { fingerTexture = value; } get { return fingerTexture; } } [SerializeField] private Texture2D fingerTexture; // The current pivot (0,0 = bottom left, 1,1 = top right) private Vector2 pivot = new Vector2(0.5f, 0.5f); [System.NonSerialized] private LeanTouch cachedTouch; #if UNITY_EDITOR protected virtual void Reset() { // Set the finger texture? if (FingerTexture == null) { var guids = UnityEditor.AssetDatabase.FindAssets("FingerVisualization t:texture2d"); if (guids.Length > 0) { var path = UnityEditor.AssetDatabase.GUIDToAssetPath(guids[0]); FingerTexture = UnityEditor.AssetDatabase.LoadMainAssetAtPath(path) as Texture2D; } } } #endif protected virtual void OnEnable() { cachedTouch = GetComponent(); cachedTouch.OnSimulateFingers += HandleSimulateFingers; } protected virtual void OnDisable() { cachedTouch.OnSimulateFingers -= HandleSimulateFingers; } protected virtual void OnGUI() { // Show simulated multi fingers? if (FingerTexture != null) { var count = 0; foreach (var finger in LeanTouch.Fingers) { if (finger.Index < 0 && finger.Index != LeanTouch.HOVER_FINGER_INDEX) { count += 1; } } if (count > 1) { foreach (var finger in LeanTouch.Fingers) { // Simulated fingers have a negative index if (finger.Index < 0) { var screenPosition = finger.ScreenPosition; var screenRect = new Rect(0, 0, FingerTexture.width, FingerTexture.height); screenRect.center = new Vector2(screenPosition.x, Screen.height - screenPosition.y); GUI.DrawTexture(screenRect, FingerTexture); } } } } } private void HandleSimulateFingers() { // Simulate pinch & twist? if (LeanInput.GetMouseExists() == true && LeanInput.GetKeyboardExists() == true) { var mousePosition = LeanInput.GetMousePosition(); var mouseSet = false; var mouseUp = false; for (var i = 0; i < 5; i++) { mouseSet |= LeanInput.GetMousePressed(i); mouseUp |= LeanInput.GetMouseUp(i); } if (mouseSet == true || mouseUp == true) { if (LeanInput.GetPressed(MovePivotKey) == true) { pivot.x = mousePosition.x / Screen.width; pivot.y = mousePosition.y / Screen.height; } if (LeanInput.GetPressed(PinchTwistKey) == true) { var center = new Vector2(Screen.width * pivot.x, Screen.height * pivot.y); cachedTouch.AddFinger(-2, center - (mousePosition - center), 1.0f, mouseSet); } // Simulate multi drag? else if (LeanInput.GetPressed(MultiDragKey) == true) { cachedTouch.AddFinger(-2, mousePosition, 1.0f, mouseSet); } } } } } } #if UNITY_EDITOR namespace Lean.Touch.Editor { using TARGET = LeanTouchSimulator; [UnityEditor.CanEditMultipleObjects] [UnityEditor.CustomEditor(typeof(TARGET))] public class LeanTouchSimulator_Editor : LeanEditor { static LeanTouchSimulator_Editor() { LeanTouch_Editor.OnExtendInspector += HandleExtendInspector; } protected override void OnInspector() { TARGET tgt; TARGET[] tgts; GetTargets(out tgt, out tgts); Draw("pinchTwistKey", "This allows you to set which key is required to simulate multi key twisting."); Draw("movePivotKey", "This allows you to set which key is required to change the pivot point of the pinch twist gesture."); Draw("multiDragKey", "This allows you to set which key is required to simulate multi key dragging."); Draw("fingerTexture", "This allows you to set which texture will be used to show the simulated fingers."); } private static void HandleExtendInspector(LeanTouch touch) { if (touch.GetComponent() == null) { if (GUILayout.Button("Add Simulator") == true) { UnityEditor.Undo.AddComponent(touch.gameObject); } } } } } #endif