Toggle player rigidbody on safe zone instead of zone's collider
This commit is contained in:
parent
b275bcc1db
commit
0fa139faca
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -11,12 +11,10 @@ public class SafeZone : MonoBehaviour {
|
||||
}
|
||||
|
||||
public void EnterSafeZone() {
|
||||
moatCollider.enabled = false;
|
||||
IsInSafeZone = true;
|
||||
}
|
||||
|
||||
public void ExitSafeZone() {
|
||||
moatCollider.enabled = true;
|
||||
IsInSafeZone = false;
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user