Files
Gnome-s-Bounty/Assets/Scripts/Character.cs
T
2023-06-26 10:28:32 +03:00

112 lines
2.7 KiB
C#

using UnityEngine;
public class Character : MonoBehaviour
{
[SerializeField]
private Animator animator;
[SerializeField]
private float MovementSpeed = 1.5f;
[SerializeField]
private LayerMask ladderLayer;
[SerializeField]
private LayerMask groundLayer;
[SerializeField]
private float distance;
private bool _isOnLadder;
private Rigidbody2D _body;
private BoxCollider2D _boxCollider;
private bool _isFall;
private bool _facingRight = true;
private void Start()
{
_body = GetComponent<Rigidbody2D>();
_boxCollider = GetComponent<BoxCollider2D>();
}
protected void MoveTo(float inputHorizontal,float inputVertical)
{
var groundCheck = Physics2D.BoxCast(_boxCollider.bounds.center, _boxCollider.bounds.size, 0f, Vector2.down, .1f, groundLayer);
float v_movement=0;
if (groundCheck || _isOnLadder)
{
_isFall = false;
float h_movement = inputHorizontal;
if (h_movement > 0 && !_facingRight)
{
FlipCharacter();
}
if (h_movement < 0 && _facingRight)
{
FlipCharacter();
}
animator.SetBool("Walk", h_movement != 0);
if (IsLadder(Vector2.down))
{
_isOnLadder = true;
v_movement=inputVertical;
if (v_movement > 0)
{
if (!IsLadder(Vector2.up))
{
v_movement = 0;
}
}
}
else
{
_isOnLadder = false;
}
_body.velocity = new Vector2(h_movement * MovementSpeed, v_movement * MovementSpeed);
}
else
{
_isFall = true;
}
}
private RaycastHit2D IsLadder(Vector2 direction)
{
return Physics2D.BoxCast(_boxCollider.bounds.center, _boxCollider.bounds.size, 0f, direction, .1f, ladderLayer);
}
private void FixedUpdate()
{
if (_isOnLadder)
{
_body.gravityScale = 0;
}
else
{
_body.gravityScale = 1;
}
if (_isFall)
{
if (IsLadder(Vector2.down))
{
_isOnLadder = true;
}
_body.velocity = new Vector2(0, _body.velocity.y);
animator.SetBool("Walk", false);
}
}
private void FlipCharacter()
{
Vector3 currentScale = gameObject.transform.localScale;
currentScale.x *= -1;
gameObject.transform.localScale = currentScale;
_facingRight = !_facingRight;
}
}