Я пытаюсь создать свои собственные сценарии, называемые DistanceGrabber для моих рук и DistanceGrabbable для объектов, которые я хочу иметь с расстояния. что я сделал, но сценарий с лазерным указателем заставляет меня сначала отпустить кнопку захвата перед выполнением функции onDistanceGrab в сценарии DistanceGrabbable, поэтому мне пришлось быстро «дважды щелкнуть» и удерживать захват во второй раз, чтобы иметь возможность держите объект в руке, иначе он просто упадет на землю.
, а также
как отключить линию, когда лазер не направлен на захватываемый объект?
Моя настройка:
Unity 2019.2.6f1
SteamVR 2.0
Oculus Rift
Дистанционный скрипт:
public class DistanceGrabber : MonoBehaviour
{
private SteamVR_LaserPointer laserPointer;
private Hand hand;
void Awake()
{
laserPointer = GetComponent<SteamVR_LaserPointer>();
hand = GetComponent<Hand>();
laserPointer.PointerIn += PointerInside;
laserPointer.PointerOut += PointerOutside;
laserPointer.PointerClick += PointerClick;
//interactable = GetComponent<Interactable>();
}
public void PointerClick(object sender, PointerEventArgs e)
{
if (e.target.GetComponent<DistanceGrabbable>() != null)
{
e.target.GetComponent<DistanceGrabbable>().onDistanceGrab(hand);
}
}
public void PointerInside(object sender, PointerEventArgs e)
{
if (e.target.GetComponent<Interactable>() != null)
{
hand.ShowGrabHint();
hand.IsStillHovering(e.target.GetComponent<Interactable>());
laserPointer.active = true;
}
}
public void PointerOutside(object sender, PointerEventArgs e)
{
if (e.target.GetComponent<Interactable>() == null)
{
hand.HideGrabHint();
laserPointer.active = false;
}
}
Скрипт DistanceGrabbable:
public class DistanceGrabbable : MonoBehaviour
{
protected Rigidbody rb;
protected bool originalKinematicState;
protected Transform originalParent;
private void Awake()
{
rb = GetComponent<Rigidbody>();
originalParent = transform.parent;
originalKinematicState = rb.isKinematic;
}
public void onDistanceGrab(Hand hand)
{
rb.isKinematic = true;
transform.SetParent(hand.gameObject.transform);
hand.AttachObject(gameObject, GrabTypes.Trigger);
}
private void OnDetachedFromHand(Hand hand)
{
rb.isKinematic = false;
transform.SetParent(originalParent);
}
}