Unity Udexreal开发插件包
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

281 lines
6.9 KiB

using System;
using UnityEngine;
using UnityEngine.Serialization;
namespace UDE_HAND_INTERACTION
{
public class FingerPressInteractable : DetectorInteractable<FingerPressInteractor, FingerPressInteractable>
{
public InteractableSurface _surfacePatch;
public ISurfacePatch SurfacePatch { get; private set; }
[FormerlySerializedAs("_maxDistance")]
public float _enterHoverNormal;
public float _exitHoverNormal;
public float _enterHoverTangent;
public float _exitHoverTangent;
[FormerlySerializedAs("_releaseDistance")]
public float _cancelSelectNormal;
public float _cancelSelectTangent;
public class MinThresholdsConfig
{
public bool Enabled;
public float MinNormal = 0.01f;
}
private MinThresholdsConfig _minThresholds = new MinThresholdsConfig()
{
Enabled = false,
MinNormal = 0.01f
};
public class DragThresholdsConfig
{
public bool Enabled;
public float DragNormal;
public float DragTangent;
public ProgressCurve DragEaseCurve;
}
private DragThresholdsConfig _dragThresholds = new DragThresholdsConfig()
{
Enabled = true,
DragNormal = 0.01f,
DragTangent = 0.01f,
DragEaseCurve = new ProgressCurve(AnimationCurve.EaseInOut(0, 0, 1, 1), 0.05f)
};
public class PositionPinningConfig
{
public bool Enabled;
public float MaxPinDistance;
public AnimationCurve PinningEaseCurve;
public ProgressCurve ResyncCurve;
}
private PositionPinningConfig _positionPinning = new PositionPinningConfig()
{
Enabled = false,
MaxPinDistance = 0.075f,
PinningEaseCurve = AnimationCurve.EaseInOut(0.2f, 0, 1, 1),
ResyncCurve = new ProgressCurve(AnimationCurve.EaseInOut(0, 0, 1, 1), 0.2f)
};
public class RecoilAssistConfig
{
public bool Enabled;
public bool UseDynamicDecay;
public AnimationCurve DynamicDecayCurve;
public bool UseVelocityExpansion;
public float VelocityExpansionMinSpeed;
public float VelocityExpansionMaxSpeed;
public float VelocityExpansionDistance;
public float VelocityExpansionDecayRate;
public float ExitDistance;
public float ReEnterDistance;
}
private RecoilAssistConfig _recoilAssist = new RecoilAssistConfig()
{
Enabled = false,
UseDynamicDecay = false,
DynamicDecayCurve = new AnimationCurve(
new Keyframe(0f, 50f), new Keyframe(0.9f, 0.5f, -47, -47)),
UseVelocityExpansion = false,
VelocityExpansionMinSpeed = 0.4f,
VelocityExpansionMaxSpeed = 1.4f,
VelocityExpansionDistance = 0.055f,
VelocityExpansionDecayRate = 0.125f,
ExitDistance = 0.02f,
ReEnterDistance = 0.02f
};
private float _closeDistanceThreshold = 0.001f;
private int _tiebreakerScore = 0;
public float EnterHoverNormal
{
get
{
return _enterHoverNormal;
}
set
{
_enterHoverNormal = value;
}
}
public float EnterHoverTangent
{
get
{
return _enterHoverTangent;
}
set
{
_enterHoverTangent = value;
}
}
public float ExitHoverNormal
{
get
{
return _exitHoverNormal;
}
set
{
_exitHoverNormal = value;
}
}
public float ExitHoverTangent
{
get
{
return _exitHoverTangent;
}
set
{
_exitHoverTangent = value;
}
}
public float CancelSelectNormal
{
get
{
return _cancelSelectNormal;
}
set
{
_cancelSelectNormal = value;
}
}
public float CancelSelectTangent
{
get
{
return _cancelSelectTangent;
}
set
{
_cancelSelectTangent = value;
}
}
public float CloseDistanceThreshold
{
get
{
return _closeDistanceThreshold;
}
set
{
_closeDistanceThreshold = value;
}
}
public MinThresholdsConfig MinThresholds
{
get
{
return _minThresholds;
}
set
{
_minThresholds = value;
}
}
public DragThresholdsConfig DragThresholds
{
get
{
return _dragThresholds;
}
set
{
_dragThresholds = value;
}
}
public PositionPinningConfig PositionPinning
{
get
{
return _positionPinning;
}
set
{
_positionPinning = value;
}
}
public RecoilAssistConfig RecoilAssist
{
get
{
return _recoilAssist;
}
set
{
_recoilAssist = value;
}
}
protected override void Awake()
{
base.Awake();
_surfacePatch = transform.GetComponentInChildren<InteractableSurface>();
SurfacePatch = _surfacePatch.GetComponent<ISurfacePatch>();
}
protected override void Start()
{
this.BeginStart(ref _started, () => base.Start());
this.AssertField(SurfacePatch, nameof(SurfacePatch));
_exitHoverNormal = Mathf.Max(_enterHoverNormal, _exitHoverNormal);
_exitHoverTangent = Mathf.Max(_enterHoverTangent, _exitHoverTangent);
if (_cancelSelectTangent > 0)
{
_cancelSelectTangent = Mathf.Max(_exitHoverTangent, _cancelSelectTangent);
}
if (_minThresholds.Enabled && _minThresholds.MinNormal > 0f)
{
_minThresholds.MinNormal = Mathf.Min(_minThresholds.MinNormal, _enterHoverNormal);
}
this.EndStart(ref _started);
}
public bool ClosestBackingSurfaceHit(Vector3 point, out SurfaceHit hit)
{
return SurfacePatch.BackingSurface.ClosestSurfacePoint(point, out hit);
}
}
}