void Update() { // 왼쪽 컨트롤러의 One 버튼을 누르면 if (ARAVRInput.GetDown(ARAVRInput.Button.One, ARAVRInput.Controller.LTouch)) { // 라인랜더러 컴포넌트 활성화 lr.enabled = true; } // 왼쪽 컨트롤러의 One 버튼을 떼면 else if (ARAVRInput.GetUp(ARAVRInput.Button.One, ARAVRInput.Controller.LTouch)) { // 라인랜더러 비활성화 lr.enabled = false; // 텔레포트 UI 가 활성화 되어 있을 때 if (teleportCircleUI.gameObject.activeSelf) { GetComponent <CharacterController>().enabled = false; // 텔레포트 UI 위치로 순간이동 transform.position = teleportCircleUI.position + Vector3.up; GetComponent <CharacterController>().enabled = true; } // 텔레포트 UI 비활성화 teleportCircleUI.gameObject.SetActive(false); } // 왼쪽 컨트롤러의 One 버튼을 누르고 있을때 else if (ARAVRInput.Get(ARAVRInput.Button.One, ARAVRInput.Controller.LTouch)) { // 주어진 길이크기의 커브를 만들고 싶다. MakeLines(); } }
private void TryUngrab() { // 던질 방향 Vector3 throwDirection = (ARAVRInput.RHandPosition - prevPos); // 위치 기억 prevPos = ARAVRInput.RHandPosition; // 쿼터니온 공식 // angle1 = Q1, angle2 = Q2 // angle1 + angle2 = Q1 * Q2 // -angle2 = Quaternion.Inverse(Q2) // angle2 - angle1 = Quaternion.FromToRotation(Q1, Q2) = Q2 * Quaternion.Inverse(Q1) // 회전 방향 = current - previous 의 차 로 구함 - previous 는 Inverse 로 구함 Quaternion deltaRotation = ARAVRInput.RHand.rotation * Quaternion.Inverse(prevRot); // 이전 회전 저장 prevRot = ARAVRInput.RHand.rotation; // 버튼을 놓았다면 if (ARAVRInput.GetUp(ARAVRInput.Button.HandTrigger, ARAVRInput.Controller.RTouch)) { // 잡지 않은 상태로 전환 isGrabbing = false; // 물리기능 활성화 grabbedObject.GetComponent <Rigidbody>().isKinematic = false; // 손에서 폭탄 떼어내기 grabbedObject.transform.parent = null; // 던지기 grabbedObject.GetComponent <Rigidbody>().velocity = throwDirection * throwPower; // 각속도 = (1/dt) * dθ(특정축 기준 변위각도) float angle; Vector3 axis; deltaRotation.ToAngleAxis(out angle, out axis); Vector3 angularVelocity = (1.0f / Time.deltaTime) * angle * axis; grabbedObject.GetComponent <Rigidbody>().angularVelocity = angularVelocity; // 잡은 물체 없도록 설정 grabbedObject = null; } }
void Update() { // 왼쪽 컨트롤러의 One 버튼을 누르면 if (ARAVRInput.GetDown(ARAVRInput.Button.One, ARAVRInput.Controller.LTouch)) { // 라인랜더러 컴포넌트 활성화 lr.enabled = true; } // 왼쪽 컨트롤러의 One 버튼을 떼면 else if (ARAVRInput.GetUp(ARAVRInput.Button.One, ARAVRInput.Controller.LTouch)) { // 라인랜더러 비활성화 lr.enabled = false; if (teleportCircleUI.gameObject.activeSelf) { // 워프 기능 사용이 아닐때 순간이동 처리 if (isWarp == false) { GetComponent <CharacterController>().enabled = false; // 텔레포트 UI 위치로 순간이동 transform.position = teleportCircleUI.position + Vector3.up; GetComponent <CharacterController>().enabled = true; } else { // 워프 기능 사용할때는 Warp() 코루틴 호출 StartCoroutine(Warp()); } } // 텔레포트 UI 비활성화 teleportCircleUI.gameObject.SetActive(false); } // 왼쪽 컨트롤러의 One 버튼을 누르고 있을때 else if (ARAVRInput.Get(ARAVRInput.Button.One, ARAVRInput.Controller.LTouch)) { // 1. 왼쪽 컨트롤러를 기준으로 Ray 를 만든다. Ray ray = new Ray(ARAVRInput.LHandPosition, ARAVRInput.LHandDirection); RaycastHit hitInfo; int layer = 1 << LayerMask.NameToLayer("Terrain"); // 2. Terrain 만 Ray 충돌 검출 if (Physics.Raycast(ray, out hitInfo, 200, layer)) { // 3. Ray 가 부딪힌 지점에 라인그리기 lr.SetPosition(0, ray.origin); lr.SetPosition(1, hitInfo.point); // 4. Ray 가 부딪힌 지점에 텔레포트 UI 표시 teleportCircleUI.gameObject.SetActive(true); teleportCircleUI.position = hitInfo.point; // 텔레포트 UI 가 위로 누워 있도록 방향 설정 teleportCircleUI.forward = hitInfo.normal; // 텔레포트 UI 의 크기가 거리에 따라 보정 되도록 설정 teleportCircleUI.localScale = originScale * Mathf.Max(1, hitInfo.distance); } else { // Ray 충돌이 발생하지 않으면 선이 Ray 방향으로 그려지도록 처리 lr.SetPosition(0, ray.origin); lr.SetPosition(1, ray.origin + ARAVRInput.LHandDirection * 200); // 텔레포트 UI 는 화면에서 비활성화 teleportCircleUI.gameObject.SetActive(false); } } }