유니티 VR 줄(Rope)잡아 당기며 이동하기

영상

 

코드

using UnityEngine;

public class PullRope : MonoBehaviour
{
     private bool isRightHoldedState;
     private bool canRightHoldRope; 
     
     private bool isLeftHoldedState;
     private bool canLeftHoldRope;

    
     private Vector3 firstRightHoldTransform; 
     private Transform holdingRightTransform;
     
     private Vector3 firstLeftHoldTransform;
     private Transform holdingLeftTransform;

    public Transform holdRightGrabTransform;
    public Transform holdLeftGrabTransform;
    
    private RaycastHit hit;
    [SerializeField] private float rayRange = 0.1f;
    
    private int ropeLayer;

    [SerializeField] private float speed = 2f;
    [SerializeField] private float amplitude = 0.03f;
    [SerializeField] private float frequency = 0.01f;
    private Rigidbody rb;
    
    private void Start()
    {
        rb = this.transform.GetComponent<Rigidbody>();
        ropeLayer = LayerMask.NameToLayer("Rope");
    }

    private void Update()
    {
        Collider[] rightColliders = Physics.OverlapSphere(holdRightGrabTransform.position, rayRange, 1 << ropeLayer);
        Collider[] leftColliders = Physics.OverlapSphere(holdLeftGrabTransform.position, rayRange, 1 << ropeLayer);
        canRightHoldRope = rightColliders.Length > 0;
        canLeftHoldRope = leftColliders.Length > 0;

                
        if (isRightHoldedState)
        {
            var dir = firstRightHoldTransform - holdRightGrabTransform.position;
   
            var distance = Vector3.Distance(firstRightHoldTransform , holdRightGrabTransform.position);

            rb.MovePosition(rb.position + dir * (distance * speed * Time.deltaTime));
        }
        
        if (isLeftHoldedState)
        {
            var dir = firstLeftHoldTransform - holdLeftGrabTransform.position;
            var distance = Vector3.Distance(firstLeftHoldTransform , holdLeftGrabTransform.position);

            rb.MovePosition(rb.position + dir * (distance * speed * Time.deltaTime));
        }
        
        if (OVRInput.GetDown(OVRInput.Button.SecondaryHandTrigger) && canRightHoldRope)
        {
            OVRInput.SetControllerVibration(frequency, amplitude, OVRInput.Controller.RTouch); 
            isRightHoldedState = true;
            firstRightHoldTransform = holdRightGrabTransform.position;
        }
        else if (OVRInput.GetUp(OVRInput.Button.SecondaryHandTrigger))
        {
            firstRightHoldTransform = Vector3.zero;
            isRightHoldedState = false;
            holdingRightTransform = null;
        }
        
        if (OVRInput.GetDown(OVRInput.Button.PrimaryHandTrigger) && canLeftHoldRope)
        {
            OVRInput.SetControllerVibration(frequency, amplitude, OVRInput.Controller.LTouch);
            isLeftHoldedState = true;
            firstLeftHoldTransform = holdLeftGrabTransform.position;
        }
        else if (OVRInput.GetUp(OVRInput.Button.PrimaryHandTrigger))
        {
            firstLeftHoldTransform = Vector3.zero;
            isLeftHoldedState = false;
            holdingLeftTransform = null;
        }
    }

}

 

주의해야 할  부분

  • Layer를 설정해줘야 합니다.
  • 최적화되어 있는 코드가 아닙니다.