解决旋转反向问题

This commit is contained in:
SepComet 2026-04-07 21:33:05 +08:00
parent b7c003f227
commit da2b93e59c
7 changed files with 69 additions and 4 deletions

View File

@ -7,7 +7,9 @@
"Bash(dotnet build:*)", "Bash(dotnet build:*)",
"Bash(dotnet test:*)", "Bash(dotnet test:*)",
"Bash(dotnet Temp/Bin/Debug/Network.EditMode.Tests/Network.EditMode.Tests.dll)", "Bash(dotnet Temp/Bin/Debug/Network.EditMode.Tests/Network.EditMode.Tests.dll)",
"Bash(openspec list:*)" "Bash(openspec list:*)",
"Bash(git add:*)",
"Bash(git commit:*)"
] ]
}, },
"outputStyle": "default" "outputStyle": "default"

View File

@ -283,6 +283,7 @@ GameObject:
- component: {fileID: 6308356813655391140} - component: {fileID: 6308356813655391140}
- component: {fileID: 6308356813655391139} - component: {fileID: 6308356813655391139}
- component: {fileID: 6308356813655391138} - component: {fileID: 6308356813655391138}
- component: {fileID: 2373500463057886562}
m_Layer: 0 m_Layer: 0
m_Name: Main Camera m_Name: Main Camera
m_TagString: MainCamera m_TagString: MainCamera
@ -364,6 +365,50 @@ AudioListener:
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6308356813655391137} m_GameObject: {fileID: 6308356813655391137}
m_Enabled: 1 m_Enabled: 1
--- !u!114 &2373500463057886562
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6308356813655391137}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: a79441f348de89743a2939f4d699eac1, type: 3}
m_Name:
m_EditorClassIdentifier:
m_RenderShadows: 1
m_RequiresDepthTextureOption: 2
m_RequiresOpaqueTextureOption: 2
m_CameraType: 0
m_Cameras: []
m_RendererIndex: -1
m_VolumeLayerMask:
serializedVersion: 2
m_Bits: 1
m_VolumeTrigger: {fileID: 0}
m_VolumeFrameworkUpdateModeOption: 2
m_RenderPostProcessing: 0
m_Antialiasing: 0
m_AntialiasingQuality: 2
m_StopNaN: 0
m_Dithering: 0
m_ClearDepth: 1
m_AllowXRRendering: 1
m_AllowHDROutput: 1
m_UseScreenCoordOverride: 0
m_ScreenSizeOverride: {x: 0, y: 0, z: 0, w: 0}
m_ScreenCoordScaleBias: {x: 0, y: 0, z: 0, w: 0}
m_RequiresDepthTexture: 0
m_RequiresColorTexture: 0
m_Version: 2
m_TaaSettings:
m_Quality: 3
m_FrameInfluence: 0.1
m_JitterScale: 1
m_MipBias: 0
m_VarianceClampScale: 0.9
m_ContrastAdaptiveSharpening: 0
--- !u!1 &6308356814245253661 --- !u!1 &6308356814245253661
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0

View File

@ -121,7 +121,7 @@ public sealed class ClientAuthoritativePlayerStateSnapshot
public int Hp { get; } public int Hp { get; }
public Quaternion RotationQuaternion => Quaternion.Euler(0f, NormalizeDegrees(90f - Rotation), 0f); public Quaternion RotationQuaternion => Quaternion.Euler(0f, NormalizeDegrees(Rotation), 0f);
private static float NormalizeDegrees(float degrees) private static float NormalizeDegrees(float degrees)
{ {

View File

@ -23,7 +23,7 @@ public static class ClientGameplayInputFlow
{ {
PlayerId = playerId, PlayerId = playerId,
Tick = tick, Tick = tick,
TurnInput = -input.x, TurnInput = input.x,
ThrottleInput = input.z ThrottleInput = input.z
}; };
return true; return true;

View File

@ -222,7 +222,7 @@ public class MovementComponent : MonoBehaviour
{ {
Debug.Log( Debug.Log(
$"[Simulate] frame={Time.frameCount} input=({input.x:F2},{input.z:F2}) accum={_simulationAccumulator:F4}"); $"[Simulate] frame={Time.frameCount} input=({input.x:F2},{input.z:F2}) accum={_simulationAccumulator:F4}");
ApplyTankMovement(-input.x, input.z, kServerSimulationStepSeconds); ApplyTankMovement(input.x, input.z, kServerSimulationStepSeconds);
//ApplyTankMovement(-input.x, input.z, kServerSimulationStepSeconds); //ApplyTankMovement(-input.x, input.z, kServerSimulationStepSeconds);

View File

@ -174,6 +174,11 @@ namespace Network.NetworkHost
IntegrateState(state, configuration.SimulationInterval); IntegrateState(state, configuration.SimulationInterval);
} }
foreach (var state in statesByPeer.Values)
{
state.HasInputThisFrame = false;
}
accumulatedBroadcastTime += configuration.SimulationInterval; accumulatedBroadcastTime += configuration.SimulationInterval;
while (accumulatedBroadcastTime >= configuration.BroadcastInterval) while (accumulatedBroadcastTime >= configuration.BroadcastInterval)
{ {
@ -362,6 +367,7 @@ namespace Network.NetworkHost
state.LastAcceptedMoveTick = input.Tick; state.LastAcceptedMoveTick = input.Tick;
state.InputX = ClampInput(input.TurnInput); state.InputX = ClampInput(input.TurnInput);
state.InputY = ClampInput(input.ThrottleInput); state.InputY = ClampInput(input.ThrottleInput);
state.HasInputThisFrame = true;
if (state.InputY == 0f) if (state.InputY == 0f)
{ {
@ -390,6 +396,16 @@ namespace Network.NetworkHost
return; return;
} }
if (!state.HasInputThisFrame)
{
state.InputX = 0f;
state.InputY = 0f;
state.VelocityX = 0f;
state.VelocityY = 0f;
state.VelocityZ = 0f;
return;
}
var turnInput = ClampInput(state.InputX); var turnInput = ClampInput(state.InputX);
var throttleInput = ClampInput(state.InputY); var throttleInput = ClampInput(state.InputY);
if (turnInput != 0f) if (turnInput != 0f)

View File

@ -46,6 +46,8 @@ namespace Network.NetworkHost
public float InputY { get; internal set; } public float InputY { get; internal set; }
public bool HasInputThisFrame { get; internal set; }
public float Speed { get; internal set; } public float Speed { get; internal set; }
} }
} }