siski
This commit is contained in:
1 parent
6f777ba8a3
commit
2cca6d8ffb
3 files changed
+30
-6
No files matched your search
@@ -48,6 +48,8 @@ namespace Code.Configs
|
|||||||
wallRunAcceleration = 25f,
|
wallRunAcceleration = 25f,
|
||||||
wallRunGravityScale = 0.25f,
|
wallRunGravityScale = 0.25f,
|
||||||
wallDetachImpulse = 7f,
|
wallDetachImpulse = 7f,
|
||||||
wallContactAngleThreshold = 45f;
|
wallContactAngleThreshold = 45f,
|
||||||
|
minLookWithNormal = 30f,
|
||||||
|
maxLookWithNormal = 60f;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+23
-3
@@ -22,6 +22,11 @@ namespace Code.Gameplay.Character.Controller.Abilities
|
|||||||
|
|
||||||
private float _surfaceAngleCos;
|
private float _surfaceAngleCos;
|
||||||
private bool _canWallRun;
|
private bool _canWallRun;
|
||||||
|
|
||||||
|
private readonly float _minLookAngleToWallPlane;
|
||||||
|
private readonly float _maxLookAngleToWallPlane;
|
||||||
|
private float _minLookDotWithNormal;
|
||||||
|
private float _maxLookDotWithNormal;
|
||||||
|
|
||||||
private KinematicCharacterMotor _motor;
|
private KinematicCharacterMotor _motor;
|
||||||
|
|
||||||
@@ -33,7 +38,9 @@ namespace Code.Gameplay.Character.Controller.Abilities
|
|||||||
float wallRunAcceleration,
|
float wallRunAcceleration,
|
||||||
float wallRunGravityScale,
|
float wallRunGravityScale,
|
||||||
float wallDetachImpulse,
|
float wallDetachImpulse,
|
||||||
float wallContactAngleThreshold)
|
float wallContactAngleThreshold,
|
||||||
|
float minLookAngleToWallPlane,
|
||||||
|
float maxLookAngleToWallPlane)
|
||||||
{
|
{
|
||||||
_maxWallRunTime = maxWallRunTime;
|
_maxWallRunTime = maxWallRunTime;
|
||||||
_wallRunSpeed = wallRunSpeed;
|
_wallRunSpeed = wallRunSpeed;
|
||||||
@@ -41,12 +48,20 @@ namespace Code.Gameplay.Character.Controller.Abilities
|
|||||||
_wallRunGravityScale = wallRunGravityScale;
|
_wallRunGravityScale = wallRunGravityScale;
|
||||||
_wallDetachImpulse = wallDetachImpulse;
|
_wallDetachImpulse = wallDetachImpulse;
|
||||||
_wallContactAngleThreshold = wallContactAngleThreshold;
|
_wallContactAngleThreshold = wallContactAngleThreshold;
|
||||||
|
_minLookAngleToWallPlane = Mathf.Clamp(minLookAngleToWallPlane, 0f, 90f);
|
||||||
|
_maxLookAngleToWallPlane = Mathf.Clamp(maxLookAngleToWallPlane, 0f, 90f);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Initialize(KinematicCharacterMotor motor)
|
public void Initialize(KinematicCharacterMotor motor)
|
||||||
{
|
{
|
||||||
_motor = motor;
|
_motor = motor;
|
||||||
_surfaceAngleCos = Mathf.Cos(Mathf.Deg2Rad * _wallContactAngleThreshold);
|
_surfaceAngleCos = Mathf.Cos(Mathf.Deg2Rad * _wallContactAngleThreshold);
|
||||||
|
|
||||||
|
var minAngleWithNormal = 90f - _maxLookAngleToWallPlane;
|
||||||
|
var maxAngleWithNormal = 90f - _minLookAngleToWallPlane;
|
||||||
|
|
||||||
|
_maxLookDotWithNormal = Mathf.Cos(Mathf.Deg2Rad * minAngleWithNormal);
|
||||||
|
_minLookDotWithNormal = Mathf.Cos(Mathf.Deg2Rad * maxAngleWithNormal);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Tick(float deltaTime)
|
public void Tick(float deltaTime)
|
||||||
@@ -60,13 +75,12 @@ namespace Code.Gameplay.Character.Controller.Abilities
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool TryStartWallRun(Vector3 hitNormal, Vector3 hitPoint)
|
public bool TryStartWallRun(Vector3 hitNormal, Vector3 hitPoint, Vector3 lookDirection)
|
||||||
{
|
{
|
||||||
if (IsWallRunning) return false;
|
if (IsWallRunning) return false;
|
||||||
|
|
||||||
var dotWithUp = Vector3.Dot(hitNormal, _motor.CharacterUp);
|
var dotWithUp = Vector3.Dot(hitNormal, _motor.CharacterUp);
|
||||||
var isWall = Mathf.Abs(dotWithUp) < _surfaceAngleCos;
|
var isWall = Mathf.Abs(dotWithUp) < _surfaceAngleCos;
|
||||||
|
|
||||||
if (!isWall) return false;
|
if (!isWall) return false;
|
||||||
|
|
||||||
if (_motor.GroundingStatus.IsStableOnGround) return false;
|
if (_motor.GroundingStatus.IsStableOnGround) return false;
|
||||||
@@ -74,6 +88,12 @@ namespace Code.Gameplay.Character.Controller.Abilities
|
|||||||
var velocityIntoWall = Vector3.Dot(_motor.Velocity, -hitNormal);
|
var velocityIntoWall = Vector3.Dot(_motor.Velocity, -hitNormal);
|
||||||
if (velocityIntoWall < 1f) return false;
|
if (velocityIntoWall < 1f) return false;
|
||||||
|
|
||||||
|
var lookDirNormalized = lookDirection.normalized;
|
||||||
|
var dotWithNormal = Vector3.Dot(lookDirNormalized, hitNormal);
|
||||||
|
|
||||||
|
if (Mathf.Abs(dotWithNormal) < _minLookDotWithNormal || Mathf.Abs(dotWithNormal) > _maxLookDotWithNormal)
|
||||||
|
return false;
|
||||||
|
|
||||||
StartWallRun(hitNormal, hitPoint);
|
StartWallRun(hitNormal, hitPoint);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-2
@@ -88,7 +88,9 @@ namespace Code.Gameplay.Character.Controller
|
|||||||
_characterConfig.wallRunAcceleration,
|
_characterConfig.wallRunAcceleration,
|
||||||
_characterConfig.wallRunGravityScale,
|
_characterConfig.wallRunGravityScale,
|
||||||
_characterConfig.wallDetachImpulse,
|
_characterConfig.wallDetachImpulse,
|
||||||
_characterConfig.wallContactAngleThreshold
|
_characterConfig.wallContactAngleThreshold,
|
||||||
|
_characterConfig.minLookWithNormal,
|
||||||
|
_characterConfig.maxLookWithNormal
|
||||||
);
|
);
|
||||||
_wallLeanMechanic = new WallLeanMechanic(
|
_wallLeanMechanic = new WallLeanMechanic(
|
||||||
_characterConfig.leanAngle,
|
_characterConfig.leanAngle,
|
||||||
@@ -422,7 +424,7 @@ namespace Code.Gameplay.Character.Controller
|
|||||||
public void OnMovementHit(Collider hitCollider, Vector3 hitNormal, Vector3 hitPoint,
|
public void OnMovementHit(Collider hitCollider, Vector3 hitNormal, Vector3 hitPoint,
|
||||||
ref HitStabilityReport hitStabilityReport)
|
ref HitStabilityReport hitStabilityReport)
|
||||||
{
|
{
|
||||||
if (_wallRunningMechanic.TryStartWallRun(hitNormal, hitPoint)) return;
|
if (_wallRunningMechanic.TryStartWallRun(hitNormal, hitPoint, motor.CharacterForward)) return;
|
||||||
|
|
||||||
var horizontalVelocity = Vector3.ProjectOnPlane(motor.Velocity, motor.CharacterUp).normalized;
|
var horizontalVelocity = Vector3.ProjectOnPlane(motor.Velocity, motor.CharacterUp).normalized;
|
||||||
var velocitySqrMag = horizontalVelocity.sqrMagnitude;
|
var velocitySqrMag = horizontalVelocity.sqrMagnitude;
|
||||||
|
|||||||
Reference in new issue
Block a user