Unity

[Unity] VR Hand Physics - Object collision

Guk-blog 2020. 3. 12. 15:50
728x90
반응형

VR에선 컨트롤러 위치가 실제 컨트롤러의 움직임에 따라 출력됩니다.

따라서 모델을 컨트롤러 앵커 하위에 두게 되면 무슨 짓을해도 투과를 하더군요

그래서 꼼수를 부려봤습니다.

 

응용하셔서 재밌는 게임을 만들어주세요 여러분!

 

씬 구성은 이렇습니다.

 

물체 추돌 판정 스크립트(컨트롤러 앵커 하위의 CustomHandRight에 붙였습니다)

using UnityEngine; 
using Node = UnityEngine.XR.XRNode; 

public class HandPositionController : MonoBehaviour 
{ 
    [HideInInspector] 
    public Rigidbody handRig; 
    public Node hand = Node.RightHand; 
    public bool isStop; 
    bool staySomething; 
    int inCount; 

    private void Start() 
    { 
        handRig = GetComponent(); 
        if (hand == Node.RightHand) HandStatus.instance.rightHand = this; 
        else HandStatus.instance.leftHand = this; 
    } 


    private void OnTriggerEnter(Collider other) 
    { 
        if (other.CompareTag("StaticPos")) 
        { 
            inCount++; 
            isStop = true; 
        } 
    } 

    private void OnTriggerExit(Collider other) 
    { 
        if (other.CompareTag("StaticPos")) 
        { 
            inCount--; 
            if(inCount==0) isStop = false; 
        } 
    } 
} 

public class HandStatus 
{ 
    private static HandStatus _instance; 
    public static HandStatus instance 
    { 
        get 
        { 
            if (_instance == null) _instance = new HandStatus(); 
            return _instance; 
        } 
        set 
        { 
            _instance = value; 
        } 
    } 

    public HandPositionController leftHand; 
    public HandPositionController rightHand; 
}

손과 CompareTag를 할 수 있도록

원하는 태그를 만드셔서

부딪힐 오브젝트에 할당해주세요

 

이제 손 모델입니다

using UnityEngine;

public class TestCube : MonoBehaviour
{
    public Transform handTrans;
    Transform trans;
    Vector3 recentPos;
    Quaternion recentRot;
    // Start is called before the first frame update
    void Start()
    {
        trans = GetComponent<Transform>();
    }

    // Update is called once per frame
    void Update()
    {
        if (!HandStatus.instance.rightHand.isStop)
        {
            recentPos = handTrans.position;
        }
        recentRot = handTrans.rotation;//막혀도 로테이션은 그대로 하고싶엇음 ㅎ

        trans.position = (recentPos);
        trans.rotation = (recentRot);

    }
}

 

시연 장면입니다 

 

투과 전 모델과 앵커가 같은 위치에 있습니다

투과 후 서로 다른 위치에 있고 빠져나오면 다시 정상 작동합니다.

 

글 이것 저것 찾다가 없어서

잔머리를 굴려서 만들었으니 허접한점 양해바랍니당 ㅋㅋㅋ

728x90
반응형