This commit is contained in:
Даниил Заикин
2026-06-17 20:44:53 +03:00
parent 9d153773c2
commit b133e7c656
1880 changed files with 244545 additions and 0 deletions
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: b9c2a8a050972cf40abd34965216697a
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,21 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: e651dbb3fbac04af2b8f5abf007ddc23, type: 3}
m_Name: NetworkPrefabsList
m_EditorClassIdentifier:
IsDefault: 0
List:
- Override: 0
Prefab: {fileID: 1519677033271140728, guid: efc3d9a93ac68a94f94fb22a9f9d8ab8, type: 3}
SourcePrefabToOverride: {fileID: 0}
SourceHashToOverride: 0
OverridingTargetPrefab: {fileID: 0}
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: fbfc6ab2e55b2cb4d880a87090116900
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,216 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &1519677033271140728
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 7938275852690515294}
- component: {fileID: 7658504397142224124}
- component: {fileID: 802860290382546433}
- component: {fileID: 372773630649523697}
- component: {fileID: 8492661302939191809}
- component: {fileID: 1797797386874341640}
- component: {fileID: 1461172833347540472}
- component: {fileID: 5128342895877821525}
m_Layer: 0
m_Name: PlayerPrefab
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &7938275852690515294
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1519677033271140728}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!33 &7658504397142224124
MeshFilter:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1519677033271140728}
m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
--- !u!65 &802860290382546433
BoxCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1519677033271140728}
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_IsTrigger: 0
m_ProvidesContacts: 0
m_Enabled: 1
serializedVersion: 3
m_Size: {x: 1, y: 1, z: 1}
m_Center: {x: 0, y: 0, z: 0}
--- !u!23 &372773630649523697
MeshRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1519677033271140728}
m_Enabled: 1
m_CastShadows: 1
m_ReceiveShadows: 1
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RayTraceProcedural: 0
m_RayTracingAccelStructBuildFlagsOverride: 0
m_RayTracingAccelStructBuildFlags: 1
m_SmallMeshCulling: 1
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 1
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 3
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
m_AdditionalVertexStreams: {fileID: 0}
--- !u!114 &8492661302939191809
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1519677033271140728}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3}
m_Name:
m_EditorClassIdentifier:
GlobalObjectIdHash: 2463813328
InScenePlacedSourceGlobalObjectIdHash: 0
DeferredDespawnTick: 0
Ownership: 1
AlwaysReplicateAsRoot: 0
SynchronizeTransform: 1
ActiveSceneSynchronization: 0
SceneMigrationSynchronization: 1
SpawnWithObservers: 1
DontDestroyWithOwner: 0
AutoObjectParentSync: 1
SyncOwnerTransformWhenParented: 1
AllowOwnerToParent: 0
--- !u!114 &1797797386874341640
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1519677033271140728}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: da52bf8bbc1de48cfb221a6ff30f7972, type: 3}
m_Name:
m_EditorClassIdentifier:
ShowTopMostFoldoutHeaderGroup: 1
NetworkTransformExpanded: 0
AutoOwnerAuthorityTickOffset: 1
PositionInterpolationType: 0
RotationInterpolationType: 0
ScaleInterpolationType: 0
PositionLerpSmoothing: 1
PositionMaxInterpolationTime: 0.1
RotationLerpSmoothing: 1
RotationMaxInterpolationTime: 0.1
ScaleLerpSmoothing: 1
ScaleMaxInterpolationTime: 0.1
AuthorityMode: 0
TickSyncChildren: 0
UseUnreliableDeltas: 0
SyncPositionX: 1
SyncPositionY: 1
SyncPositionZ: 1
SyncRotAngleX: 1
SyncRotAngleY: 1
SyncRotAngleZ: 1
SyncScaleX: 1
SyncScaleY: 1
SyncScaleZ: 1
PositionThreshold: 0.001
RotAngleThreshold: 0.01
ScaleThreshold: 0.01
UseQuaternionSynchronization: 0
UseQuaternionCompression: 0
UseHalfFloatPrecision: 0
InLocalSpace: 0
SwitchTransformSpaceWhenParented: 0
Interpolate: 1
SlerpPosition: 0
--- !u!114 &1461172833347540472
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1519677033271140728}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 7f3c2a1b9e4d5f6081728394a5b6c7d8, type: 3}
m_Name:
m_EditorClassIdentifier:
ShowTopMostFoldoutHeaderGroup: 1
Speed: 5
RecordToggleKey: 114
PlayKey: 112
StopPlaybackKey: 27
LoopPlayback: 0
--- !u!114 &5128342895877821525
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1519677033271140728}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: ac35373b42abe46ea8f7cab1a1c353f0, type: 3}
m_Name:
m_EditorClassIdentifier:
ShowTopMostFoldoutHeaderGroup: 1
@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: efc3d9a93ac68a94f94fb22a9f9d8ab8
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: fb95e462cba2c0d41b38f2398eea7e2d
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,212 @@
using System.Collections;
using System.Collections.Generic;
using Unity.Netcode;
using UnityEngine;
#if ENABLE_INPUT_SYSTEM
using UnityEngine.InputSystem;
#endif
namespace Learning.UnityNGO
{
/// <summary>
/// Player controller with per-frame position recording and playback.
/// Attach to the player prefab instead of ClientAuthoritativeMovement.
/// </summary>
public class PlayerRecordingController : NetworkBehaviour
{
public enum Mode
{
Control,
Recording,
Playback
}
[Header("Movement")]
public float Speed = 5f;
[Header("Recording")]
public KeyCode RecordToggleKey = KeyCode.R;
public KeyCode PlayKey = KeyCode.P;
public KeyCode StopPlaybackKey = KeyCode.Escape;
public bool LoopPlayback;
readonly List<Vector3> m_RecordedPositions = new();
int m_PlaybackFrameIndex;
Mode m_Mode = Mode.Control;
public Mode CurrentMode => m_Mode;
public int RecordedFrameCount => m_RecordedPositions.Count;
public bool HasRecording => m_RecordedPositions.Count > 0;
void Update()
{
if (!IsOwner || !IsSpawned)
return;
HandleInput();
if (m_Mode == Mode.Control || m_Mode == Mode.Recording)
ApplyMovement();
else if (m_Mode == Mode.Playback)
AdvancePlayback();
}
void LateUpdate()
{
if (!IsOwner || !IsSpawned || m_Mode != Mode.Recording)
return;
m_RecordedPositions.Add(transform.position);
}
void HandleInput()
{
if (WasKeyPressed(RecordToggleKey))
{
if (m_Mode == Mode.Recording)
StopRecording();
else if (m_Mode == Mode.Control)
StartRecording();
}
if (WasKeyPressed(PlayKey) && m_Mode == Mode.Control && HasRecording)
StartPlayback();
if (WasKeyPressed(StopPlaybackKey) && m_Mode == Mode.Playback)
StopPlayback();
}
void ApplyMovement()
{
var delta = Speed * Time.deltaTime;
if (IsKeyHeld(KeyCode.A))
transform.position += Vector3.left * delta;
else if (IsKeyHeld(KeyCode.D))
transform.position += Vector3.right * delta;
else if (IsKeyHeld(KeyCode.W))
transform.position += Vector3.forward * delta;
else if (IsKeyHeld(KeyCode.S))
transform.position += Vector3.back * delta;
}
private IEnumerator TestCoroutine()
{
yield return new WaitForSeconds(2f);
Debug.Log("TestCoroutine");
}
void AdvancePlayback()
{
if (!HasRecording)
{
StopPlayback();
return;
}
transform.position = m_RecordedPositions[m_PlaybackFrameIndex];
m_PlaybackFrameIndex++;
if (m_PlaybackFrameIndex < m_RecordedPositions.Count)
return;
if (LoopPlayback)
{
m_PlaybackFrameIndex = 0;
return;
}
StopPlayback();
}
public void StartRecording()
{
if (m_Mode == Mode.Playback)
return;
m_RecordedPositions.Clear();
m_Mode = Mode.Recording;
Debug.Log("[PlayerRecording] Recording started.");
}
public void StopRecording()
{
if (m_Mode != Mode.Recording)
return;
m_Mode = Mode.Control;
Debug.Log($"[PlayerRecording] Recording stopped. Frames: {m_RecordedPositions.Count}");
}
public void StartPlayback()
{
if (!HasRecording || m_Mode == Mode.Recording)
return;
m_Mode = Mode.Playback;
m_PlaybackFrameIndex = 0;
transform.position = m_RecordedPositions[0];
Debug.Log($"[PlayerRecording] Playback started. Frames: {m_RecordedPositions.Count}");
}
public void StopPlayback()
{
if (m_Mode != Mode.Playback)
return;
m_Mode = Mode.Control;
m_PlaybackFrameIndex = 0;
Debug.Log("[PlayerRecording] Playback stopped.");
}
public void ClearRecording()
{
if (m_Mode == Mode.Playback)
StopPlayback();
m_RecordedPositions.Clear();
Debug.Log("[PlayerRecording] Recording cleared.");
}
static bool IsKeyHeld(KeyCode keyCode)
{
#if ENABLE_INPUT_SYSTEM
if (Keyboard.current == null)
return false;
return keyCode switch
{
KeyCode.W => Keyboard.current.wKey.isPressed,
KeyCode.A => Keyboard.current.aKey.isPressed,
KeyCode.S => Keyboard.current.sKey.isPressed,
KeyCode.D => Keyboard.current.dKey.isPressed,
_ => Input.GetKey(keyCode)
};
#else
return Input.GetKey(keyCode);
#endif
}
static bool WasKeyPressed(KeyCode keyCode)
{
#if ENABLE_INPUT_SYSTEM
if (Keyboard.current == null)
return false;
return keyCode switch
{
KeyCode.W => Keyboard.current.wKey.wasPressedThisFrame,
KeyCode.A => Keyboard.current.aKey.wasPressedThisFrame,
KeyCode.S => Keyboard.current.sKey.wasPressedThisFrame,
KeyCode.D => Keyboard.current.dKey.wasPressedThisFrame,
KeyCode.R => Keyboard.current.rKey.wasPressedThisFrame,
KeyCode.P => Keyboard.current.pKey.wasPressedThisFrame,
KeyCode.Escape => Keyboard.current.escapeKey.wasPressedThisFrame,
_ => Input.GetKeyDown(keyCode)
};
#else
return Input.GetKeyDown(keyCode);
#endif
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 7f3c2a1b9e4d5f6081728394a5b6c7d8
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: