Лестница в 2d платформере
| |
Oektann | Дата: Воскресенье, 08 Марта 2015, 01:13 | Сообщение # 1 |
уже был
Сейчас нет на сайте
| Мне нужно сделать клон Donkey Kong на Unity. Не могу осилить лестницы. Так как платформы на которых стоит персонаж и сам персонаж имеют collider2D, чтобы игрок не проваливался сквозь них я не могу пройти сквозь платформы, когда взбираюсь по лестнице. Персонаж просто упирается в них и все. Подскажите пожалуйста, как это решить?
|
|
| |
Storm54 | Дата: Воскресенье, 08 Марта 2015, 21:17 | Сообщение # 2 |
постоянный участник
Сейчас нет на сайте
| Отключать коллайдер персонажа или платформ, когда начинаешь ползти по лестнице. Можно сменить слой персонажа на другой, и в настройках физики отключить обработку коллизий слоя с платформами и персонажем.
|
|
| |
MANMANA | Дата: Воскресенье, 08 Марта 2015, 22:09 | Сообщение # 3 |
почти ветеран
Сейчас нет на сайте
| игнорить определенный коллайдер персонажем в определенный момент времени (на определенное время) посредством тегов или слоев, например. как только перс окажется выше заигноренного коллайдера включить столкновения с этим коллайдером.
можно от обратного игнорить коллайдер игрока коллайдером пола.
p.s. при отключении коллайдера, например, игрока, вместо игнора даного коллайдера могут пропасть кейсы попадания в коллайдер игрока пуль, врагов и т.д. p.p.s. отключение коллайдера пола может привести к падению на уровень ниже всех находящихся на нем злых врагов
http://www.3dbuffer.com/ Текстуры, Unity3D, Blender: Эффекты, скрипты, моделирование, текстурирование, скульптинг VKонтакте 3Dbuffer
Последнее:
Новый раздел "Текстуры"
Как запатентовать, защитить техническое решение, игру, идею
Сообщение отредактировал MANMANA - Воскресенье, 08 Марта 2015, 22:09 |
|
| |
Oektann | Дата: Воскресенье, 08 Марта 2015, 22:22 | Сообщение # 4 |
уже был
Сейчас нет на сайте
| У меня не получается отключать коллайдер персонажа Collider2d.enabled = false; игнорируется. На игроке и на полу стоят boxCollider 2d, но к его свойству enabled я почему то обратиться не могу. А можно про "в настройках физики отключить обработку коллизий слоя с платформами и персонажем" поподробней? как это сделать?
|
|
| |
MANMANA | Дата: Воскресенье, 08 Марта 2015, 22:48 | Сообщение # 5 |
почти ветеран
Сейчас нет на сайте
| Игнор коллизий http://docs.unity3d.com/ScriptReference/Physics.IgnoreCollision.html http://answers.unity3d.com/questions/45956/ignore-collision.html 2D http://docs.unity3d.com/ScriptReference/Physics2D.IgnoreCollision.html таги http://answers.unity3d.com/questio....er.html матрица http://gamedev.stackexchange.com/questio....objects http://gamedev.stackexchange.com/questio....ontexts
http://www.3dbuffer.com/ Текстуры, Unity3D, Blender: Эффекты, скрипты, моделирование, текстурирование, скульптинг VKонтакте 3Dbuffer
Последнее:
Новый раздел "Текстуры"
Как запатентовать, защитить техническое решение, игру, идею
|
|
| |
Левша | Дата: Понедельник, 09 Марта 2015, 08:26 | Сообщение # 6 |
почти ветеран
Сейчас нет на сайте
| Заюзай односторонний коллайдер.
X.cor.R (Prologue)
|
|
| |
MANMANA | Дата: Вторник, 10 Марта 2015, 22:07 | Сообщение # 7 |
почти ветеран
Сейчас нет на сайте
| Левша, ты про PlatformEffector2D.oneWay? а то я только костыли встречал. а для общего развития хотелось бы знать
http://www.3dbuffer.com/ Текстуры, Unity3D, Blender: Эффекты, скрипты, моделирование, текстурирование, скульптинг VKонтакте 3Dbuffer
Последнее:
Новый раздел "Текстуры"
Как запатентовать, защитить техническое решение, игру, идею
|
|
| |
Левша | Дата: Среда, 11 Марта 2015, 07:09 | Сообщение # 8 |
почти ветеран
Сейчас нет на сайте
| Можно и это. Имелось ввиду какой нибудь аналог MeshCollider в 2Д физике. Надо проверить PolygonCollider2D, возможно он односторонний. Сам пока применяю в 2Д проектах только 3Д физику, к 2Д физике пока нет доверия полного.
X.cor.R (Prologue)
|
|
| |
MANMANA | Дата: Среда, 11 Марта 2015, 10:29 | Сообщение # 9 |
почти ветеран
Сейчас нет на сайте
| Вот ты... интриган Можно ландшафтовский коллайдер запулить, если на производительность начхать три раза
http://www.3dbuffer.com/ Текстуры, Unity3D, Blender: Эффекты, скрипты, моделирование, текстурирование, скульптинг VKонтакте 3Dbuffer
Последнее:
Новый раздел "Текстуры"
Как запатентовать, защитить техническое решение, игру, идею
|
|
| |
Assara_De_Niris | Дата: Пятница, 14 Августа 2020, 12:35 | Сообщение # 10 |
уже был
Сейчас нет на сайте
| У меня некорректно работает С# скрипт для лестницы я не понимаю почему код Код 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(); }
|
|
| |
|