Files
BH3/Assets/Scripts/Assembly-CSharp/MoleMole/BaseSingleStepParser.cs
2025-08-13 09:26:42 +08:00

190 lines
5.7 KiB
C#

using UnityEngine;
namespace MoleMole
{
public class BaseSingleStepParser
{
private BaseStepController controler;
private Transform anchor;
private BaseStepController.Param _currentParam;
private Vector3 _lastPosition;
private Vector3 _lastForward;
private float _lastEventTimer;
public bool hasUpdatedThisFrame;
public BaseStepController.Param param
{
get
{
return _currentParam;
}
}
public BaseSingleStepParser(BaseStepController controler, Transform anchor)
{
this.controler = controler;
this.anchor = anchor;
_currentParam = default(BaseStepController.Param);
_lastPosition = anchor.position;
_lastForward = anchor.forward;
_lastEventTimer = 0f;
}
public virtual BaseStepController.Param Parse()
{
hasUpdatedThisFrame = false;
_lastEventTimer += Time.deltaTime;
Matrix4x4 worldToCameraMatrix = Camera.main.worldToCameraMatrix;
Matrix4x4 worldToCameraMatrix2 = Camera.main.worldToCameraMatrix;
Vector3 vector = Vector3.zero;
Vector3 vector2 = Vector3.zero;
Vector3 vector3 = Vector3.zero;
if (Time.deltaTime > 0f)
{
vector = (anchor.position - _lastPosition) / Time.deltaTime;
Vector3 vector4 = worldToCameraMatrix.MultiplyPoint(anchor.position);
Vector3 vector5 = worldToCameraMatrix.MultiplyPoint(_lastPosition);
vector2 = (vector4 - vector5) / Time.deltaTime;
vector3 = worldToCameraMatrix2.MultiplyVector(vector2);
vector3.y = 0f;
}
if (_lastEventTimer > controler.spanBetweenEvents)
{
BaseStepController.Param currentParam = default(BaseStepController.Param);
Vector3 velocityXZ = vector;
velocityXZ.y = 0f;
float anglularSpeed = 0f;
if (Time.deltaTime > 0f)
{
anglularSpeed = Vector3.Angle(_lastForward, anchor.forward) / Time.deltaTime;
}
if (anchor.position.y < controler.contactThickness)
{
if (_currentParam.pattern == BaseStepController.Pattern.Static || _currentParam.pattern == BaseStepController.Pattern.Void)
{
if (velocityXZ.magnitude > controler.horizontalSpeedThreshold)
{
currentParam.pattern = BaseStepController.Pattern.Slide;
}
else if (vector.y > controler.verticleSpeedThreshold)
{
currentParam.pattern = BaseStepController.Pattern.Up;
}
else
{
currentParam.pattern = BaseStepController.Pattern.Static;
}
}
else if (_currentParam.pattern == BaseStepController.Pattern.Slide)
{
if (velocityXZ.magnitude < controler.staticSpeedThreshold)
{
currentParam.pattern = BaseStepController.Pattern.Static;
}
else
{
currentParam.pattern = BaseStepController.Pattern.Slide;
}
}
else if (_currentParam.pattern == BaseStepController.Pattern.Up)
{
if (vector.y < controler.staticSpeedThreshold)
{
currentParam.pattern = BaseStepController.Pattern.Down;
}
else
{
currentParam.pattern = BaseStepController.Pattern.Up;
}
}
else if (_currentParam.pattern == BaseStepController.Pattern.Down)
{
if (vector.y > controler.verticleSpeedThreshold)
{
currentParam.pattern = BaseStepController.Pattern.Up;
}
else if (vector.y > 0f - controler.staticSpeedThreshold)
{
currentParam.pattern = BaseStepController.Pattern.Static;
}
else
{
currentParam.pattern = BaseStepController.Pattern.Down;
}
}
}
else if (_currentParam.pattern == BaseStepController.Pattern.Static || _currentParam.pattern == BaseStepController.Pattern.Void)
{
if (vector.y > controler.verticleSpeedThreshold)
{
currentParam.pattern = BaseStepController.Pattern.Up;
}
else
{
currentParam.pattern = BaseStepController.Pattern.Static;
}
}
else if (_currentParam.pattern == BaseStepController.Pattern.Slide)
{
currentParam.pattern = BaseStepController.Pattern.Up;
}
else if (_currentParam.pattern == BaseStepController.Pattern.Up)
{
if (vector.y < 0f - controler.verticleSpeedThreshold)
{
currentParam.pattern = BaseStepController.Pattern.Down;
}
else
{
currentParam.pattern = BaseStepController.Pattern.Up;
}
}
else if (_currentParam.pattern == BaseStepController.Pattern.Down)
{
if (vector.y > controler.verticleSpeedThreshold)
{
currentParam.pattern = BaseStepController.Pattern.Up;
}
else
{
currentParam.pattern = BaseStepController.Pattern.Down;
}
}
if (_currentParam.pattern != currentParam.pattern)
{
hasUpdatedThisFrame = true;
}
currentParam.position = anchor.position;
currentParam.velocityXZ = velocityXZ;
currentParam.velocityInCam = vector2;
float magnitude = _currentParam.velocityXZCorrectSmooth.magnitude;
if (Vector3.Dot(_currentParam.velocityXZCorrectSmooth, vector3) > 0f)
{
float num = Mathf.Min(controler.vectorSmoothFactor, magnitude * 2f / (magnitude + vector3.magnitude));
currentParam.velocityXZCorrectSmooth = _currentParam.velocityXZCorrectSmooth * num + vector3 * (1f - num);
}
else
{
currentParam.velocityXZCorrectSmooth = vector3;
}
float magnitude2 = _currentParam.velocityInCamSmooth.magnitude;
float num2 = Mathf.Min(controler.vectorSmoothFactor, magnitude2 * 2f / (magnitude2 + vector2.magnitude));
currentParam.velocityInCamSmooth = _currentParam.velocityInCamSmooth * num2 + vector2 * (1f - num2);
currentParam.anglularSpeed = anglularSpeed;
currentParam.toeForwardXZ = -anchor.right;
currentParam.toeForwardXZ.y = 0f;
_currentParam = currentParam;
}
_lastPosition = anchor.position;
_lastForward = anchor.forward;
return _currentParam;
}
}
}