mirror of
https://github.com/tym1116/BH3.git
synced 2025-12-12 22:44:35 +01:00
190 lines
5.7 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|