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(); }
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); }
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; } } } }
void AddVelocity(VRCPlayerApi player, Vector3 velocity) { player.SetVelocity(player.GetVelocity() + velocity); }
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); }
public void SFEXT_O_PilotExit() { gameObject.SetActive(false); localPlayer.SetVelocity(localPlayer.GetVelocity() + VehicleTransform.up * 25); TriggerTapTime = 1; }
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); }