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