88 lines
2.2 KiB
C#
88 lines
2.2 KiB
C#
using UnityEngine;
|
|
|
|
public class PlayerController : 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;
|
|
|
|
void Start()
|
|
{
|
|
_body = GetComponent<Rigidbody2D>();
|
|
_boxCollider= GetComponent<BoxCollider2D>();
|
|
}
|
|
void Update()
|
|
{
|
|
float moveX = 0;
|
|
float moveY = 0;
|
|
|
|
var groundCheck = Physics2D.BoxCast(_boxCollider.bounds.center,_boxCollider.bounds.size,0f, Vector2.down, .1f,groundLayer);
|
|
|
|
if (groundCheck || _isOnLadder)
|
|
{
|
|
|
|
|
|
_isFall =false;
|
|
moveX = Input.GetAxisRaw("Horizontal");
|
|
animator.SetFloat("Horizontal", moveX);
|
|
|
|
if (IsLadder(Vector2.down))
|
|
{
|
|
_isOnLadder = true;
|
|
moveY = Input.GetAxisRaw("Vertical");
|
|
if(moveY> 0)
|
|
{
|
|
if (!IsLadder(Vector2.up))
|
|
{
|
|
moveY = 0;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
_isOnLadder = false;
|
|
}
|
|
_body.velocity = new Vector2(moveX * MovementSpeed, moveY * MovementSpeed);
|
|
}
|
|
else
|
|
{
|
|
_isFall = true;
|
|
print("Falling");
|
|
}
|
|
}
|
|
|
|
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)
|
|
{
|
|
_body.velocity = new Vector2(0, _body.velocity.y);
|
|
animator.SetFloat("Horizontal", 0);
|
|
}
|
|
}
|
|
}
|