using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.InputSystem; [RequireComponent(typeof(Rigidbody2D), typeof(TouchingDirection), typeof(Damageable))] public class ControllerButton : MonoBehaviour, IDataPresistence { public float walkSpeed = 5f; public float jumpImpulse = 10f; Vector2 moveInput; TouchingDirection touchingDirection; Damageable damageable; int attackCount; Rigidbody2D rb; [SerializeField] private bool _isMoving = false; public bool IsMoving { get { return _isMoving; } private set { _isMoving = value; animator.SetBool(AnimationStrings.isMoving, value); } } public bool _isFacingRight = true; public bool IsFacingRight { get { return _isFacingRight; } private set { if (_isFacingRight != value) { transform.localScale *= new Vector2(-1, 1); } _isFacingRight = value; } } public bool CanMove { get { return animator.GetBool(AnimationStrings.canMove); } } public bool IsAlive { get { return animator.GetBool(AnimationStrings.isAlive); } } Animator animator; private void Awake() { rb = GetComponent(); animator = GetComponent(); touchingDirection = GetComponent(); damageable = GetComponent(); } private void FixedUpdate() { if (!damageable.LockVelocity) { rb.velocity = new Vector2(moveInput.x * walkSpeed, rb.velocity.y); } if (CanMove) { if (!touchingDirection.IsOnWall) { rb.velocity = new Vector2(moveInput.x * walkSpeed, rb.velocity.y); } else { rb.velocity = new Vector2(0, rb.velocity.y); } } else { rb.velocity = new Vector2(0, rb.velocity.y); } } public void OnMove(InputAction.CallbackContext context) { moveInput = context.ReadValue(); if (IsAlive) { IsMoving = moveInput != Vector2.zero; SetFacingDirections(moveInput); } else { IsMoving = false; } } private void SetFacingDirections(Vector2 moveInput) { if (moveInput.x > 0 && !IsFacingRight) { // face right IsFacingRight = true; } else if (moveInput.x < 0 && IsFacingRight) { // face left IsFacingRight = false; } } public void OnJump(InputAction.CallbackContext context) { // TODO Check if alive if (context.started && touchingDirection.IsGrounded && CanMove) { rb.velocity = new Vector2(rb.velocity.x, jumpImpulse); } } public void OnAttack(InputAction.CallbackContext context) { if (context.started) { animator.SetTrigger(AnimationStrings.attackTrigger); attackCount++; } } public void OnHit(int damage, Vector2 knockback) { rb.velocity = new Vector2(knockback.x, rb.velocity.y + knockback.y); } public void LoadData(GameData data) { attackCount = data.attackCount; } public void SaveData(ref GameData data) { data.attackCount = attackCount; } }