using UnityEngine; namespace DoomBreakers { public class PlayerMove : BaseState, IPlayerMove { private Transform _transform; private bool _ignoreFlipLogicFlag; private GameObject timerObj; private const string _animNameStr = "Run"; private const string _animNameStr2 = "Swim"; private bool _isWater; public PlayerMove(StateMachine s, Vector3 v, Transform t, ref IPlayerSprite playerSprite) : base(velocity: v)//=> _stateMachine = s; { //Declaring new keyword Constructor isn't allowed in Unity and causes issues. //We use Setup() instead and Object Pool the states. } public void Setup(StateMachine s, Vector3 v, Transform t, ref IPlayerSprite playerSprite, bool isWater) //: base(velocity: v)//=> _stateMachine = s; { base.BaseSetup(v); _stateMachine = s; _velocity = v; //We want to carry this on between states. _transform = t; timerObj = new GameObject(); timerObj.AddComponent(); _behaviourTimer = timerObj.GetComponent(); _behaviourTimer.StartTimer(1.0f); _ignoreFlipLogicFlag = false; //Ensure we don't execute the sprite flip logic if previous state was climbing. The climb animation looks off due to this. if (_stateMachine.GetState() != null) { if (_stateMachine.GetState().GetType() == typeof(PlayerClimb)) _ignoreFlipLogicFlag = true; } _isWater = isWater; if (_isWater) { _moveSpeed -= _moveSpeed / 8; _sprintSpeed -= _sprintSpeed / 8; //_maxJumpVelocity = _maxJumpVelocity / 2; } //print("\nPlayerMove()!"); ObjectPooler._instance.InstantiateForPlayer(PrefabID.Prefab_RunningDustFX, _transform, 0, -playerSprite.GetSpriteDirection()); } public override void IsMoving(ref Animator animator, ref Vector2 input, ref IPlayerSprite playerSprite, ref PlayerCollision playerCollider) { _isWater = playerCollider.IsWaterCollisionEnabled(); //print("\n_isWater=" + _isWater); if (!_isWater) animator.Play(_animNameStr);//, 0, 0.0f); if (_isWater) animator.Play(_animNameStr2);//, 0, 0.0f); _velocity.x = (input.x * (_moveSpeed * _sprintSpeed)); if (_isWater) _velocity.y = (input.y * (_moveSpeed * _sprintSpeed))/2; //if (!_isWater) _velocity.y = 0; if (LevelEventManager.IsEndOfLevel()) _velocity.x = 1.5f; _behaviourTimer.StartTimer(1.0f); if (_behaviourTimer.HasTimerFinished()) ObjectPooler._instance.InstantiateForPlayer(PrefabID.Prefab_RunningDustFX, _transform, 0, playerSprite.GetSpriteDirection()); DetectFaceDirection(ref playerSprite, ref playerCollider); if (Mathf.Abs(_velocity.y) >= 3.0f && !_isWater) _stateMachine.SetState(PlayerStatePool._instance.GetPlayerFallObjState(_stateMachine, _velocity, null, ref playerSprite, _isWater, false));// new PlayerFall(_stateMachine, _velocity, _transform, ref playerSprite)); //base.UpdateBehaviour(); } private void DetectFaceDirection(ref IPlayerSprite playerSprite, ref PlayerCollision playerCollider) { if (_ignoreFlipLogicFlag) return; if (_velocity.x < 0f) { if (playerSprite.GetSpriteDirection() == 1)//Guard clause,only flip once. { playerSprite.FlipSprite(); playerCollider.FlipAttackPoints(-1); } return; } if (_velocity.x > 0f) { if (playerSprite.GetSpriteDirection() == -1) { playerSprite.FlipSprite(); playerCollider.FlipAttackPoints(1); } return; } } } }