private void Rotate(RotationParameter param, float deltaTime) { if (Math.Abs(param.AngularVelocity) >= VelThrehold) { var upperBound = AmplitudeLimit(param.AngularVelocity, param); var lowerBound = -upperBound; param.Shift = Mathf.Clamp(param.Shift + param.GetAverageVel() * deltaTime, lowerBound, upperBound); } else { if (param.Shift != 0) { // Restore var restoreVel = param.Shift > 0 ? -param.RestoreVel : param.RestoreVel; var newShift = param.Shift + restoreVel * deltaTime; if (newShift * param.Shift < 0) { param.Shift = 0; } else { param.Shift = newShift; } } } }
/// <summary> /// 返回幅度的最大值 /// </summary> /// <param name="vel"></param> /// <param name="param"></param> /// <returns></returns> private float AmplitudeLimit(float vel, RotationParameter param) { float baseAmplitude = Mathf.Abs(vel / 10); return(Mathf.Min(baseAmplitude, param.UpperLimit)); }
public async UniTask Rotation(RotationParameter rotationParameter) => await movementHub.RotateAsync(rotationParameter);
public Task RotateAsync(RotationParameter rotationParams) { BroadcastExceptSelf(room).Rotate(rotationParams); return(Task.CompletedTask); }
void IMovementReceiver.Rotate(RotationParameter rotationParams) { var index = rotationParams.Index; Parameters[index].Rotation = rotationParams.Rotation; }