-
Unity Oculus 컨트롤러로 OVRGrabbable 오브젝트 발사하기개발/Unity 2020. 2. 6. 14:15
using UnityEngine; public class ThrowGrabbed : MonoBehaviour { [SerializeField] private Vector3 angularVelocity = new Vector3(0, 5, 0); private OVRInput.Button throwButton; private OVRGrabbable ovrGrabbable; private Rigidbody rb; void Awake() { ovrGrabbable = GetComponent<OVRGrabbable>(); if (!ovrGrabbable) Debug.LogError("No ovrgrabbable at " + gameObject.name); rb = GetComponent<Rigidbody>(); if (!rb) Debug.LogError("No rigidbody at " + gameObject.name); throwButton = OVRInput.Button.PrimaryIndexTrigger; } void FixedUpdate() { if (ovrGrabbable.isGrabbed && OVRInput.GetDown(throwButton, ovrGrabbable.grabbedBy.Controller)) ThrowForward(); } private void ThrowForward() { Quaternion throwDirection = ovrGrabbable.grabbedBy.throwLine.rotation; float throwForce = 3 + (float)GameManager.Instance.game.Str * 2 / (this.rb.mass + 1); ovrGrabbable.grabbedBy.ForceRelease(ovrGrabbable); ovrGrabbable.GrabEnd(throwDirection * Vector3.forward * throwForce, angularVelocity); } }
DistanceGrabbable 클래스가 상속받는 OVRGrabber.cs 스크립트에 현재 컨트롤러가 가리키고 있는 방향을 저장하는 Transform grabbedby를 추가했다.
컨트롤러가 가리키는 방향을 쉽게 가져오고, 오브젝트가 발사될 방향을 쉽게 알 수 있게 하기 위해 GrabLine 오브젝트에 Line Renderer 컴포넌트를 추가했다 우선 필요한 컴포넌트를 가지고 있는 지 확인하고, 던지는 동작을 수행할 버튼을 지정한다.
그리고 현재 오브젝트가 집어진 상태이고 지정된 버튼 입력이 들어왔을 때 ThrowForward() 함수를 실행한다. 이 함수에서는 플레이어의 힘과 오브젝트의 Rigidbody.mass를 사용해 throwForce를 계산하고, OVRGrabbable의 Grabend()를 사용해 계산된 벡터의 방향과 크기만큼 오브젝트를 날려 보낸다.
OVRGrabble.cs의 GrabEnd 함수. 오브젝트의 Rigidbody 속성을 잡기 전으로 복구한 뒤 속도와 회전을 설정한다. OVRGrabbable, Rigidbody 컴포넌트를 가진 오브젝트에 이 ThrowGrabbed 스크립트를 추가하면 퀘스트 컨트롤러의 인덱스 트리거 버튼으로 물체를 발사할 수 있다.
Inspector에서 오브젝트의 회전 각속도를 설정할 수 있다 무료 애셋들을 사용해 구현한 데모 Scene 플레이 영상.
'개발 > Unity' 카테고리의 다른 글
Unity Oculus VR 물건 던지는 속도(세기) 조절하기 (0) 2020.02.13 Unity Oculus 카메라(시점) 움직이기 (0) 2020.02.13 Unity Oculus Quest 최적화 (0) 2020.02.05 Unity 충돌 감지 시 효과음 재생 (0) 2020.01.31 Unity 라이트 프로브와 실시간 조명 (0) 2020.01.31