You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

60 lines
2.0 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace Autohand{
public class HandClippingGuard : MonoBehaviour{
//This script is designed to help prevent the hand from clipping through thin grabbables on release.
//Also recommeneded that the grabbable has 0 `ignore release time`
public Hand hand;
[Tooltip("This should be a sphere collider that covers the hand (similar, but seperate from the recommended trigger sphere collider)")]
public SphereCollider collisionGuard;
public Transform body;
public float guardTime = 0.02f;
Vector3 grabPoint;
bool runProtection = false;
Coroutine guardRoutine;
// Start is called before the first frame update
void Start(){
collisionGuard.enabled = false;
hand.OnGrabJointBreak += OnRelease;
hand.OnBeforeGrabbed += BeforeGrab;
}
void BeforeGrab(Hand hand, Grabbable grab) {
if(body == null)
body = hand.transform.parent;
if (grab.ignoreReleaseTime == 0)
runProtection = true;
else
runProtection = false;
grabPoint = hand.transform.position;
if(guardRoutine != null){
StopCoroutine(guardRoutine);
collisionGuard.enabled = false;
}
}
void OnRelease(Hand hand, Grabbable grab) {
if (runProtection) {
guardRoutine = StartCoroutine(Guard(hand));
runProtection = false;
}
}
IEnumerator Guard(Hand hand) {
hand.body.position = grabPoint;
hand.transform.position = grabPoint;
hand.transform.position = Vector3.MoveTowards(hand.transform.position, body.position, collisionGuard.radius);
collisionGuard.enabled = true;
yield return new WaitForSeconds(guardTime);
collisionGuard.enabled = false;
}
}
}