ПОЖАЛУЙСТА, ПОДОЖДИТЕ.
Идёт загрузка сайта...
Идёт загрузка сайта...


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CharacterControl : MonoBehaviour
{
public Rigidbody2D rb;
public Animator anim;
void Start()
{
rb = GetComponent<Rigidbody2D>();
anim = GetComponent<Animator>();
GroundCheckRadius = GroundCheck.GetComponent<CircleCollider2D>().radius;
}
void Update()
{
Reflect();
Jump();
Walk();
CheckingGround();
CheckingLadder();
LaddersMechanics();
LadderUpDown();
LADDERS();
CorrectLadder();
LadderJump();
}
public Vector2 moveVector;
public int speed = 3;
void Walk()
{
moveVector.x = Input.GetAxisRaw("Horizontal");
if (!onLadder && !blockMoveXforJump)
{
rb.velocity = new Vector2(moveVector.x * speed, rb.velocity.y);
}
anim.SetFloat("moveX", Mathf.Abs(moveVector.x));
}
// Отражение спрайтов
public bool faceRight = true;
void Reflect()
{
if (!blockMoveXforJump)
{
if ((moveVector.x > 0 && !faceRight) || (moveVector.x < 0 && faceRight))
{
Vector3 temp = transform.localScale;
temp.x *= -1;
transform.localScale = temp;
faceRight = !faceRight;
}
}
}
// Прыжок с земли
public int jumpForce = 10;
void Jump()
{
if (onGround && !onLadder)
{
if (Input.GetKeyDown(KeyCode.Space))
{
anim.StopPlayback();
anim.Play("jump");
rb.velocity = new Vector2(rb.velocity.x, jumpForce);
}
}
}
// Проверка земли
public bool onGround;
public LayerMask Ground;
public Transform GroundCheck;
private float GroundCheckRadius;
public float GCRadius = 0.2f;
void CheckingGround()
{
onGround = Physics2D.OverlapCircle(GroundCheck.position, GCRadius, Ground);
if ((rb.velocity.y != 0 && bottomCheckedLadder) || blockMoveXforJump)
{
anim.SetBool("onGround", false);
}
else { anim.SetBool("onGround", onGround); }
}
public float check_RADIUS = 0.04f;
private void OnDrawGizmos()
{
Gizmos.color = Color.cyan;
Gizmos.DrawSphere(CHECK_Ladder.position, check_RADIUS);
Gizmos.color = Color.blue;
Gizmos.DrawSphere(bottom_Ladder.position, check_RADIUS);
Gizmos.color = Color.gray;
Gizmos.DrawWireSphere(GroundCheck.position, GCRadius);
}
public Transform CHECK_Ladder;
public bool checkedLadder;
public LayerMask LadderMask;
public Transform bottom_Ladder;
public bool bottomCheckedLadder;
void CheckingLadder()
{
checkedLadder = Physics2D.OverlapPoint(CHECK_Ladder.position, LadderMask);
bottomCheckedLadder = Physics2D.OverlapPoint(bottom_Ladder.position, LadderMask);
}
public float ladderSpeed = 1.5f;
void LaddersMechanics()
{
if (onLadder)
{
rb.bodyType = RigidbodyType2D.Kinematic;
rb.velocity = new Vector2(rb.velocity.x, moveVector.y * ladderSpeed);
}
else { rb.bodyType = RigidbodyType2D.Dynamic; }
}
void LadderUpDown()
{
moveVector.y = Input.GetAxisRaw("Vertical");
anim.SetFloat("moveY", moveVector.y);
anim.SetInteger("upDown", (int)moveVector.y);
}
float vertInput;
public bool onLadder;
void LADDERS()
{
vertInput = Input.GetAxisRaw("Vertical");
if (checkedLadder || bottomCheckedLadder)
{
if (!checkedLadder && bottomCheckedLadder) // ПЕРС СВЕРХУ
{
if (vertInput > 0) { onLadder = false; anim.Play("idle"); }
else if (vertInput < 0) { onLadder = true; }
}
else if (checkedLadder && bottomCheckedLadder) // НА ЛЕСТНИЦЕ
{
if (vertInput > 0) { onLadder = true; }
else if (vertInput < 0) { onLadder = true; }
}
else if (checkedLadder && !bottomCheckedLadder) // ПЕРС СНИЗУ
{
if (vertInput > 0) { onLadder = true; }
else if (vertInput < 0) { onLadder = false; }
}
}
else { onLadder = false; } // ВНЕ ЛЕСТНИЦЫ
LaddersMechanics();
anim.SetBool("onLadder", onLadder);
}
bool corrected = true;
void CorrectLadder()
{
if (onLadder && corrected) { corrected = !corrected; rb.velocity = Vector2.zero; LadderCenter(); }
else if (!onLadder && !corrected) { corrected = true; }
}
float ladderCenter;
void LadderCenter()
{
if (checkedLadder)
{
ladderCenter =
Physics2D.OverlapPoint
(
CHECK_Ladder.position,
LadderMask
).GetComponent<BoxCollider2D> ().bounds.center.x;
}
else if (bottomCheckedLadder)
{
ladderCenter =
Physics2D.OverlapPoint
(
bottom_Ladder.position,
LadderMask
).GetComponent<BoxCollider2D>().bounds.center.x;
}
transform.position = new Vector2(ladderCenter, transform.position.y);
}
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.tag == "LadderStairs")
{
Physics2D.IgnoreCollision
(
collision.GetComponent<EdgeCollider2D>(),
GetComponent<CapsuleCollider2D>(),
True
);
}
}
private void OnTriggerExit2D(Collider2D collision)
{
if (collision.tag == "LadderStairs")
{
Physics2D.IgnoreCollision
(
collision.GetComponent<EdgeCollider2D>(),
GetComponent<CapsuleCollider2D>(),
False
);
}
}
private bool blockMoveXforJump;
public float jumpLadderTime = 0.5f;
private float timerJumpLadder;
public Vector2 jumpAngle = new Vector2(3.5f, 5);
void LadderJump()
{
if (onLadder && Mathf.Abs(moveVector.x) > 0 && Input.GetKeyDown(KeyCode.Space) && rb.velocity.y == 0)
{
blockMoveXforJump = true;
moveVector.x = 0;
onLadder = false; ////////////////////////////// Очень важно для корректной анимации!
anim.StopPlayback();
anim.Play("jump");
LaddersMechanics();
rb.velocity = new Vector2(0, 0);
rb.velocity = new Vector2(transform.localScale.x * jumpAngle.x, jumpAngle.y);
}
else if (onLadder && Input.GetKeyDown(KeyCode.Space) && rb.velocity.y == 0) { onLadder = false; }
if (blockMoveXforJump)
{
if ((timerJumpLadder += Time.deltaTime) >= jumpLadderTime)
{
if (onLadder || onGround || Input.GetAxisRaw("Horizontal") != 0)
{
blockMoveXforJump = false;
timerJumpLadder = 0;
}
}
}
}
}
Скандинавская мифология — мифология древних скандинавов, часть древнегерманской мифологии.
Скандинавская мифология — мифология древних скандинавов, часть древнегерманской мифологии.
Скандинавская мифология — мифология древних скандинавов, часть древнегерманской мифологии.
Скандинавская мифология — мифология древних скандинавов, часть древнегерманской мифологии.
Скандинавская мифология — мифология древних скандинавов, часть древнегерманской мифологии.