hellbound/Assets/Sources/Lean/Touch/Extras/LeanDragCamera.cs

155 lines
5.5 KiB
C#

using UnityEngine;
using Lean.Common;
using FSA = UnityEngine.Serialization.FormerlySerializedAsAttribute;
namespace Lean.Touch
{
/// <summary>This component allows you to move the current GameObject (e.g. Camera) based on finger drags and the specified ScreenDepth.</summary>
[HelpURL(LeanTouch.HelpUrlPrefix + "LeanDragCamera")]
[AddComponentMenu(LeanTouch.ComponentPathPrefix + "Drag Camera")]
public class LeanDragCamera : MonoBehaviour
{
/// <summary>The method used to find fingers to use with this component. See LeanFingerFilter documentation for more information.</summary>
public LeanFingerFilter Use = new LeanFingerFilter(true);
/// <summary>The method used to find world coordinates from a finger. See LeanScreenDepth documentation for more information.</summary>
public LeanScreenDepth ScreenDepth = new LeanScreenDepth(LeanScreenDepth.ConversionType.DepthIntercept);
/// <summary>The movement speed will be multiplied by this.
/// -1 = Inverted Controls.</summary>
public float Sensitivity { set { sensitivity = value; } get { return sensitivity; } } [FSA("Sensitivity")] [SerializeField] private float sensitivity = 1.0f;
/// <summary>If you want this component to change smoothly over time, then this allows you to control how quick the changes reach their target value.
/// -1 = Instantly change.
/// 1 = Slowly change.
/// 10 = Quickly change.</summary>
public float Damping { set { damping = value; } get { return damping; } } [FSA("Damping")] [FSA("Dampening")] [SerializeField] private float damping = -1.0f;
/// <summary>This allows you to control how much momentum is retained when the dragging fingers are all released.
/// NOTE: This requires <b>Damping</b> to be above 0.</summary>
public float Inertia { set { inertia = value; } get { return inertia; } } [FSA("Inertia")] [SerializeField] [Range(0.0f, 1.0f)] private float inertia;
[SerializeField]
private Vector3 remainingDelta;
/// <summary>This method moves the current GameObject to the center point of all selected objects.</summary>
[ContextMenu("Move To Selection")]
public virtual void MoveToSelection()
{
var center = default(Vector3);
var count = 0;
foreach (var selectable in LeanSelectable.Instances)
{
if (selectable.IsSelected == true)
{
center += selectable.transform.position;
count += 1;
}
}
if (count > 0)
{
var oldPosition = transform.localPosition;
transform.position = center / count;
remainingDelta += transform.localPosition - oldPosition;
transform.localPosition = oldPosition;
}
}
/// <summary>If you've set Use to ManuallyAddedFingers, then you can call this method to manually add a finger.</summary>
public void AddFinger(LeanFinger finger)
{
Use.AddFinger(finger);
}
/// <summary>If you've set Use to ManuallyAddedFingers, then you can call this method to manually remove a finger.</summary>
public void RemoveFinger(LeanFinger finger)
{
Use.RemoveFinger(finger);
}
/// <summary>If you've set Use to ManuallyAddedFingers, then you can call this method to manually remove all fingers.</summary>
public void RemoveAllFingers()
{
Use.RemoveAllFingers();
}
#if UNITY_EDITOR
protected virtual void Reset()
{
Use.UpdateRequiredSelectable(gameObject);
}
#endif
protected virtual void Awake()
{
Use.UpdateRequiredSelectable(gameObject);
}
protected virtual void LateUpdate()
{
// Get the fingers we want to use
var fingers = Use.UpdateAndGetFingers();
// Get the last and current screen point of all fingers
var lastScreenPoint = LeanGesture.GetLastScreenCenter(fingers);
var screenPoint = LeanGesture.GetScreenCenter(fingers);
// Get the world delta of them after conversion
var worldDelta = ScreenDepth.ConvertDelta(lastScreenPoint, screenPoint, gameObject);
// Store the current position
var oldPosition = transform.localPosition;
// Pan the camera based on the world delta
transform.position -= worldDelta * sensitivity;
// Add to remainingDelta
remainingDelta += transform.localPosition - oldPosition;
// Get t value
var factor = LeanHelper.GetDampenFactor(damping, Time.deltaTime);
// Dampen remainingDelta
var newRemainingDelta = Vector3.Lerp(remainingDelta, Vector3.zero, factor);
// Shift this position by the change in delta
transform.localPosition = oldPosition + remainingDelta - newRemainingDelta;
if (fingers.Count == 0 && inertia > 0.0f && damping > 0.0f)
{
newRemainingDelta = Vector3.Lerp(newRemainingDelta, remainingDelta, inertia);
}
// Update remainingDelta with the dampened value
remainingDelta = newRemainingDelta;
}
}
}
#if UNITY_EDITOR
namespace Lean.Touch.Editor
{
using TARGET = LeanDragCamera;
[UnityEditor.CanEditMultipleObjects]
[UnityEditor.CustomEditor(typeof(TARGET), true)]
public class LeanDragCamera_Editor : LeanEditor
{
protected override void OnInspector()
{
TARGET tgt; TARGET[] tgts; GetTargets(out tgt, out tgts);
Draw("Use");
Draw("ScreenDepth");
Draw("sensitivity", "The movement speed will be multiplied by this.\n\n-1 = Inverted Controls.");
Draw("damping", "If you want this component to change smoothly over time, then this allows you to control how quick the changes reach their target value.\n\n-1 = Instantly change.\n\n1 = Slowly change.\n\n10 = Quickly change.");
Draw("inertia", "This allows you to control how much momentum is retained when the dragging fingers are all released.\n\nNOTE: This requires <b>Damping</b> to be above 0.");
}
}
}
#endif