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#
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;
|
|
}
|
|
}
|
|
}
|