Как установить положение игрового объекта в исходное положение после завершения захвата с помощью hand в SteamVR с использованием Unity?

#unity3d #virtual-reality #steamvr

#unity3d #виртуальная реальность #steamvr

Вопрос:

Довольно новичок в виртуальной реальности.Я извлек игровой объект из начальной позиции с помощью захвата.Когда я беру шлем и касаюсь своего body collider, он скрывает шлем.Итак, затем я могу выбрать очки и применить их к своему телу (скрывает игровой объект).Далее, когда я надену неправильный шлем, первый шлем должен вернуться в исходное положение и должен быть виден в сцене.Аналогично, в сцене много игровых объектов

  private void OnTriggerEnter(Collider other)
{        

    if (other.gameObject.tag == "Helmet")
    {

       
        HideGameObject();
      
       
    }

    if (other.gameObject.tag == "Glasses")
    {

        HideGameObject();           
       
    }
    if (other.gameObject.tag == "EarMuff")
    {
        HideGameObject();
       
    }
   
    

    if (other.gameObject.tag == "IncorrectHelmet")
    {

      
        HideGameObject();
       

    }

    if (other.gameObject.tag == "IncorrectGlasses")
    {
        HideGameObject();
        

    }


    if (other.gameObject.tag == "IncorrectEarMuff")
    {
        HideGameObject();
        sendPickValues.Invoke(2, 0);

    }
    


 }
  

// Другой скрипт для установки положения игровых объектов

 public class BackToPosition : MonoBehaviour
{

private Vector3 initialPosition;
private Quaternion initialRotation;

GameObject prevObject;
GameObject currObject;



// Start is called before the first frame update
void Start()
{
    initialPosition = transform.position;
    initialRotation = transform.rotation;
}

// Update is called once per frame
void Update()
{
    
}

public void BackToInitialPosition()
{
    Debug.Log("Entered");
    transform.position = initialPosition;
    transform.rotation = initialRotation;
                               
    
}
}
  

Я не пытаюсь установить предыдущий захваченный объект в исходное положение.Я могу сначала выбрать неправильный шлем и выбрать множество других подходящих игровых объектов, а затем сменить шлем на правильный.В это время первый шлем должен вернуться в исходное положение.

Ответ №1:

Это скрипт, который я использую в SteamVR для захвата и отпускания ручки руля лодки, но он должен быть удобен и для вас:

 [RequireComponent(typeof(Interactable))]
public class HandAttacher : MonoBehaviour
{
    public UnityEvent OnGrab;
    public UnityEvent OnRelease;
    public UnityEvent OnHandEnter;
    public UnityEvent OnHandLeave;

    private Interactable interactable;

    void Awake()
    {
        interactable = GetComponent<Interactable>();
    }

    /// this magic method is called by hand while hovering
    protected virtual void HandHoverUpdate(Hand hand)
    {
        GrabTypes startingGrabType = hand.GetGrabStarting();

        if (interactable.attachedToHand == null amp;amp; startingGrabType != GrabTypes.None)
        {
            hand.AttachObject(gameObject, startingGrabType, Hand.AttachmentFlags.DetachFromOtherHand | Hand.AttachmentFlags.ParentToHand);
            OnGrab?.Invoke();
        }
    }

    protected virtual void OnHandHoverBegin(Hand hand)
    {
        OnHandEnter?.Invoke();
    }

    protected virtual void OnHandHoverEnd(Hand hand)
    {
        OnHandLeave?.Invoke();
    }

    protected virtual void HandAttachedUpdate(Hand hand)
    {
        if (hand.IsGrabEnding(gameObject))
        {
            hand.DetachObject(gameObject);
            OnRelease?.Invoke();
        }
    }
}
  

В основном это создает события Unity, к которым вы можете добавлять прослушивателей в окне инспектора редактора или в коде.

Итак, в вашем случае я бы добавил слушателя в OnRelease и сбросил положение и поворот игрового объекта на то, что было раньше.

Комментарии:

1. Как получить начальное положение игровых объектов. Допустим, у меня около 30 игровых объектов, как я получу исходное положение. Нужно ли добавлять этот скрипт ко всем игровым объектам? и используйте это понятие `private Vector3 oldPosition’, упомянутое в моем скрипте, чтобы сохранить позиции и при выпуске использовать это положение для gameobject, чтобы вернуться в исходное положение.

2. Да, вы добавляете этот скрипт ко всему, что хотите, чтобы можно было прикрепить к вашей руке. А при захвате запомните положение и поворот преобразования. После выпуска восстановите его до этих значений. Если вы не хотите использовать события и прослушиватели, просто отредактируйте их из вышеупомянутого класса и восстановите вращение и положение в самом коде.

Ответ №2:

Я попытался использовать BackToPosition или что-то подобное в Update, сравнивая исходное положение с текущим, чтобы сбросить положение объекта, и объект продолжает сбрасываться в цикле вместо сброса в исходное положение и остановки.