#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, сравнивая исходное положение с текущим, чтобы сбросить положение объекта, и объект продолжает сбрасываться в цикле вместо сброса в исходное положение и остановки.