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.
67 lines
2.2 KiB
C#
67 lines
2.2 KiB
C#
6 months ago
|
using UnityEngine;
|
||
|
using UnityEngine.Events;
|
||
|
|
||
|
namespace Autohand.Demo{
|
||
|
public delegate void SmashEvent(Smasher smasher, Smash smashable);
|
||
|
|
||
|
[HelpURL("https://app.gitbook.com/s/5zKO0EvOjzUDeT2aiFk3/auto-hand/extras/smashing")]
|
||
|
public class Smasher : MonoBehaviour{
|
||
|
public Rigidbody rb;
|
||
|
[Header("Options")]
|
||
|
public LayerMask smashableLayers;
|
||
|
[Tooltip("How much to multiply the magnitude on smash")]
|
||
|
public float forceMulti = 1;
|
||
|
[Tooltip("Can be left empty - The center of mass point to calculate velocity magnitude - for example: the camera of the hammer is a better point vs the pivot center of the hammer object")]
|
||
|
public Transform centerOfMassPoint;
|
||
|
|
||
|
[Header("Event")]
|
||
|
public UnityEvent OnSmash;
|
||
|
|
||
|
//Progammer Events <3
|
||
|
public SmashEvent OnSmashEvent;
|
||
|
|
||
|
Vector3[] velocityOverTime = new Vector3[3];
|
||
|
Vector3 lastPos;
|
||
|
|
||
|
private void Start(){
|
||
|
if(rb == null)
|
||
|
rb = GetComponent<Rigidbody>();
|
||
|
if(smashableLayers == 0)
|
||
|
smashableLayers = LayerMask.GetMask(Hand.grabbableLayerNameDefault);
|
||
|
|
||
|
OnSmashEvent += (smasher, smashable) => { OnSmash?.Invoke(); };
|
||
|
}
|
||
|
|
||
|
|
||
|
void FixedUpdate() {
|
||
|
for(int i = 1; i < velocityOverTime.Length; i++) {
|
||
|
velocityOverTime[i] = velocityOverTime[i-1];
|
||
|
}
|
||
|
velocityOverTime[0] = lastPos - (centerOfMassPoint ? centerOfMassPoint.position : rb.position);
|
||
|
|
||
|
lastPos = centerOfMassPoint ? centerOfMassPoint.position : rb.position;
|
||
|
}
|
||
|
|
||
|
|
||
|
private void OnCollisionEnter(Collision collision) {
|
||
|
Smash smash;
|
||
|
if(collision.transform.CanGetComponent(out smash)){
|
||
|
if(GetMagnitude() >= smash.smashForce){
|
||
|
smash.DoSmash();
|
||
|
OnSmashEvent?.Invoke(this, smash);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
float GetMagnitude() {
|
||
|
Vector3 velocity = Vector3.zero;
|
||
|
for(int i = 0; i < velocityOverTime.Length; i++) {
|
||
|
velocity += velocityOverTime[i];
|
||
|
}
|
||
|
|
||
|
return (velocity.magnitude/velocityOverTime.Length)*forceMulti*10;
|
||
|
}
|
||
|
}
|
||
|
}
|