Пример #1
0
 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();
     }
 }
Пример #2
0
    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);
            }
        }
    }