Как заставить движок отличать пол от стены?

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Как заставить движок отличать пол от стены?

Сообщение originalnii 25 июн 2023, 19:15

Всем снова доброго времени суток. Всё ещё веду работу над платформером. Мне не очень понравился тот туториал, по которому я работал изначально, поэтому я решил взять другой. Этот другой туториал, в частности, для игрового персонажа использует следующий скрипт:

Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;
 
public class characterController : MonoBehaviour {
    public float maxSpeed = 10f;
    public float jumpForce = 700f;
    bool facingRight = true;
    bool grounded = false;
    public Transform groundCheck;
    public float groundRadius = 0.2f;
    public LayerMask whatIsGround;
 
    public float move;
 
    // Use this for initialization
    void Start () {
 
    }
   
    // Update is called once per frame
    void FixedUpdate () {
 
 
        grounded = Physics2D.OverlapCircle (groundCheck.position, groundRadius, whatIsGround);
 
        move = Input.GetAxis ("Horizontal");
 
    }
 
    void Update(){
        if (grounded && (Input.GetKeyDown (KeyCode.W)||Input.GetKeyDown (KeyCode.UpArrow))) {
 
            rigidbody2D.AddForce (new Vector2(0f,jumpForce));
        }
        rigidbody2D.velocity = new Vector2 (move * maxSpeed, rigidbody2D.velocity.y);
       
        if (move > 0 && !facingRight)
            Flip ();
        else if (move < 0 && facingRight)
            Flip ();
 
 
 
        if (Input.GetKey(KeyCode.Escape))
        {
            Application.Quit();
        }
 
        if (Input.GetKey(KeyCode.R))
        {
            Application.LoadLevel(Application.loadedLevel);
        }
 
 
    }
   
    void Flip(){
        facingRight = !facingRight;
        Vector3 theScale = transform.localScale;
        theScale.x *= -1;
        transform.localScale = theScale;
    }      
}


В котором для определения того, что является землёй, используется переменная типа LayerMask. К сожалению, я не нашёл способа с её помощью определять только часть игровых объектов, так что теперь персонаж находясь, например, рядом со стеной, способен бесконечно подниматься вверх, ибо проверка не отличает объект стены от объекта пола. Я думаю, что нужно как то изменить тип переменной, используя теги, но не знаю, как это сделать. Может кто-нибудь подсказать?

И вопрос №2: У меня и пол, и стены состоят из отдельных тайлов, и когда персонаж прыгает рядом со стеной, если удерживать кнопку движения в её направлении, он в ней застревает. Я пытался немного увеличить размер коллайдера тайла - префаба, но это не помогло. Возможно ли как то это исправить, не делая единый коллайдер для всей стены?
originalnii
UNец
 
Сообщения: 15
Зарегистрирован: 16 апр 2018, 17:51

Re: Как заставить движок отличать пол от стены?

Сообщение 1max1 26 июн 2023, 04:05

1. Используй box коллайдер под ногами игрока для проверки земли, он должен быть чуть ниже и чуть уже основного коллайдера.
2. Используй физ. материал с 0 трением на стены, либо проверяй таким же коллайдером как в пункте 1, только для правой и левой стороны персонажа и через скрипт при касании стены применяй небольшое усилие в противоположную сторону от стены (или обнуляй силу по оси движения в направлении стены, обычно ось Х).
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Как заставить движок отличать пол от стены?

Сообщение originalnii 28 июн 2023, 19:52

1max1 писал(а):1. Используй box коллайдер под ногами игрока для проверки земли, он должен быть чуть ниже и чуть уже основного коллайдера.
2. Используй физ. материал с 0 трением на стены, либо проверяй таким же коллайдером как в пункте 1, только для правой и левой стороны персонажа и через скрипт при касании стены применяй небольшое усилие в противоположную сторону от стены (или обнуляй силу по оси движения в направлении стены, обычно ось Х).

Спасибо. Я тут уж было почти написал длиннющее сообщение о том, что придание противоположного импульса работает постоянно, и я не понимаю, почему, как в последний момент заметил, что в качестве аргументов поставил не bool - переменную, показывающую, упёрся ли персонаж в стену, а переменную самого проверяющего коллайдера. В общем всё работает, благодарю ещё раз.
originalnii
UNец
 
Сообщения: 15
Зарегистрирован: 16 апр 2018, 17:51


Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot], Yandex [Bot] и гости: 31