Как определить на какой платформе куб

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

Как определить на какой платформе куб

Сообщение Waitner 24 янв 2019, 12:52

Здравствуйте, я делаю игру где куб при нажатие на кнопку сужается а потом прыгает верх на следующую платформу. Проблема в том, что я не могу определить нормально на следующей он платформе или на той же.
Изображение
Платформы у меня триггерные пока куб находиться под ними, но как только куб выше платформы, то они перестают быть триггерными. Добился я это вот этим кодом и сделал прифаб.
Синтаксис:
Используется csharp
public class Platform : MonoBehaviour {

    public GameObject cube;
    public static float blocky, cubey, cube2y, block2y;
   

    void Start()
    {
        cube = GameObject.Find("MCube");
    }

    void FixedUpdate()
    {
       
        if (cube != null)
        {
            blocky = gameObject.transform.position.y + 0.25f;
            cubey = cube.transform.position.y - 0.5f;
            cube2y = cube.transform.position.y;
            block2y = gameObject.transform.position.y;

            if (block2y < cube2y && blocky < cubey)
            {
                gameObject.GetComponent<BoxCollider>().isTrigger = false;
            }

            if (blocky > cubey && block2y > cube2y)
            {
                gameObject.GetComponent<BoxCollider>().isTrigger = true;
            }
        }
    }
}
 

При спавне платформы ей назначается номер от 1 и т.д.
Синтаксис:
Используется csharp
public class SpawnBlock : MonoBehaviour {

    public GameObject block, allCubes;
    private float r = -1.5f, n = -0.5f;
    public static int k = 1;

    void Start ()
    {
        for (int i = 0; i < 5; i++)
        {
            block = Instantiate(block, new Vector3(Random.Range(-1.9f, 1.8f), Random.Range(r, n), 0f), Quaternion.identity);
            block.transform.localScale = new Vector3(RandScale(), block.transform.localScale.y, block.transform.localScale.z);
            string number = k.ToString();
            block.name = number;
            k ++;
            r = r + 2;
            n = n + 2;
            block.transform.parent = allCubes.transform;
        }
    }

    float RandScale ()
    {
        float rand;
        if (Random.Range(0, 100) > 65)
        {
            rand = Random.Range(1f, 2f);
        }
        else
        {
            rand = Random.Range(1f, 1.5f);
        }
        return rand;
    }
}
 

Потом в коде для куба я использую метод OnCollisionEnter и OnCollisionExit для определения на какой платформе находиться куб. При прыжке он запоминает от какой платформы оттолкнулся, а при приземление он запоминает номер платформы на которую приземлился и делает сравнение и если первый номер меньше второго, то он на новой платформе, если равен или больше то это проигрыш.
Синтаксис:
Используется csharp
public class Cube : MonoBehaviour
{

    Rigidbody rb;
    private float horizontal;
    private bool xpos;
    public static bool cubey, GG;
    private int p;
    private int o;


    void Start()
    {
        rb = GetComponent<Rigidbody>();

        if (Application.platform == RuntimePlatform.Android)
        {
            xpos = true;
        }
        else
        {
            xpos = false;
        }
    }
    void FixedUpdate()
    {
        if (xpos && !cubey)
        {
            horizontal = Input.acceleration.x;
        }
        if (!xpos && !cubey)
        {
            horizontal = Input.GetAxis("Horizontal");
            rb.velocity = new Vector3(Input.GetAxis("Horizontal") * 5f, rb.velocity.y, rb.velocity.z);
        }

        if (transform.localPosition.y < -5f)
        {
            Destroy(gameObject, .1f);
            print("GG");
            GG = true;
        }  
    }

    void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.tag == "Platform")
        {
            cubey = true;
            if (Jump.sleep && cubey)
            {
                if (Platform.blocky > Platform.cubey && Platform.block2y > Platform.cube2y)
                {
                    string theName = collision.transform.name;
                    int.TryParse(theName, out p);
                    StartCoroutine(pos());
                }
            }
        }
    }

    void OnCollisionExit(Collision collision)
    {
        if (collision.gameObject.tag == "Platform")
        {
            cubey = false;
            if (Jump.sleep)
            {
                string theName = collision.transform.name;
                int.TryParse(theName, out o);
            }
        }
    }

    IEnumerator pos()
    {
        yield return new WaitForSeconds(0.25f);
        if (o == p || o > p)
        {
            GG = true;
            print("GG");
        }
        else if (o < p)
        {
            GG = false;
            print("Next");
        }
    }
}
 

Проблема в том, что пролетая через платформу он считывает данные, хотя он в полёте и не приземляется на неё. В итоге хоть он и на следующей платформе, но он показывает поражение. Как это исправить? Я не силён в скриптах и unity и это мой первый проект
Waitner
UNец
 
Сообщения: 3
Зарегистрирован: 10 янв 2019, 11:36

Re: Как определить на какой платформе куб

Сообщение boronnikovAI 12 мар 2019, 18:57

Ну заведи состояние прыжка. Bool, который определяет прыгаешь ты или нет. Если прыгаешь - пропускай считывание.
Синтаксис:
Используется csharp
if(jump) return;

Далее, не стоит определять индекс по имени.
Создай для платформы компонент, в котором и будешь хранить индекс этой платформы. Потом при колизии с оъектом - дёргаешь у компонента компонент платформы. Если не null - значит платформа.
Там и чекай индекс. Плюс туда же можешь добавить флажок о том, был ли ты там или нет.
boronnikovAI
UNец
 
Сообщения: 7
Зарегистрирован: 15 ноя 2018, 16:09

Re: Как определить на какой платформе куб

Сообщение AngryCat 14 мар 2019, 22:23

boronnikovAI писал(а):Ну заведи состояние прыжка. Bool, который определяет прыгаешь ты или нет. Если прыгаешь - пропускай считывание.
Синтаксис:
Используется csharp
if(jump) return;

Далее, не стоит определять индекс по имени.
Создай для платформы компонент, в котором и будешь хранить индекс этой платформы. Потом при колизии с оъектом - дёргаешь у компонента компонент платформы. Если не null - значит платформа.
Там и чекай индекс. Плюс туда же можешь добавить флажок о том, был ли ты там или нет.

Или по оси Y можно смотреть. А если по вопросу, то скорее всего у тебя слишком большой триггер, из-за которого метод срабатывает еще до того, как ты прикоснулся к объекту.
Здесь могла бы быть ваша реклама.
Аватара пользователя
AngryCat
Старожил
 
Сообщения: 716
Зарегистрирован: 20 июл 2018, 22:29
Skype: Дискорд - Флеш#4099


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

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

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