163 lines
3.6 KiB
C#
163 lines
3.6 KiB
C#
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<Rigidbody2D>();
|
|
animator = GetComponent<Animator>();
|
|
touchingDirection = GetComponent<TouchingDirection>();
|
|
damageable = GetComponent<Damageable>();
|
|
}
|
|
|
|
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<Vector2>();
|
|
|
|
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;
|
|
}
|
|
}
|