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.
66 lines
2.4 KiB
C#
66 lines
2.4 KiB
C#
6 months ago
|
using System.Collections;
|
||
|
using System.Collections.Generic;
|
||
|
using UnityEngine;
|
||
|
|
||
|
namespace Autohand {
|
||
|
[RequireComponent(typeof(Hand))]
|
||
|
public class HandCollisionHaptics : MonoBehaviour {
|
||
|
|
||
|
[Tooltip("The layers that cause the sound to play")]
|
||
|
public LayerMask collisionTriggers = ~0;
|
||
|
public float hapticAmp = 0.8f;
|
||
|
public float velocityAmp = 0.5f;
|
||
|
public float repeatDelay = 0.2f;
|
||
|
public float maxDuration = 0.5f;
|
||
|
[Tooltip("Source to play sound from")]
|
||
|
public AnimationCurve velocityAmpCurve = AnimationCurve.Linear(0, 0, 1, 1);
|
||
|
[Tooltip("Source to play sound from")]
|
||
|
public AnimationCurve velocityDurationCurve = AnimationCurve.Linear(0, 0, 1, 1);
|
||
|
|
||
|
Hand hand;
|
||
|
Rigidbody body;
|
||
|
bool canPlay = true;
|
||
|
Coroutine playRoutine;
|
||
|
|
||
|
private void Start() {
|
||
|
body = GetComponent<Rigidbody>();
|
||
|
hand = GetComponent<Hand>();
|
||
|
|
||
|
//So the sound doesn't play when falling in place on start
|
||
|
StartCoroutine(HapticPlayBuffer(1f));
|
||
|
}
|
||
|
|
||
|
private void OnDisable() {
|
||
|
if(playRoutine != null)
|
||
|
StopCoroutine(playRoutine);
|
||
|
}
|
||
|
|
||
|
void OnCollisionEnter(Collision collision) {
|
||
|
if(canPlay && collisionTriggers == (collisionTriggers | (1 << collision.gameObject.layer))) {
|
||
|
if(body != null) {
|
||
|
if(collision.collider.attachedRigidbody == null || collision.collider.attachedRigidbody.mass > 0.0000001f) {
|
||
|
var magnitude = collision.relativeVelocity.magnitude;
|
||
|
hand.PlayHapticVibration(Mathf.Clamp(velocityDurationCurve.Evaluate(magnitude), 0, maxDuration), velocityAmpCurve.Evaluate(magnitude * velocityAmp) * hapticAmp);
|
||
|
if(playRoutine != null)
|
||
|
StopCoroutine(playRoutine);
|
||
|
playRoutine = StartCoroutine(PlayBuffer());
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
IEnumerator PlayBuffer() {
|
||
|
canPlay = false;
|
||
|
yield return new WaitForSeconds(repeatDelay);
|
||
|
canPlay = true;
|
||
|
playRoutine = null;
|
||
|
}
|
||
|
|
||
|
IEnumerator HapticPlayBuffer(float time) {
|
||
|
canPlay = false;
|
||
|
yield return new WaitForSeconds(time);
|
||
|
canPlay = true;
|
||
|
playRoutine = null;
|
||
|
}
|
||
|
}
|
||
|
}
|