예제 #1
0
    public void UpdateTrackValue()
    {
        if (trackType == 1)
        {
            VRCPlayerApi player = null;
            switch (targetPlayer)
            {
            case 0:
                player = Networking.LocalPlayer;
                break;

            case 1:
                player = Networking.GetOwner(gameObject);
                break;

            case 2:
                if (targetTrigger)
                {
                    var playerField = (VRCPlayerApi)targetTrigger.GetProgramVariable("triggeredPlayer");
                    player = playerField;
                }
                break;

            case 3:
                VRCPlayerApi[] players = new VRCPlayerApi[VRCPlayerApi.GetPlayerCount()];;
                VRCPlayerApi.GetPlayers(players);
                if (index < players.Length)
                {
                    player = players[index];
                }
                else
                {
                    player = Networking.LocalPlayer;
                }
                break;
            }
            if (player == null || !player.IsValid())
            {
                return;
            }

            switch (spot)
            {
            case "IsUserInVR":
                value_b = player.IsUserInVR();
                break;

            case "IsPlayerGrounded":
                value_b = player.IsPlayerGrounded();
                break;

            case "IsMaster":
                value_b = player.isMaster;
                break;

            case "IsInstanceOwner":
                value_b = player.isInstanceOwner;
                break;

            case "IsGameObjectOwner":
                value_b = player.IsOwner(gameObject);
                break;

            case "Position":
                value_v3 = player.GetPosition();
                if (positionTracking)
                {
                    transform.position = player.GetPosition();
                    transform.rotation = player.GetRotation();
                }
                break;

            case "Rotation":
                value_v3 = player.GetRotation().eulerAngles;
                break;

            case "HeadPosition":
                value_v3 = player.GetTrackingData(VRCPlayerApi.TrackingDataType.Head).position;
                if (positionTracking)
                {
                    transform.position = player.GetTrackingData(VRCPlayerApi.TrackingDataType.Head).position;
                    transform.rotation = player.GetTrackingData(VRCPlayerApi.TrackingDataType.Head).rotation;
                }
                break;

            case "HeadRotation":
                value_v3 = player.GetTrackingData(VRCPlayerApi.TrackingDataType.Head).rotation.eulerAngles;
                break;

            case "RightHandPosition":
                value_v3 = player.GetTrackingData(VRCPlayerApi.TrackingDataType.RightHand).position;
                if (positionTracking)
                {
                    transform.position = player.GetTrackingData(VRCPlayerApi.TrackingDataType.RightHand).position;
                    transform.rotation = player.GetTrackingData(VRCPlayerApi.TrackingDataType.RightHand).rotation;
                }
                break;

            case "RightHandRotation":
                value_v3 = player.GetTrackingData(VRCPlayerApi.TrackingDataType.RightHand).rotation.eulerAngles;
                break;

            case "LeftHandPosition":
                value_v3 = player.GetTrackingData(VRCPlayerApi.TrackingDataType.LeftHand).position;
                if (positionTracking)
                {
                    transform.position = player.GetTrackingData(VRCPlayerApi.TrackingDataType.LeftHand).position;
                    transform.rotation = player.GetTrackingData(VRCPlayerApi.TrackingDataType.LeftHand).rotation;
                }
                break;

            case "LeftHandRotation":
                value_v3 = player.GetTrackingData(VRCPlayerApi.TrackingDataType.LeftHand).rotation.eulerAngles;
                break;

            case "Velocity":
                value_v3 = player.GetVelocity();
                break;

            case "DisplayName":
                value_s = player.displayName;
                break;
            }
        }

        if (trackType == 2)
        {
            if (!targetObject)
            {
                return;
            }

            switch (spot)
            {
            case "IsActive":
                value_b = targetObject.activeSelf;
                break;

            case "Position":
                value_v3 = targetObject.transform.position;
                if (positionTracking)
                {
                    transform.position = targetObject.transform.position;
                    transform.rotation = targetObject.transform.rotation;
                }
                break;

            case "Rotation":
                value_v3 = targetObject.transform.rotation.eulerAngles;
                break;

            case "LocalPosition":
                value_v3 = targetObject.transform.localPosition;
                if (positionTracking)
                {
                    transform.position = targetObject.transform.position;
                    transform.rotation = targetObject.transform.rotation;
                }
                break;

            case "LocalRotation":
                value_v3 = targetObject.transform.localRotation.eulerAngles;
                break;

            case "Velocity":
                value_v3 = targetObject.GetComponent <Rigidbody>().velocity;
                break;

            case "AngularVelocity":
                value_v3 = targetObject.GetComponent <Rigidbody>().angularVelocity;
                break;
            }
        }

        if (trackType == 3)
        {
            switch (spot)
            {
            case "PlayerCount":
                value_i = VRCPlayerApi.GetPlayerCount();
                value_f = value_i;
                break;

            case "Year":
                value_i = System.DateTime.Now.Year;
                value_f = value_i;
                break;

            case "Month":
                value_i = System.DateTime.Now.Month;
                value_f = value_i;
                break;

            case "Day":
                value_i = System.DateTime.Now.Day;
                value_f = value_i;
                break;

            case "DayOfWeek":
                value_i = (int)System.DateTime.Now.DayOfWeek;
                value_f = value_i;
                break;

            case "Hour":
                value_i = System.DateTime.Now.Hour;
                value_f = value_i;
                break;

            case "Minute":
                value_i = System.DateTime.Now.Minute;
                value_f = value_i;
                break;

            case "Second":
                value_i = System.DateTime.Now.Second;
                value_f = value_i;
                break;

            case "JoinHours":
                value_f = (float)(System.DateTime.Now - startTime).TotalHours;
                value_i = (int)value_f;
                break;

            case "JoinMinutes":
                value_f = (float)(System.DateTime.Now - startTime).TotalMinutes;
                value_i = (int)value_f;
                break;

            case "JoinSeconds":
                value_f = (float)(System.DateTime.Now - startTime).TotalSeconds;
                value_i = (int)value_f;
                break;
            }
        }

        if (trackType == 4)
        {
            if (targetComponent)
            {
                if (valueType == 0)
                {
                    if (spot == "Toggle")
                    {
                        var toggle = (Toggle)targetComponent;
                        value_b = toggle.isOn;
                    }
                }
                if (valueType == 1)
                {
                    if (spot == "Text")
                    {
                        var text = (Text)targetComponent;
                        int.TryParse(text.text, out value_i);
                    }
                    if (spot == "InputField")
                    {
                        var inputField = (InputField)targetComponent;
                        int.TryParse(inputField.text, out value_i);
                    }
                }
                if (valueType == 2)
                {
                    if (spot == "Slider")
                    {
                        var slider = (Slider)targetComponent;
                        value_f = slider.value;
                    }
                    if (spot == "Scrollbar")
                    {
                        var scrollbar = (Scrollbar)targetComponent;
                        value_f = scrollbar.value;
                    }
                    if (spot == "Text")
                    {
                        var text = (Text)targetComponent;
                        float.TryParse(text.text, out value_f);
                    }
                    if (spot == "InputField")
                    {
                        var inputField = (InputField)targetComponent;
                        float.TryParse(inputField.text, out value_f);
                    }
                }
                if (valueType == 4)
                {
                    if (spot == "Text")
                    {
                        var text = (Text)targetComponent;
                        value_s = text.text;
                    }
                    if (spot == "InputField")
                    {
                        var inputField = (InputField)targetComponent;
                        value_s = inputField.text;
                    }
                }
            }
        }

        if (trackType == 5)
        {
            if (targetComponent != null && spot != "")
            {
                Animator animator = (Animator)targetComponent;
                if (valueType == 0)
                {
                    value_b = animator.GetBool(spot);
                }
                if (valueType == 1)
                {
                    value_i = animator.GetInteger(spot);
                }
                if (valueType == 2)
                {
                    value_f = animator.GetFloat(spot);
                }
            }
        }

        if (trackType == 6)
        {
            switch (spot)
            {
            case "RightIndexTrigger":
                value_f = Input.GetAxis("Oculus_CrossPlatform_SecondaryIndexTrigger");
                break;

            case "LeftIndexTrigger":
                value_f = Input.GetAxis("Oculus_CrossPlatform_PrimaryIndexTrigger");
                break;

            case "RightGrip":
                value_f = Input.GetAxis("Oculus_CrossPlatform_SecondaryHandTrigger");
                break;

            case "LeftGrip":
                value_f = Input.GetAxis("Oculus_CrossPlatform_PrimaryHandTrigger");
                break;
            }
        }

        UpdateSubValue();
    }
예제 #2
0
        private bool TestPlayerLocomotionSettings(VRCPlayerApi player)
        {
            Debug.Log("TestPlayerLocomotionSettings");

            // Teleports
            Debug.Log("Player TeleportTo");
            player.TeleportTo(transform.position, Quaternion.identity);

            float expected = 200;
            float val      = 0;

            if (player.isLocal)
            {
                // Strafe
                Debug.Log("Player Strafe: " + player.GetStrafeSpeed());
                player.SetStrafeSpeed(expected);
                val = player.GetStrafeSpeed();
                if (val != expected)
                {
                    Debug.LogError("Strafe speed does not equal expected value!");
                    return(false);
                }
            }

            if (player.isLocal)
            {
                // Walk
                Debug.Log("Player Walk");
                player.SetWalkSpeed(expected);
                val = player.GetWalkSpeed();
                if (val != expected)
                {
                    Debug.LogError("Walk speed does not equal expected value!");
                    return(false);
                }
            }

            if (player.isLocal)
            {
                // Run
                Debug.Log("Player Run");
                player.SetRunSpeed(expected);
                val = player.GetRunSpeed();
                if (val != expected)
                {
                    Debug.LogError("Run speed does not equal expected value!");
                    return(false);
                }
            }

            if (player.isLocal)
            {
                // Jump
                Debug.Log("Player Jump");
                player.SetJumpImpulse(expected);
                val = player.GetJumpImpulse();
                if (val != expected)
                {
                    Debug.LogError("Jump speed does not equal expected value!");
                    return(false);
                }
            }

            if (player.isLocal)
            {
                Debug.Log("Player Gravity");
                player.SetGravityStrength(expected);
                val = player.GetGravityStrength();
                if (val != expected)
                {
                    Debug.LogError("Gravity strength does not equal expected value!");
                    return(false);
                }
            }

            {
                Debug.Log("Player Velocity: " + player.GetVelocity());
                Vector3 velocityExpected = Vector3.up * 50;
                player.SetVelocity(velocityExpected);
                // TODO fix
                // Vector3 velocityActual = player.GetVelocity();
                // if (velocityActual != velocityExpected)
                // {
                //     Debug.LogError("Player velocity does not equal expected value! " +velocityActual +" " + velocityExpected);
                //     return false;
                // }
            }

            {
                Debug.Log("Player IsPlayerGrounded: " + player.IsPlayerGrounded());
            }

            return(true);
        }
예제 #3
0
        public void Update()
        {
            if (!editorMode)
            {
                if (tetherInput > properties.tetherInputDeadzone)
                {
                    if (!tethering)
                    {
                        bool       detected = false;
                        RaycastHit hit      = new RaycastHit();

                        // auto aim in incremental sizes
                        detected = Physics.Raycast(transform.position, transform.forward, out hit, properties.tetherMaximumLength, properties.tetherDetectionMask);
                        if (!detected)
                        {
                            for (int i = properties.tetherDetectionIncrements; detected == false && i > 0; i--)
                            {
                                detected = Physics.SphereCast(transform.position, properties.tetherDetectionSize / i, transform.forward, out hit, properties.tetherMaximumLength, properties.tetherDetectionMask);
                            }
                        }

                        if (detected)
                        {
                            // store tether point as local coords to game object so the gameobject can move and we will stay tethered
                            tetherObject    = hit.collider.gameObject;
                            tetherRigidbody = hit.collider.gameObject.GetComponent <Rigidbody>();
                            tetherPoint     = tetherObject.transform.InverseTransformPoint(hit.point);
                            tetherNormal    = hit.normal;
                            tetherLength    = Vector3.Distance(transform.position, hit.point);

                            tethering          = true;
                            tetheringRigidbody = properties.manipulatesRigidbodies && tetherRigidbody != null;
                            if (tetheringRigidbody)
                            {
                                Networking.SetOwner(localPlayer, tetherObject);
                            }
                        }
                    }

                    if (tethering)
                    {
                        // unreeling
                        if (properties.allowUnwinding && !IsInputHeld())
                        {
                            tetherUnwindRate = properties.unwindRate * (1.0f - ((tetherInput - properties.tetherInputDeadzone) / (properties.tetherHoldDeadzone - properties.tetherInputDeadzone)));
                            tetherLength     = Mathf.Clamp(tetherLength + tetherUnwindRate * Time.deltaTime, 0.0f, properties.tetherMaximumLength);
                        }

                        Vector3 worldTetherPoint = GetTetherPoint();
                        float   distance         = Vector3.Distance(transform.position, worldTetherPoint);

                        // we are beyond the tether length, so project our velocity along the invisible sphere and push us back inside
                        if (distance > tetherLength)
                        {
                            if (!tetheringRigidbody || (tetheringRigidbody && properties.playerMass <= tetherRigidbody.mass))
                            {
                                Vector3 normal = worldTetherPoint - transform.position;
                                normal = normal.normalized;

                                Vector3 spring = normal * (distance - tetherLength) * properties.tetherSpringFactor;
                                spring = Vector3.ClampMagnitude(spring * Time.deltaTime, properties.tetherMaximumSpringForce);

                                Vector3 velocity  = localPlayer.GetVelocity();
                                Vector3 projected = Vector3.ProjectOnPlane(velocity, normal);
                                localPlayer.SetVelocity(Vector3.MoveTowards(velocity, projected, properties.tetherProjectionRate * Time.deltaTime) + spring);
                            }
                        }
                    }
                }
                else
                {
                    if (tethering)
                    {
                        tethering          = false;
                        tetheringRigidbody = false;
                    }
                }
            }
        }
예제 #4
0
 void AddVelocity(VRCPlayerApi player, Vector3 velocity)
 {
     player.SetVelocity(player.GetVelocity() + velocity);
 }
예제 #5
0
        private void Core()
        {
            if (_isGrounded && !_player.IsPlayerGrounded())
            {
                // 落下開始したなら落下位置更新
                UpdateFallsStartPoint();
            }

            _isGrounded = _player.IsPlayerGrounded();
            if (_isGrounded)
            {
                return;
            }

            // ひっくり返してるなら何もしない
            if (Vector3.Dot(transform.up, Vector3.down) > 0f)
            {
                return;
            }

            // 落下分
            var deltaY = _fallStartedY - transform.position.y;

            if (deltaY < 0)
            {
                // 落下開始位置より上に来た場合は更新
                UpdateFallsStartPoint();
                return;
            }

            // 横風成分
            var crossWind = Vector3.zero;

            if (_isInWind)
            {
                // 風の向き(Up)
                var windDirection = Vector3.zero;
                if (_windTransform != null)
                {
                    windDirection = _windTransform.up;
                }

                // 風の縦方向成分は落下位置の上書きに使う
                _fallStartedY = transform.position.y + 3.0f * windDirection.y;
                // 風の横方向成分は移動速度に反映
                crossWind = _crossWindPower * new Vector3(windDirection.x, 0, windDirection.z);
            }
            else
            {
                // 徐々に落下させる
                _fallStartedY = Mathf.Lerp(_fallStartedY, transform.position.y, 5 * Time.fixedDeltaTime);
            }

            // 上書きする速度を計算
            var nextVelocity = transform.up.normalized
                               * Mathf.Sqrt(2 * Physics.gravity.magnitude * deltaY)
                               + crossWind;

            var currentVel = _player.GetVelocity();
            // Lerpを挟むことでプレイヤの操作と合成する
            // 補間値を小さくすると落下が早くなる
            var targetVel = Vector3.Lerp(currentVel, nextVelocity, 4 * Time.fixedDeltaTime);

            _player.SetVelocity(targetVel);
        }
예제 #6
0
 public void SFEXT_O_PilotExit()
 {
     gameObject.SetActive(false);
     localPlayer.SetVelocity(localPlayer.GetVelocity() + VehicleTransform.up * 25);
     TriggerTapTime = 1;
 }
예제 #7
0
    private void Update()
    {
        CheckBoost();
        // check if we entered flight restriction zone
        if (flightRestricted)
        {
            Ground();
            return;
        }
        if (player.IsPlayerGrounded())
        {
            Ground();
            return;
        }

        if (!flying && onFlightStart)
        {
            onFlightStart.SendCustomEvent(onFlightStartEvent);
        }

        flying = true;
        // VRChat has weird inconsistencies when setting gravity to 0 and keeps you floating down
        player.SetGravityStrength(0.0001f);

        var leftForward  = leftHand.forward;
        var rightForward = rightHand.forward;
        var headForward  = head.forward;
        var currVelocity = player.GetVelocity();

        // use hands dot product to control forward speed
        handsDot = Vector3.Dot(leftForward, rightForward);
        // remap from -1 1 to 0 1
        handsDot = (handsDot + 1f) / 2f;
        var currSpeed = currVelocity.magnitude;

        // use the trigger press to control speed in one handed mode
        if (oneHanded)
        {
            handsDot = 1 - Mathf.Max(Input.GetAxisRaw("Oculus_CrossPlatform_PrimaryIndexTrigger"),
                                     Input.GetAxisRaw("Oculus_CrossPlatform_SecondaryIndexTrigger"));
        }
        // determine target speed as current dot product (how much hands are aligned) * current maximum
        var newSpeed = handsDot * maxSpeed;

        // get the smoothing factor for deceleration
        var lerpSpeedTime = decelerationSmoothFactor * Time.deltaTime;

        // get the smoothing factor for acceleration
        if (newSpeed > currSpeed)
        {
            lerpSpeedTime = accelerationSmoothFactor * Time.deltaTime;
        }

        // final smoothed speed value
        var lerpedSpeed = Mathf.Lerp(currSpeed, newSpeed, lerpSpeedTime);

        // we use left + right combined vector to get the direction
        var handDirection = Vector3.Normalize(leftForward + rightForward);

        // for desktop - we use the head vector instead
        if (isDesktop)
        {
            handDirection = headForward;
        }

        // allow to select tracking source for one handed
        if (oneHanded)
        {
            if (oneHandedHead)
            {
                handDirection = headForward;
            }

            if (oneHandedRightHand)
            {
                handDirection = rightForward;
            }

            if (oneHandedLeftHand)
            {
                handDirection = leftForward;
            }
        }

        // check if we are pointing forwards or backwards
        var     headDot = Vector3.Dot(handDirection, headForward);
        Vector3 forwardVelocity;

        // get the  direction amount
        var downDot = Vector3.Dot(handDirection, Vector3.down);

        if (downDot < 0f)
        {
            downDot = 0f;
        }

        // one handed flight does not have any special backward flight logic due to control limitations
        if (headDot < 0f && !oneHanded)
        {
            forwardVelocity = BackwardFlight(handDirection, currSpeed, lerpedSpeed, downDot);
        }
        else
        {
            forwardVelocity = ForwardFlight(handDirection, lerpedSpeed);
        }

        rSpeed    = lerpedSpeed;
        rSpeedDot = handsDot;

        // hovering on desktop
        if (isDesktop && Input.GetKeyDown(freezeInPlaceKey) && allowHover)
        {
            hovering = !hovering;
            if (hovering)
            {
                if (onHoverStart)
                {
                    onHoverStart.SendCustomEvent(onHoverStartEvent);
                }
                return;
            }
            else
            {
                if (onHoverEnd)
                {
                    onHoverEnd.SendCustomEvent(onHoverEndEvent);
                }
            }
        }

        // hovering in vr
        if (!isDesktop && !oneHanded)
        {
            if (handsDot < -0.9 || headDot < 0f)
            {
                if (!hovering)
                {
                    hovering = true;
                    if (onHoverStart)
                    {
                        onHoverStart.SendCustomEvent(onHoverStartEvent);
                    }
                }
            }
            else if (hovering)
            {
                hovering = false;
                if (onHoverEnd)
                {
                    onHoverEnd.SendCustomEvent(onHoverEndEvent);
                }
            }
        }

        // reset back to start
        if (Input.GetKeyDown(forceRespawnKey))
        {
            if (resetPosition)
            {
                player.TeleportTo(new Vector3(0, 0.2f, 0), Quaternion.identity);
                Ground();
                return;
            }
        }

        // we do not want to prevent the players from descending while hovering
        // so we only lock them in place when they're mostly t-posing
        if (hovering || hovering && !isDesktop && downDot < 0.1)
        {
            SetVelocity(new Vector3(0, 0, 0));
            return;
        }

        SetVelocity(forwardVelocity);
    }