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#
120 lines
4.1 KiB
C#
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);
|
|
|
|
}
|
|
}
|
|
}
|
|
|