コード例 #1
0
    //-------------------------------------------------
    private void TeleportPlayer()
    {
        teleporting = false;

        Teleport.PlayerPre.Send(pointedAtTeleportMarker);

        SteamVR_Fade.Start(Color.clear, currentFadeTime);

        TeleportPoint teleportPoint    = teleportingToMarker as TeleportPoint;
        Vector3       teleportPosition = pointedAtPosition;

        if (teleportPoint != null)
        {
            teleportPosition = teleportPoint.transform.position;

            //Teleport to a new scene
            if (teleportPoint.teleportType == TeleportPoint.TeleportPointType.SwitchToNewScene)
            {
                teleportPoint.TeleportToScene();
                return;
            }
        }

        // Find the actual floor position below the navigation mesh
        VHONTeleportArea teleportArea = teleportingToMarker as VHONTeleportArea;

        if (teleportArea != null)
        {
            if (floorFixupMaximumTraceDistance > 0.0f)
            {
                RaycastHit raycastHit;
                if (Physics.Raycast(teleportPosition + 0.05f * Vector3.down, Vector3.down, out raycastHit, floorFixupMaximumTraceDistance, floorFixupTraceLayerMask))
                {
                    teleportPosition = raycastHit.point;
                }
            }
        }

        if (teleportingToMarker.ShouldMovePlayer())
        {
            //NVRReplace

            /* Vector3 playerFeetOffset = player.trackingOriginTransform.position - player.feetPositionGuess;
             * player.trackingOriginTransform.position = teleportPosition + playerFeetOffset; */
            Vector3 playerFeetOffset = player.transform.position - player.feetPositionGuess;
            player.transform.position = teleportPosition + playerFeetOffset;
        }
        else
        {
            teleportingToMarker.TeleportPlayer(pointedAtPosition);
        }

        Teleport.Player.Send(pointedAtTeleportMarker);
    }
コード例 #2
0
 //-------------------------------------------------
 void OnEnable()
 {
     if (Selection.activeTransform != null)
     {
         VHONTeleportArea teleportArea = Selection.activeTransform.GetComponent <VHONTeleportArea>();
         if (teleportArea != null)
         {
             teleportArea.UpdateVisualsInEditor();
         }
     }
 }
コード例 #3
0
    //-------------------------------------------------
    void FixedUpdate()
    {
        if (!visible)
        {
            return;
        }

        if (debugFloor)
        {
            //Debug floor
            VHONTeleportArea teleportArea = pointedAtTeleportMarker as VHONTeleportArea;
            if (teleportArea != null)
            {
                if (floorFixupMaximumTraceDistance > 0.0f)
                {
                    floorDebugSphere.gameObject.SetActive(true);
                    floorDebugLine.gameObject.SetActive(true);

                    RaycastHit raycastHit;
                    Vector3    traceDir = Vector3.down;
                    traceDir.x = 0.01f;
                    if (Physics.Raycast(pointedAtPosition + 0.05f * traceDir, traceDir, out raycastHit, floorFixupMaximumTraceDistance, floorFixupTraceLayerMask))
                    {
                        floorDebugSphere.transform.position = raycastHit.point;
                        floorDebugSphere.material.color     = Color.green;
                                                        #if (UNITY_5_4)
                        floorDebugLine.SetColors(Color.green, Color.green);
                                                        #else
                        floorDebugLine.startColor = Color.green;
                        floorDebugLine.endColor   = Color.green;
                                                        #endif
                        floorDebugLine.SetPosition(0, pointedAtPosition);
                        floorDebugLine.SetPosition(1, raycastHit.point);
                    }
                    else
                    {
                        Vector3 rayEnd = pointedAtPosition + (traceDir * floorFixupMaximumTraceDistance);
                        floorDebugSphere.transform.position = rayEnd;
                        floorDebugSphere.material.color     = Color.red;
                                                        #if (UNITY_5_4)
                        floorDebugLine.SetColors(Color.red, Color.red);
                                                        #else
                        floorDebugLine.startColor = Color.red;
                        floorDebugLine.endColor   = Color.red;
                                                        #endif
                        floorDebugLine.SetPosition(0, pointedAtPosition);
                        floorDebugLine.SetPosition(1, rayEnd);
                    }
                }
            }
        }
    }
コード例 #4
0
    //-------------------------------------------------
    public override void OnInspectorGUI()
    {
        DrawDefaultInspector();

        if (Selection.activeTransform != null)
        {
            VHONTeleportArea teleportArea = Selection.activeTransform.GetComponent <VHONTeleportArea>();
            if (GUI.changed && teleportArea != null)
            {
                teleportArea.UpdateVisualsInEditor();
            }
        }
    }
コード例 #5
0
    //-------------------------------------------------
    private void UpdatePointer()
    {
        Vector3 pointerStart = pointerStartTransform.position;
        Vector3 pointerEnd;
        Vector3 pointerDir          = pointerStartTransform.forward;
        bool    hitSomething        = false;
        bool    showPlayAreaPreview = false;
        //Vector3 playerFeetOffset = player.trackingOriginTransform.position - player.feetPositionGuess;
        Vector3 playerFeetOffset = player.transform.position - player.feetPositionGuess;

        Vector3 arcVelocity = pointerDir * arcDistance;

        TeleportMarkerBase hitTeleportMarker = null;

        //Check pointer angle
        float dotUp = Vector3.Dot(pointerDir, Vector3.up);
        //NVRReplace//float dotForward = Vector3.Dot( pointerDir, player.hmdTransform.forward );
        float dotForward        = Vector3.Dot(pointerDir, player.Head.transform.forward);
        bool  pointerAtBadAngle = false;

        if ((dotForward > 0 && dotUp > 0.75f) || (dotForward < 0.0f && dotUp > 0.5f))
        {
            pointerAtBadAngle = true;
        }

        //Trace to see if the pointer hit anything
        RaycastHit hitInfo;

        teleportArc.SetArcData(pointerStart, arcVelocity, true, pointerAtBadAngle);
        if (teleportArc.DrawArc(out hitInfo))
        {
            hitSomething      = true;
            hitTeleportMarker = hitInfo.collider.GetComponentInParent <TeleportMarkerBase>();
        }

        if (pointerAtBadAngle)
        {
            hitTeleportMarker = null;
        }

        HighlightSelected(hitTeleportMarker);

        if (hitTeleportMarker != null)                   //Hit a teleport marker
        {
            if (hitTeleportMarker.locked)
            {
                teleportArc.SetColor(pointerLockedColor);
                                        #if (UNITY_5_4)
                pointerLineRenderer.SetColors(pointerLockedColor, pointerLockedColor);
                                        #else
                pointerLineRenderer.startColor = pointerLockedColor;
                pointerLineRenderer.endColor   = pointerLockedColor;
                                        #endif
                destinationReticleTransform.gameObject.SetActive(false);
            }
            else
            {
                teleportArc.SetColor(pointerValidColor);
                                        #if (UNITY_5_4)
                pointerLineRenderer.SetColors(pointerValidColor, pointerValidColor);
                                        #else
                pointerLineRenderer.startColor = pointerValidColor;
                pointerLineRenderer.endColor   = pointerValidColor;
                                        #endif
                destinationReticleTransform.gameObject.SetActive(hitTeleportMarker.showReticle);
            }

            offsetReticleTransform.gameObject.SetActive(true);

            invalidReticleTransform.gameObject.SetActive(false);

            pointedAtTeleportMarker = hitTeleportMarker;
            pointedAtPosition       = hitInfo.point;

            if (showPlayAreaMarker)
            {
                //Show the play area marker if this is a teleport area
                VHONTeleportArea teleportArea = pointedAtTeleportMarker as VHONTeleportArea;
                if (teleportArea != null && !teleportArea.locked && playAreaPreviewTransform != null)
                {
                    Vector3 offsetToUse = playerFeetOffset;

                    //Adjust the actual offset to prevent the play area marker from moving too much
                    if (!movedFeetFarEnough)
                    {
                        float distanceFromStartingOffset = Vector3.Distance(playerFeetOffset, startingFeetOffset);
                        if (distanceFromStartingOffset < 0.1f)
                        {
                            offsetToUse = startingFeetOffset;
                        }
                        else if (distanceFromStartingOffset < 0.4f)
                        {
                            offsetToUse = Vector3.Lerp(startingFeetOffset, playerFeetOffset, (distanceFromStartingOffset - 0.1f) / 0.3f);
                        }
                        else
                        {
                            movedFeetFarEnough = true;
                        }
                    }

                    playAreaPreviewTransform.position = pointedAtPosition + offsetToUse;

                    showPlayAreaPreview = true;
                }
            }

            pointerEnd = hitInfo.point;
        }
        else                 //Hit neither
        {
            destinationReticleTransform.gameObject.SetActive(false);
            offsetReticleTransform.gameObject.SetActive(false);

            teleportArc.SetColor(pointerInvalidColor);
#if (UNITY_5_4)
            pointerLineRenderer.SetColors(pointerInvalidColor, pointerInvalidColor);
#else
            pointerLineRenderer.startColor = pointerInvalidColor;
            pointerLineRenderer.endColor   = pointerInvalidColor;
#endif
            invalidReticleTransform.gameObject.SetActive(!pointerAtBadAngle);

            //Orient the invalid reticle to the normal of the trace hit point
            Vector3 normalToUse = hitInfo.normal;
            float   angle       = Vector3.Angle(hitInfo.normal, Vector3.up);
            if (angle < 15.0f)
            {
                normalToUse = Vector3.up;
            }
            invalidReticleTargetRotation     = Quaternion.FromToRotation(Vector3.up, normalToUse);
            invalidReticleTransform.rotation = Quaternion.Slerp(invalidReticleTransform.rotation, invalidReticleTargetRotation, 0.1f);

            //Scale the invalid reticle based on the distance from the player
            //NVRReplace//float distanceFromPlayer = Vector3.Distance( hitInfo.point, player.hmdTransform.position );
            float distanceFromPlayer         = Vector3.Distance(hitInfo.point, player.Head.transform.position);
            float invalidReticleCurrentScale = Util.RemapNumberClamped(distanceFromPlayer, invalidReticleMinScaleDistance, invalidReticleMaxScaleDistance, invalidReticleMinScale, invalidReticleMaxScale);
            invalidReticleScale.x = invalidReticleCurrentScale;
            invalidReticleScale.y = invalidReticleCurrentScale;
            invalidReticleScale.z = invalidReticleCurrentScale;
            invalidReticleTransform.transform.localScale = invalidReticleScale;

            pointedAtTeleportMarker = null;

            if (hitSomething)
            {
                pointerEnd = hitInfo.point;
            }
            else
            {
                pointerEnd = teleportArc.GetArcPositionAtTime(teleportArc.arcDuration);
            }

            //Debug floor
            if (debugFloor)
            {
                floorDebugSphere.gameObject.SetActive(false);
                floorDebugLine.gameObject.SetActive(false);
            }
        }

        if (playAreaPreviewTransform != null)
        {
            playAreaPreviewTransform.gameObject.SetActive(showPlayAreaPreview);
        }

        if (!showOffsetReticle)
        {
            offsetReticleTransform.gameObject.SetActive(false);
        }

        destinationReticleTransform.position = pointedAtPosition;
        invalidReticleTransform.position     = pointerEnd;
        onActivateObjectTransform.position   = pointerEnd;
        onDeactivateObjectTransform.position = pointerEnd;
        offsetReticleTransform.position      = pointerEnd - playerFeetOffset;

        reticleAudioSource.transform.position = pointedAtPosition;

        pointerLineRenderer.SetPosition(0, pointerStart);
        pointerLineRenderer.SetPosition(1, pointerEnd);
    }