Задать вопрос
@little_dude

Почему неправильно работают Коллайдеры в Unity 3D?

Доброго времени суток, занимаюсь разработкой 3D игры на движке Unity. В этом деле я новичок, занимаюсь месяца 2, имею управление игроком в виде ходьбы, прыжка, ускорения и поворота камеры. Коды:
передвижение
using UnityEngine;
public class movement : MonoBehaviour
{
    void Start()
    {

    }
    private float speed = 5.0f;
    void FixedUpdate()
    {
        Vector3 Movement = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
        transform.Translate(Movement * speed * Time.deltaTime);
    }
}


поворот камеры
using UnityEngine;
public class rotation : MonoBehaviour
{
    public float sensitivity = 2.0f;
    private float maxYAngle = 80.0f;
    private float rotationX = 0.0f;
    void Start()
    {

    }
    private void FixedUpdate()
    {
        Cursor.lockState = CursorLockMode.Locked;
        float mouseX = Input.GetAxis("Mouse X");
        float mouseY = Input.GetAxis("Mouse Y");
        transform.parent.Rotate(Vector3.up * mouseX * sensitivity);
        rotationX -= mouseY * sensitivity;
        rotationX = Mathf.Clamp(rotationX, -maxYAngle, maxYAngle);
        transform.localRotation = Quaternion.Euler(rotationX, 0.0f, 0.0f);
        if (Input.GetKeyUp(KeyCode.Escape))
        {
            Cursor.lockState = CursorLockMode.None;
        }
    }
}


ускорение
using UnityEngine;
public class shift : MonoBehaviour
{
    private bool isMoving = false;
    private float movementSpeed = 4.0f;
    void FixedUpdate()
    {
        if (Input.GetKeyDown("w"))
        {
            isMoving = true;
        }

        if (Input.GetKeyUp("w"))
        {
            isMoving = false;
        }

        if (Input.GetKey(KeyCode.LeftShift) & isMoving == true)
        {
            transform.position += transform.forward * Time.deltaTime * movementSpeed;
        }
    }
}


прыжок
using UnityEngine;
public class jump : MonoBehaviour
{
    private float jumpHeight = 7f;
    private Rigidbody rb;
    private void Start()
    {
        rb = GetComponent<Rigidbody>();
    }
    private void FixedUpdate()
    {
        if (Input.GetButtonDown("Jump"))
        {
            RigidbodyJump();
        }
    }
    private void RigidbodyJump()
    {
        rb.AddForce(Vector3.up * jumpHeight, ForceMode.Impulse);
    }
}

Управление не супер хорошее, как минимум присутствует двойной прыжок, но работает. Также паралельно создаю карту в Blender, и когда дело дошло до работы с ней в Unity я начал накладывать Коллайдеры на объекты и столкнулся с такой проблемой:
Коллайдеры которые я накладываю на дорогу (пол) работают (вся карта импортировалась как один asset). Но самое интересное заключается в том что если я дам коллайдер зданию или просто препятствию ничего не будет работать, а если я запрыгну на верх здания все работает, и также если подпрыгну и залечу в стену я тоже не буду падать (это работает на любой объект который может заблокировать движение, даже который создал в Unity, при том что на обоих объектах стоят коллайдеры).
Кто знает помогите пожалуйста, как исправить данную проблему и сделать так что бы коллайдеры работали правильно.
  • Вопрос задан
  • 91 просмотр
Подписаться 1 Сложный 6 комментариев
Пригласить эксперта
Ответы на вопрос 2
ZhenyaMak
@ZhenyaMak
Писать качественный софт? Пфф, это не для меня.
А как вы установили коллайдеры карте? Какой тип? Хорошобы скрин карты с отображение коллайдеров...
Ответ написан
Комментировать
@Swish123
Хочется стать хорошим программистом...
У вас не правильная реализация перемещения игрока, ваш персонаж просто телепортируется. Чтоб такого не случалось нужно сделать реализацию персонажа через Rigidbody как вы это сделали с прыжком.

Вот вам готовый код найденный из интернета потому что мне лень писать свой:
using UnityEngine;
public class movement : MonoBehaviour
{
    private float Speed = 5.0f;
    private Rigidbody _rb;

    void Start()
    {
        _rb = GetComponent<Rigidbody>();
    }

    void FixedUpdate()
    {
        float moveHorizontal = Input.GetAxis("Horizontal");
        float moveVertical = Input.GetAxis("Vertical");
        Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);
        _rb.AddForce(movement * Speed);
    }
}


И самое главное, ОБЯЗАТЕЛЬНО сделайте такие настройки Rigidbody в Unity:
66e6e7bd769b7856580137.png
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы