ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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 플레이 영상.

Designed by Tistory.