Toggle player rigidbody on safe zone instead of zone's collider

This commit is contained in:
Jason Durand 01 2022-04-02 05:38:55 -04:00
parent b275bcc1db
commit 0fa139faca
4 changed files with 23 additions and 8 deletions

View File

@ -209,7 +209,7 @@ CircleCollider2D:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 9196727423716235681}
m_Enabled: 0
m_Enabled: 1
m_Density: 1
m_Material: {fileID: 0}
m_IsTrigger: 0

View File

@ -239,7 +239,7 @@ Rigidbody2D:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1214567908930553593}
m_BodyType: 0
m_BodyType: 1
m_Simulated: 1
m_UseFullKinematicContacts: 0
m_UseAutoMass: 0

View File

@ -15,6 +15,13 @@ public class PlayerMovement : MonoBehaviour {
void Awake() => rb = GetComponent<Rigidbody2D>();
void Start() => currentState.EnterState(this);
void Update() {
if (currentState.UpdateState(this) is {} newState)
SwitchState(newState);
}
void FixedUpdate() {
if (currentState.FixedUpdateState(this) is {} newState)
SwitchState(newState);
@ -69,6 +76,12 @@ public class PlayerMovement : MonoBehaviour {
safeZone = null;
}
void SetRigidbodyEnabled(bool enabled) {
rb.velocity = Vector2.zero;
rb.angularVelocity = 0f;
rb.isKinematic = !enabled;
}
class BaseState {
public virtual void EnterState(PlayerMovement playerMovement) {}
@ -104,8 +117,6 @@ public class PlayerMovement : MonoBehaviour {
public override void EnterState(PlayerMovement playerMovement) {
startPosition = playerMovement.transform.position;
startTime = Time.time;
playerMovement.rb.velocity = Vector2.zero;
}
public override BaseState? FixedUpdateState(PlayerMovement playerMovement) {
@ -136,7 +147,7 @@ public class PlayerMovement : MonoBehaviour {
base.EnterState(playerMovement);
safeZone.EnterSafeZone();
playerMovement.rb.velocity = Vector2.zero;
playerMovement.SetRigidbodyEnabled(false);
}
protected override BaseState Transition() => new ImmobileMovementState();
@ -154,13 +165,19 @@ public class PlayerMovement : MonoBehaviour {
base.EnterState(playerMovement);
safeZone.ExitSafeZone();
playerMovement.rb.velocity = Vector2.zero;
playerMovement.SetRigidbodyEnabled(true);
}
protected override float ModifyLerpTime(float t) => safeZone.stats.JumpSpeedCurve.Evaluate(t);
}
class ImmobileMovementState : BaseState {
public override void EnterState(PlayerMovement playerMovement) {
base.EnterState(playerMovement);
if (!playerMovement.rb.isKinematic)
Debug.LogWarning("Rigidbody should probably be kinematic when immobile (when in safe zone).");
}
#if UNITY_EDITOR
public override void OnDrawGizmos(PlayerMovement playerMovement) {
if (playerMovement.safeZone is null)

View File

@ -11,12 +11,10 @@ public class SafeZone : MonoBehaviour {
}
public void EnterSafeZone() {
moatCollider.enabled = false;
IsInSafeZone = true;
}
public void ExitSafeZone() {
moatCollider.enabled = true;
IsInSafeZone = false;
}