Раннер

Программирование на Юнити.

Раннер

Сообщение FenixProg 23 ноя 2019, 14:13

Добрый день, прошу помощи!
Пишу простой раннер, игрок двигается в горизонтальной плоскости, должен прыгать и попадать на платформы, все состоит из префаба куба, возникли проблемы с физикой, Когда нажимаешь пробел(прыжок) объект Runner не прыгает, а бывает прыгает, также бывает прыжок, сильнее обычного, еще бывает при движении по платформе, он стопорит. На материале убрал по 0 все сопротивления,
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Runner : MonoBehaviour
{
    // Start is called before the first frame update
    public static float distanceTraveled;
    public Rigidbody rb;
    public float speed;
    private bool touchingPlatform;
    void Start()
    {
        rb = GetComponent<Rigidbody>();

    }

    // Update is called once per frame
    void FixedUpdate()
    {
        distanceTraveled = transform.localPosition.x;
       if (rb.IsSleeping())
        {
            Debug.Log("Спит");
            rb.WakeUp();
            //rb.velocity = new Vector3(2.0f, 0.0f, 0.0f) * speed;
        }
       /*
        if (rb.velocity.x < 1.0f)
            //rb.velocity = new Vector3(5.0f, 5.0f, 0.0f) * speed;
        {

        }
        */

        if (Input.GetKeyDown(KeyCode.Space))
        {
            if (touchingPlatform)
            {
                rb.AddForce(new Vector3(3.0f,5.0f, 0.0f), ForceMode.VelocityChange);
                return;
            }
        }
           
       
            if (touchingPlatform)
        {
            //Debug.Log(rb.velocity);
            rb.AddForce(new Vector3(3.0f, 0.0f, 0.0f) * speed, ForceMode.Force);
            if (rb.velocity.x > 6.0f)
            {
              rb.velocity = new Vector3(5.0f, 0.0f, 0.0f);
            }
            //touchingPlatform = false;
        }
    }

    void OnCollisionEnter()
    {
        touchingPlatform = true;
    }
    void OnCollisionExit()
    {
        touchingPlatform = false;
    }
}
 
FenixProg
UNец
 
Сообщения: 2
Зарегистрирован: 23 ноя 2019, 09:58

Re: Раннер

Сообщение 1max1 23 ноя 2019, 14:25

Вот это if (Input.GetKeyDown(KeyCode.Space)) должно проверяться в Update, потому что в FixedUpdate кадров может быть меньше и потому некоторые инпуты проскальзывают мимо. На счет стопоров, сделай коллайдеру едж радиус чтобы был гладкий как попка младенца :D Еще стопорить может из-за того что touchingPlatform == false, тут уже дебажить надо.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Раннер

Сообщение FenixProg 24 ноя 2019, 00:32

Забыл написать у меня 3d приложение
1max1 писал(а):Вот это if (Input.GetKeyDown(KeyCode.Space)) должно проверяться в Update, потому что в FixedUpdate кадров может быть меньше и потому некоторые инпуты проскальзывают мимо.
- Попробовал в Update поставить не работает, вобще конечно похоже на то что не проскальзывает.
Напоминает проблему я арканоид писал, когда платформа достигала стенки
Синтаксис:
Используется csharp
transform.position = playerPosition;
        if (playerPosition.x < -Boundary)
        {
            transform.position = new Vector3(-Boundary, playerPosition.y, playerPosition.z);
        }
 

На однократное нажатие платформа не двигалась, приходилось зажимать клавишу
FenixProg
UNец
 
Сообщения: 2
Зарегистрирован: 23 ноя 2019, 09:58

Re: Раннер

Сообщение Axil 10 дек 2019, 15:41

Проверяй не Input.GetKeyDown, а Input.GetKey.
Лови не то что клавиша была нажата 1 раз - это легко пропустить, а то что клавиша нажата в данный момент.
Аватара пользователя
Axil
UNIт
 
Сообщения: 51
Зарегистрирован: 02 окт 2019, 11:26

Re: Раннер

Сообщение AngryCat 11 дек 2019, 21:23

Закомментируй эту часть и проверь как все работает. Может после этого до тебя дойдет, где твоя ошибка, если ты еще не понял :p
Синтаксис:
Используется csharp
            if (touchingPlatform)
        {
            //Debug.Log(rb.velocity);
            rb.AddForce(new Vector3(3.0f, 0.0f, 0.0f) * speed, ForceMode.Force);
            if (rb.velocity.x > 6.0f)
            {
              rb.velocity = new Vector3(5.0f, 0.0f, 0.0f);
            }
            //touchingPlatform = false;
        }
Здесь могла бы быть ваша реклама.
Аватара пользователя
AngryCat
Старожил
 
Сообщения: 716
Зарегистрирован: 20 июл 2018, 22:29
Skype: Дискорд - Флеш#4099


Вернуться в Скрипты

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10