58 lines
1.5 KiB
C#
58 lines
1.5 KiB
C#
|
using System.Collections;
|
|||
|
using System.Collections.Generic;
|
|||
|
using UnityEngine;
|
|||
|
|
|||
|
namespace BNG {
|
|||
|
public class JointBreaker : MonoBehaviour {
|
|||
|
|
|||
|
public float BreakDistance = 0.25f;
|
|||
|
|
|||
|
public float JointDistance;
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Should we destroy the attached joint if BreakDistance is reached? Set to false if you only wish to execture an event
|
|||
|
/// </summary>
|
|||
|
public bool DestroyJointOnBreak = true;
|
|||
|
|
|||
|
public GrabberEvent OnBreakEvent;
|
|||
|
|
|||
|
Joint theJoint;
|
|||
|
|
|||
|
Vector3 startPos;
|
|||
|
|
|||
|
bool brokeJoint = false;
|
|||
|
|
|||
|
// Start is called before the first frame update
|
|||
|
void Start() {
|
|||
|
startPos = transform.localPosition;
|
|||
|
theJoint = GetComponent<Joint>();
|
|||
|
}
|
|||
|
|
|||
|
// Update is called once per frame
|
|||
|
void Update() {
|
|||
|
JointDistance = Vector3.Distance(transform.localPosition, startPos);
|
|||
|
|
|||
|
if(!brokeJoint && JointDistance > BreakDistance) {
|
|||
|
BreakJoint();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public void BreakJoint() {
|
|||
|
|
|||
|
if(DestroyJointOnBreak && theJoint) {
|
|||
|
Destroy(theJoint);
|
|||
|
}
|
|||
|
|
|||
|
if (OnBreakEvent != null) {
|
|||
|
|
|||
|
var heldGrabbable = GetComponent<Grabbable>();
|
|||
|
if(heldGrabbable && heldGrabbable.GetPrimaryGrabber() ) {
|
|||
|
brokeJoint = true;
|
|||
|
OnBreakEvent.Invoke(heldGrabbable.GetPrimaryGrabber());
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|