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.
64 lines
2.7 KiB
C#
64 lines
2.7 KiB
C#
6 months ago
|
using System.Collections;
|
||
|
using System.Collections.Generic;
|
||
|
using UnityEngine;
|
||
|
|
||
|
namespace Autohand {
|
||
|
//This component will freeze an attached grabbable joint with a fixed joint while not being held
|
||
|
[RequireComponent(typeof(Grabbable))]
|
||
|
public class GrabbableOnlyJoint : MonoBehaviour {
|
||
|
public Grabbable jointedGrabbable;
|
||
|
public bool resetOnRelease = true;
|
||
|
|
||
|
Grabbable localGrabbable;
|
||
|
|
||
|
Joint freezeJoint;
|
||
|
Vector3 localStartPosition;
|
||
|
Quaternion localStartRotation;
|
||
|
|
||
|
void Start() {
|
||
|
localGrabbable = GetComponent<Grabbable>();
|
||
|
localGrabbable.OnGrabEvent += OnGrab;
|
||
|
localGrabbable.OnReleaseEvent += OnRelease;
|
||
|
localStartPosition = jointedGrabbable.transform.InverseTransformPoint(transform.position);
|
||
|
localStartRotation = Quaternion.Inverse(jointedGrabbable.transform.rotation) * transform.rotation;
|
||
|
|
||
|
freezeJoint = localGrabbable.gameObject.AddComponent<FixedJoint>().GetCopyOf(Resources.Load<FixedJoint>("DefaultJoint"));
|
||
|
freezeJoint.anchor = Vector3.zero;
|
||
|
freezeJoint.breakForce = float.PositiveInfinity;
|
||
|
freezeJoint.breakTorque = float.PositiveInfinity;
|
||
|
freezeJoint.connectedBody = jointedGrabbable.body;
|
||
|
}
|
||
|
|
||
|
void OnGrab(Hand hand, Grabbable grab) {
|
||
|
if(grab.GetHeldBy().Count == 1) {
|
||
|
Destroy(freezeJoint);
|
||
|
freezeJoint = null;
|
||
|
}
|
||
|
}
|
||
|
void OnRelease(Hand hand, Grabbable grab) {
|
||
|
if(grab.GetHeldBy().Count == 0) {
|
||
|
transform.position = jointedGrabbable.transform.TransformPoint(localStartPosition);
|
||
|
transform.rotation = jointedGrabbable.transform.rotation * localStartRotation;
|
||
|
localGrabbable.body.position = transform.position;
|
||
|
localGrabbable.body.rotation = transform.rotation;
|
||
|
|
||
|
Invoke("CreateJoint", Time.fixedDeltaTime + Time.deltaTime);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private void LateUpdate() {
|
||
|
if(freezeJoint != null) {
|
||
|
transform.position = jointedGrabbable.transform.TransformPoint(localStartPosition);
|
||
|
transform.rotation = jointedGrabbable.transform.rotation * localStartRotation;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CreateJoint() {
|
||
|
freezeJoint = localGrabbable.gameObject.AddComponent<FixedJoint>().GetCopyOf(Resources.Load<FixedJoint>("DefaultJoint"));
|
||
|
freezeJoint.anchor = Vector3.zero;
|
||
|
freezeJoint.breakForce = float.PositiveInfinity;
|
||
|
freezeJoint.breakTorque = float.PositiveInfinity;
|
||
|
freezeJoint.connectedBody = jointedGrabbable.body;
|
||
|
}
|
||
|
}
|
||
|
}
|