проблемы с векторами

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

проблемы с векторами

Сообщение kirya_355 18 июл 2018, 21:24

я создал скрипт , для 2д игры , мне не нужен vector3 , но нашел с vector3 , как переделать под vector2

Синтаксис:
Используется csharp

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class bannerdestoy : MonoBehaviour
{
        public GameObject banner;
        private bool i;
        public float speed;

        void Start ()
        {
                i = false;
        }
        void Update ()
        {
                if (banner.transform.position.y > -34 && i==false)
                {
                        banner.transform.position = Vector3.MoveTowards (banner.transform.position, new Vector3 (0f, -34f, banner.transform.position.z), Time.deltaTime * speed);
                        StartCoroutine (test ());
                }
                else if (banner.transform.position.y < 100 && i == true)
                {
                        banner.transform.position = Vector3.MoveTowards (banner.transform.position, new Vector3 (0f, 100f, banner.transform.position.z), Time.deltaTime * speed);
                }
                else if (banner.transform.position.y == 100 && i == true)
                 Destroy (banner);
        }
        IEnumerator test ()
        {
                yield return new WaitForSeconds (2f);
                i = true;
        }
}


и еще почему-то этот не корректно работает , объект тупо проезжает -34 координату по оси y и доезжает до -80 и потом просто стоит
kirya_355
UNIт
 
Сообщения: 106
Зарегистрирован: 09 май 2018, 21:40

Re: проблемы с векторами

Сообщение 1max1 19 июл 2018, 04:33

ты лучше бы сказал что ты сделать пытаешься, а не тупо бросаться кусками кода в надежде, что кто-то догадается что там тебе надо
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: проблемы с векторами

Сообщение kirya_355 19 июл 2018, 10:48

1max1 писал(а):ты лучше бы сказал что ты сделать пытаешься, а не тупо бросаться кусками кода в надежде, что кто-то догадается что там тебе надо


ладно , мне нужно ,чтобы баннер перемещался из 1 положения в другое , потом ждал 2 секунды и перемещался обратно , потом удалялся,
написал код , новее прошлого , теперь он тупо уезжает вверх,
Синтаксис:
Используется csharp
public class bannerdestoy : MonoBehaviour
{
        public GameObject banner;
        public bool i;
        public float speed;

        void Start ()
        {
                i = false;
        }
        void Update ()
        {
                if (banner.transform.position.y > -100 && i==false)
                {
                        banner.transform.position = Vector2.MoveTowards (banner.transform.position, new Vector2 (0f, -1f), Time.deltaTime * speed);
                       
                }
                else if (banner.transform.position.y < 0 && i == false)
                StartCoroutine (test ());
                else if (banner.transform.position.y < 0 && i == true)
                {
                        banner.transform.position = Vector2.MoveTowards (banner.transform.position, new Vector2 (0f, 1f), Time.deltaTime * speed);
                }
                else if (banner.transform.position.y == 0 && i == true)
                 Destroy (banner);
        }
        IEnumerator test ()
        {
                yield return new WaitForSeconds (2f);
                i = true;
        }
}

сменил в коде vector 3 на vector 2 ,все равно едет дальше того куда я хочу , мне нужно чтобы из позиции 100(anchor presets вверх по середине) он продвигался до 0 потом ждал 2 секунды и двигался обратно , потом разрушался .сейчас он едет до -648 и все там остается.
Еще вопрос если я выбираю anchor presets вверх по середине , то отсчет как идет ?
kirya_355
UNIт
 
Сообщения: 106
Зарегистрирован: 09 май 2018, 21:40

Re: проблемы с векторами

Сообщение kirya_355 19 июл 2018, 11:27

Может как-то через RectTansform реалтзовать
kirya_355
UNIт
 
Сообщения: 106
Зарегистрирован: 09 май 2018, 21:40

Re: проблемы с векторами

Сообщение 1max1 19 июл 2018, 11:41

Ну и зачем так извращаться?
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

class BannerDestroy : MonoBehaviour
{
    [SerializeField] Transform banner;
    [SerializeField] float     speedMove;
    [SerializeField] Vector2   startPosition;
    [SerializeField] Vector2   finishPosition;

    void Start()
    {
        StartCoroutine(MoveToDie());
    }

    IEnumerator MoveToDie()
    {
        banner.position = startPosition;

        while (true)
        {
            banner.position = Vector2.MoveTowards(banner.position, finishPosition, speedMove * Time.deltaTime);

            if (Vector2.Distance(banner.position, finishPosition) == 0.0f)
            {
                break;
            }

            yield return null;
        }

        yield return new WaitForSeconds(2.0f);

        while (true)
        {
            banner.position = Vector2.MoveTowards(banner.position, startPosition, speedMove * Time.deltaTime);

            if (Vector2.Distance(banner.position, startPosition) == 0.0f)
            {
                break;
            }
        }
    }
}
 


Ты в курсе что, если твой Render Mode твоего канваса не World Space, то координаты считаются как экранные и они будут отличаться от тех, что показаны в инспекторе (в rect transform).
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: проблемы с векторами

Сообщение Anonymyx 19 июл 2018, 12:41

Синтаксис:
Используется csharp
 if (Vector2.Distance(banner.position, startPosition) == 0.0f)

Проверять дистанцию, причем на 0.0f, нет необходимости. У Vector3 оператор сравнения сравнивает вектора по эпсилону.

Ты в курсе что, если твой Render Mode твоего канваса не World Space, то координаты считаются как экранные и они будут отличаться от тех, что показаны в инспекторе (в rect transform).

Зависит от того где стоит якорь :)
Аватара пользователя
Anonymyx
Адепт
 
Сообщения: 1973
Зарегистрирован: 05 апр 2015, 15:55

Re: проблемы с векторами

Сообщение kirya_355 19 июл 2018, 14:31

1max1 писал(а):Ну и зачем так извращаться?
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

class BannerDestroy : MonoBehaviour
{
    [SerializeField] Transform banner;
    [SerializeField] float     speedMove;
    [SerializeField] Vector2   startPosition;
    [SerializeField] Vector2   finishPosition;

    void Start()
    {
        StartCoroutine(MoveToDie());
    }

    IEnumerator MoveToDie()
    {
        banner.position = startPosition;

        while (true)
        {
            banner.position = Vector2.MoveTowards(banner.position, finishPosition, speedMove * Time.deltaTime);

            if (Vector2.Distance(banner.position, finishPosition) == 0.0f)
            {
                break;
            }

            yield return null;
        }

        yield return new WaitForSeconds(2.0f);

        while (true)
        {
            banner.position = Vector2.MoveTowards(banner.position, startPosition, speedMove * Time.deltaTime);

            if (Vector2.Distance(banner.position, startPosition) == 0.0f)
            {
                break;
            }
        }
    }
}
 


Ты в курсе что, если твой Render Mode твоего канваса не World Space, то координаты считаются как экранные и они будут отличаться от тех, что показаны в инспекторе (в rect transform).


спасибо за ответ , но у меня возникли еще вопросы , зачем нужен [SerializeField] ? Где строчка отвечающая за уничтожение ?
и у меня Render Mode стоит как Screen Space - Camera , как в это случае поступать?
kirya_355
UNIт
 
Сообщения: 106
Зарегистрирован: 09 май 2018, 21:40

Re: проблемы с векторами

Сообщение kirya_355 19 июл 2018, 14:58

1max1 что ты сделал?у меня unity тупо зависает , когда я включаю твой код, версия 2018.1.6f1 ? могу сцену скинуть...
kirya_355
UNIт
 
Сообщения: 106
Зарегистрирован: 09 май 2018, 21:40

Re: проблемы с векторами

Сообщение 1max1 19 июл 2018, 15:00

зачем нужен [SerializeField] ?

можешь вместо него использовать public, это просто фетишь у меня такой)) Этот атрибут делает переменную как private, только в инспекторе ее видно.
Где строчка отвечающая за уничтожение ?

Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

class BannerDestroy : MonoBehaviour
{
    [SerializeField] Transform banner;
    [SerializeField] float     speedMove = 50.0f;
    [SerializeField] float     offsetPosition = 100.0f; // Если поставить -100.0f банер поедет вниз

    void Start()
    {
        StartCoroutine(MoveToDie());
    }

    IEnumerator MoveToDie()
    {
        Vector3 startPosition = transform.position;
        Vector3 finishPosition = startPosition + Vector3.up * offsetPosition;

        while (true)
        {
            banner.position = Vector2.MoveTowards(banner.position, finishPosition, speedMove * Time.deltaTime);

            if (banner.position == finishPosition) // По просьбе трудящихся
            {
                break;
            }

            yield return null;
        }

        yield return new WaitForSeconds(2.0f);

        while (true)
        {
            banner.position = Vector2.MoveTowards(banner.position, startPosition, speedMove * Time.deltaTime);

            if (banner.position == startPosition) // По просьбе трудящихся
            {
                Destroy(banner.gameObject); // Вот строчка на дестрой

                break;
            }

            yield return null;
        }
    }
}
 

и у меня Render Mode стоит как Screen Space - Camera , как в это случае поступать?

Ну тогда конкретные значения думаю не подойдут и если так двигать баннер то надо динамически подбирать расположение (см. код выше)
Если хочешь по центру, то делай привязку к центру и убирай баннер или вверх или вниз, чтобы его сначала не было видно, он по скрипту сам будет выезжать.

п.с. давай сцену
Последний раз редактировалось 1max1 19 июл 2018, 15:06, всего редактировалось 1 раз.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: проблемы с векторами

Сообщение Anonymyx 19 июл 2018, 15:01

Во втором цикле нет yield return'а.
зачем нужен [SerializeField] ?

Чтобы Unity3d засериализовал это поле. Т.е. сохранил значение поле в файле. Этот атрибут также делает поле видимым в инспекторе.
Аватара пользователя
Anonymyx
Адепт
 
Сообщения: 1973
Зарегистрирован: 05 апр 2015, 15:55

Re: проблемы с векторами

Сообщение 1max1 19 июл 2018, 15:07

Во втором цикле нет yield return'а.

точняк)
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: проблемы с векторами

Сообщение kirya_355 19 июл 2018, 17:00

1max1 писал(а):
зачем нужен [SerializeField] ?

можешь вместо него использовать public, это просто фетишь у меня такой)) Этот атрибут делает переменную как private, только в инспекторе ее видно.
Где строчка отвечающая за уничтожение ?

Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

class BannerDestroy : MonoBehaviour
{
    [SerializeField] Transform banner;
    [SerializeField] float     speedMove = 50.0f;
    [SerializeField] float     offsetPosition = 100.0f; // Если поставить -100.0f банер поедет вниз

    void Start()
    {
        StartCoroutine(MoveToDie());
    }

    IEnumerator MoveToDie()
    {
        Vector3 startPosition = transform.position;
        Vector3 finishPosition = startPosition + Vector3.up * offsetPosition;

        while (true)
        {
            banner.position = Vector2.MoveTowards(banner.position, finishPosition, speedMove * Time.deltaTime);

            if (banner.position == finishPosition) // По просьбе трудящихся
            {
                break;
            }

            yield return null;
        }

        yield return new WaitForSeconds(2.0f);

        while (true)
        {
            banner.position = Vector2.MoveTowards(banner.position, startPosition, speedMove * Time.deltaTime);

            if (banner.position == startPosition) // По просьбе трудящихся
            {
                Destroy(banner.gameObject); // Вот строчка на дестрой

                break;
            }

            yield return null;
        }
    }
}
 

и у меня Render Mode стоит как Screen Space - Camera , как в это случае поступать?

Ну тогда конкретные значения думаю не подойдут и если так двигать баннер то надо динамически подбирать расположение (см. код выше)
Если хочешь по центру, то делай привязку к центру и убирай баннер или вверх или вниз, чтобы его сначала не было видно, он по скрипту сам будет выезжать.

п.с. давай сцену

возникли проблемы , не выходит из 1 цикла я вписал Debug.Log("first while ended"); перед yield return new WaitForSeconds(2.0f); и в консоле пусто ,мне кажется ты забыл что нельзя floar и float приравнивать
kirya_355
UNIт
 
Сообщения: 106
Зарегистрирован: 09 май 2018, 21:40

Re: проблемы с векторами

Сообщение 1max1 19 июл 2018, 17:36

Всё таки я оказался прав, что лучше не сравнивать вектора, а брать дистанцию
Кстати MoveTowards имеет свойство не доводить дело до конца, к примеру если он будет стремится к вектору new Vector3(1,0,0) он может тупо выдавать что-то типа new Vector3(0.9544f,0,0) так что лучше не юзать его там где идет сравнение векторов
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

class BannerDestroy : MonoBehaviour
{
    [SerializeField] Transform banner;
    [SerializeField] float speedMove = 50.0f;
    [SerializeField] float offsetPosition = 300.0f;

    void Start()
    {
        StartCoroutine(MoveToDie());
    }

    IEnumerator MoveToDie()
    {
        Vector3 startPosition = banner.position;
        Vector3 finishPosition = startPosition + Vector3.up * offsetPosition;

        while (true)
        {
            banner.position = Vector3.MoveTowards(banner.position, finishPosition, speedMove * Time.deltaTime);

            if ((banner.position - finishPosition).magnitude < 1.0f)
            {
                break;
            }

            yield return null;
        }

        yield return new WaitForSeconds(2.0f);

        while (true)
        {
            banner.position = Vector3.MoveTowards(banner.position, startPosition, speedMove * Time.deltaTime);

            if ((banner.position - startPosition).magnitude < 1.0f)
            {
                Destroy(banner.gameObject);

                break;
            }

            yield return null;
        }
    }
}

 
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: проблемы с векторами

Сообщение kirya_355 19 июл 2018, 19:56

всё наконец, работает , спасибо огромное , но есть вопрос,просто интересно , сколько раз в секунду проверяется конструкция
Синтаксис:
Используется csharp
 if ((banner.position - finishPosition).magnitude < 1.0f)
kirya_355
UNIт
 
Сообщения: 106
Зарегистрирован: 09 май 2018, 21:40

Re: проблемы с векторами

Сообщение 1max1 19 июл 2018, 20:00

каждый кадр
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

След.

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

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

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