Added player replaying

This commit is contained in:
2026-01-15 22:40:41 +00:00
parent 8584126ebe
commit 1a75fdd1d4
9 changed files with 6697 additions and 106 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,6 @@
fileFormatVersion: 2
guid: df8306483d8e4d94e8c0548fd23da7fd
folderAsset: yes
DefaultImporter:
guid: 9fdaf51f33b85cc4eb9e54f6b3c12f6c
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:

View File

@@ -1,7 +1,19 @@
using System.Collections.Generic;
using UnityEngine;
namespace InterfaceOff.WorldScene
{
[System.Serializable] public struct PlayerFrameInfo
{
public Vector3 Position;
public Vector2 Rotation;
}
[System.Serializable] public struct PlayerFrameInfoArray
{
public PlayerFrameInfo[] FrameInfo;
}
public class DevPlayerController : MonoBehaviour
{
private CharacterController Controller;
@@ -10,6 +22,9 @@ namespace InterfaceOff.WorldScene
public Transform CameraPivot;
private float MousePitch;
private float MouseYaw = 90;
private List<PlayerFrameInfo> FrameInfo = new();
private void Awake()
{
@@ -19,13 +34,38 @@ namespace InterfaceOff.WorldScene
Cursor.visible = false;
}
private void OnDestroy()
{
PlayerFrameInfoArray arr = new()
{
FrameInfo = FrameInfo.ToArray()
};
string json = JsonUtility.ToJson(arr, prettyPrint: true);
System.IO.File.WriteAllText(Application.persistentDataPath + "/playerframe.json", json);
Debug.Log("Dumped");
}
private void FixedUpdate()
{
PlayerFrameInfo current = new()
{
Position = transform.position,
Rotation = new Vector2(MousePitch, MouseYaw)
};
FrameInfo.Add(current);
}
private void Update()
{
/* Player movement */
float mouseX = Input.GetAxisRaw("Mouse X") * CamSens * 100f * Time.deltaTime;
float mouseY = Input.GetAxisRaw("Mouse Y") * CamSens * 100f * Time.deltaTime;
transform.Rotate(Vector3.up * mouseX);
MouseYaw += mouseX;
transform.rotation = Quaternion.Euler(0f, MouseYaw, 0f);
MousePitch -= mouseY;
MousePitch = Mathf.Clamp(MousePitch, -85f, 85f);

View File

@@ -0,0 +1,39 @@
using System;
using System.IO;
using UnityEngine;
namespace InterfaceOff.WorldScene
{
public class PlayerController : MonoBehaviour
{
private static PlayerController Instance;
private PlayerFrameInfo[] Frames;
private int FrameIndex = 0;
private float LerpValue;
private void Awake()
{
string json = File.ReadAllText(Application.dataPath + "/Resources/playerframe.json");
Frames = JsonUtility.FromJson<PlayerFrameInfoArray>(json).FrameInfo;
}
private void FixedUpdate()
{
FrameIndex = (FrameIndex + 1) % (Frames.Length - 1);
}
private void Update()
{
LerpValue = (LerpValue + Time.deltaTime * 20f) % 1f;
PlayerFrameInfo frameA = Frames[FrameIndex + 0];
PlayerFrameInfo frameB = Frames[FrameIndex + 1];
transform.position = Vector3.Lerp(frameA.Position, frameB.Position, LerpValue);
Vector2 rotation = Vector2.Lerp(frameA.Rotation, frameB.Rotation, LerpValue);
transform.rotation = Quaternion.Euler(rotation.x, rotation.y, 0);
}
}
}

View File

@@ -1,58 +0,0 @@
Shader "Unlit/ScreenCutoutShader"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Tags{ "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" }
Lighting Off
Cull Back
ZWrite On
ZTest Less
Fog{ Mode Off }
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
//float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
float4 screenPos : TEXCOORD1;
};
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.screenPos = ComputeScreenPos(o.vertex);
return o;
}
sampler2D _MainTex;
fixed4 frag (v2f i) : SV_Target
{
i.screenPos /= i.screenPos.w;
fixed4 col = tex2D(_MainTex, float2(i.screenPos.x, i.screenPos.y));
return col;
}
ENDCG
}
}
}

View File

@@ -1,9 +0,0 @@
fileFormatVersion: 2
guid: 0a42b0980bf770241920f919faeb44e3
ShaderImporter:
externalObjects: {}
defaultTextures: []
nonModifiableTextures: []
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 57d3d2a9ac7b9104d91c175bc98946c7
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,27 +0,0 @@
using System;
using UnityEngine;
namespace InterfaceOff.WorldScene
{
public class PlayerController : MonoBehaviour
{
private static PlayerController Instance;
[field: SerializeField] private float PlayerSpeed { get; set; }
[field: SerializeField] private Transform[] LerpPositions;
private float LerpValue;
private void Update()
{
int section = Mathf.FloorToInt(LerpValue);
Vector3 a = LerpPositions[section + 0].position;
Vector3 b = LerpPositions[section + 1].position;
LerpValue += PlayerSpeed / Vector3.Distance(a, b) * Time.deltaTime;
LerpValue %= LerpPositions.Length - 1; // Makes lerp value wrap around
float sectionLerp = Math.Clamp(LerpValue, section, section + 1) - section;
transform.position = Vector3.Lerp(a, b, sectionLerp);
}
}
}