MIF_E31222398/Assets/Script/ControllerButton.cs

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;
}
}