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.

120 lines
4.1 KiB
C#

6 months ago
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace Autohand {
public class HeldPlaceJoint : PlacePoint {
[AutoHeader("Held Place Joint")]
public bool ignoreMe1;
public Grabbable connectedGrabbable;
public Vector3 pivotOffset;
public float heldMassScale = 1f;
[Space]
public float xMaxLimit = 0f;
public float xMinLimit = 0f;
public float xSpring = 0f;
[Space]
public float yMaxLimit = 0f;
public float yMinLimit = 0f;
public float ySpring = 0f;
[Space]
public float zMaxLimit = 0f;
public float zMinLimit = 0f;
public float zSpring = 0f;
[Space]
[Range(0, 1), Tooltip("The percentage from the min/max distance needed to trigger the event, good for creating a buffer for the event to trigger slightly before the max range to help prevent missed event")]
public float eventOffset = 0.05f;
public UnityHandGrabEvent OnMinDistanceEvent;
public UnityHandGrabEvent OnMaxDistanceEvent;
GrabbableHeldJoint heldJoint = null;
protected void Start() {
//base.Start();
//heldPlaceOnly = true;
disableRigidbodyOnPlace = false;
parentOnPlace = true;
forceHandRelease = false;
makePlacedKinematic = false;
forcePlace = true;
}
public override bool CanPlace(Grabbable placeObj, bool checkRoot = true) {
if(placeObj.body == connectedGrabbable.body)
return false;
return base.CanPlace(placeObj);
}
public override void Place(Grabbable placeObj) {
Debug.Log("Place");
Dictionary<Hand, Transform> grabPoint = new Dictionary<Hand, Transform>();
var hands = new Hand[(placeObj.GetHeldBy().Count)];
placeObj.GetHeldBy().CopyTo(hands, 0);
placeObj.transform.position = placedOffset.position;
placeObj.transform.rotation = placedOffset.rotation;
foreach(var hand in hands) {
grabPoint.Add(hand, hand.handGrabPoint);
}
base.Place(placeObj);
foreach(var hand in hands) {
//hand.BreakGrabConnection();
//hand.CreateGrabConnection(placeObj, grabPoint[hand].position, grabPoint[hand].rotation, placeObj.transform.position, placeObj.transform.rotation, true);
hand.heldJoint.connectedBody = connectedGrabbable.body;
hand.heldJoint.connectedAnchor = connectedGrabbable.body.transform.InverseTransformPoint(hand.handGrabPoint.position);
}
placeObj.DeactivateRigidbody();
placeObj.transform.parent = connectedGrabbable.body.transform;
placeObj.body = connectedGrabbable.body;
if(heldJoint == null) {
heldJoint = placeObj.gameObject.AddComponent<GrabbableHeldJoint>();
heldJoint.connectedGrabbable = connectedGrabbable;
heldJoint.xMaxLimit = xMaxLimit;
heldJoint.xMinLimit = xMinLimit;
heldJoint.xSpring = xSpring;
heldJoint.yMaxLimit = yMaxLimit;
heldJoint.yMinLimit = yMinLimit;
heldJoint.ySpring = ySpring;
heldJoint.zMaxLimit = zMaxLimit;
heldJoint.zMinLimit = zMinLimit;
heldJoint.zSpring = zSpring;
heldJoint.eventOffset = eventOffset;
heldJoint.OnMaxDistanceEvent = OnMaxDistanceEvent;
heldJoint.OnMinDistanceEvent = OnMinDistanceEvent;
heldJoint.Start();
if(hands.Length > 0)
heldJoint.OnGrabbed(hands[0], placeObj);
heldJoint.UpdateJoint();
}
}
public override void Remove(Grabbable placeObj) {
Debug.Log("Remove");
if(heldJoint != null) {
Destroy(heldJoint);
heldJoint = null;
}
base.Remove(placeObj);
}
}
}