영상
코드
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를 설정해줘야 합니다.
- 최적화되어 있는 코드가 아닙니다.