У меня некорректно работает С# скрипт для лестницы
я не понимаю почему
код Код
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Ladder : MonoBehaviour
{
[SerializeField]
float speed = 5;
void OnTriggerStay2D(Collider2D other)
{
other.GetComponent<Rigidbody2D>().gravityScale = 0;
if (other.gameObject.CompareTag("Player"))
{
if (Input.GetKey(KeyCode.W))
{
other.GetComponent<Rigidbody2D>().velocity = new Vector2(0, speed);
}
}
else if (Input.GetKey(KeyCode.S))
{
other.GetComponent<Rigidbody2D>().velocity = new Vector2(0, -speed);
}
else
{
other.GetComponent<Rigidbody2D>().velocity = new Vector2(0, 0);
}
}
void OnTriggerExid2D(Collider2D other) => other.GetComponent<Rigidbody2D>().gravityScale = 1;
}
в место работы отключается гравитация, а проверка земли под ногами видя коллайдер позволяет прыгать бесконечно.
При отходе от коллайдера гравитация не включается.
делал по уроку Код
https://www.youtube.com/watch?v=DSV7eRXuAIQ&feature=emb_logo
Добавлено (14 Августа 2020, 12:39)
---------------------------------------------
Я думаю что возможно ошибка в коде игрока
Код
public class player : MonoBehaviour
{
// ПЕременные
Rigidbody2D rb; // физика модели героя, является классом
public float speed; // скорость
public float jumpHeight; // высота прыжка
public Transform groundCheak; // проверка земли
bool isgrouded; // состояние наземле\в полете
Animator anim; // анимации
int curHp; // количество жизней
int maxHp = 3; // максимальное количество жизней
bool isHit = false;
public main main;
// Start is called before the first frame update
void Start() // метод старт вызывается едтнажды!
{
rb = GetComponent<Rigidbody2D>(); // присваиваем "rb" класс <Rigidbody2D>
anim = GetComponent<Animator>(); // включает анимации
curHp = maxHp; // в начале игры всезда будет м максимальное кол-во жизней
}
// Update is called once per frame
void Update() // метод обдейт вызывается каждый кадр!/ метод графического движка
{
chekGround(); // проверка
if (Input.GetAxis("Horizontal") == 0 && (isgrouded))// если не ножата ни одно кнопка горизонтали и не находится в воздухе
{
anim.SetInteger("state", 1);// то проигрываяется анимация покоя
}
else
{
flep(); // вызываем метод флип
if (isgrouded)
anim.SetInteger("state", 2);
}
}
void FixedUpdate() // метод физического движка
{
rb.velocity = new Vector2(Input.GetAxis("Horizontal") * speed, rb.velocity.y); // управление по горизонтали ("a", "b")("->" "<-") (-1 0 +1)
if (Input.GetKeyDown(KeyCode.W) && isgrouded) // если нажат пробел и игрок стоит на земле
rb.AddForce(transform.up * jumpHeight, ForceMode2D.Impulse); // то совершается прыжок с силой * "jumpHeight"
}
void flep() //обычный не системный метод
{
if (Input.GetAxis("Horizontal") > 0) // если герой смотрит на право
transform.localRotation = Quaternion.Euler(0, 0, 0); // то его иконка остается прежней
if (Input.GetAxis("Horizontal") < 0) // если герой смотрит на лево
transform.localRotation = Quaternion.Euler(0, 180, 0); // то его иконка поворачивается на (180 по y)
}
void chekGround()// метод проверка земли под ногами
{
Collider2D[] colliders = Physics2D.OverlapCircleAll(groundCheak.position, 0.5f); // все колайдеры в радиесе (0.2f) будут помещены в список (colliders)
isgrouded = colliders.Length > 1;// если длинны списка колайдеров больше 1 (1 это сам игрк) то значит что под его ноами чтото естьи можно отскочить
if (!isgrouded)
anim.SetInteger("state", 3);
}
public void RecountHp(int deltaHp)
{
curHp = curHp + deltaHp;
if (deltaHp < 0)
StopCoroutine(OnHit());
isHit = true;
StartCoroutine(OnHit());
print(curHp);
if (curHp <= 0)
{
GetComponent<CapsuleCollider2D>().enabled = false;
Invoke("lose", 2f); // время от смерти игрока до перезапуска уровня
}
}
IEnumerator OnHit()
{
if (isHit)
GetComponent<SpriteRenderer>().color = new Color(1f, GetComponent<SpriteRenderer>().color.g - 0.04f, GetComponent<SpriteRenderer>().color.b - 0.04f);
else
GetComponent<SpriteRenderer>().color = new Color(1f, GetComponent<SpriteRenderer>().color.g + 0.04f, GetComponent<SpriteRenderer>().color.b + 0.04f);
if (GetComponent<SpriteRenderer>().color.g == 1f)
StopCoroutine(OnHit());
if (GetComponent<SpriteRenderer>().color.g <= 0)
isHit = false;
yield return new WaitForSeconds(0.02f);
StartCoroutine(OnHit());
}
void lose()
{
main.GetComponent<main>().lose();
}