Страница 1 из 3

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

СообщениеДобавлено: 18 июл 2018, 21:24
kirya_355
я создал скрипт , для 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 и потом просто стоит

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

СообщениеДобавлено: 19 июл 2018, 04:33
1max1
ты лучше бы сказал что ты сделать пытаешься, а не тупо бросаться кусками кода в надежде, что кто-то догадается что там тебе надо

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

СообщениеДобавлено: 19 июл 2018, 10:48
kirya_355
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 вверх по середине , то отсчет как идет ?

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

СообщениеДобавлено: 19 июл 2018, 11:27
kirya_355
Может как-то через RectTansform реалтзовать

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

СообщениеДобавлено: 19 июл 2018, 11:41
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).

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

СообщениеДобавлено: 19 июл 2018, 12:41
Anonymyx
Синтаксис:
Используется csharp
 if (Vector2.Distance(banner.position, startPosition) == 0.0f)

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

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

Зависит от того где стоит якорь :)

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

СообщениеДобавлено: 19 июл 2018, 14:31
kirya_355
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 , как в это случае поступать?

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

СообщениеДобавлено: 19 июл 2018, 14:58
kirya_355
1max1 что ты сделал?у меня unity тупо зависает , когда я включаю твой код, версия 2018.1.6f1 ? могу сцену скинуть...

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

СообщениеДобавлено: 19 июл 2018, 15: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 , как в это случае поступать?

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

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

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

СообщениеДобавлено: 19 июл 2018, 15:01
Anonymyx
Во втором цикле нет yield return'а.
зачем нужен [SerializeField] ?

Чтобы Unity3d засериализовал это поле. Т.е. сохранил значение поле в файле. Этот атрибут также делает поле видимым в инспекторе.

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

СообщениеДобавлено: 19 июл 2018, 15:07
1max1
Во втором цикле нет yield return'а.

точняк)

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

СообщениеДобавлено: 19 июл 2018, 17:00
kirya_355
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 приравнивать

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

СообщениеДобавлено: 19 июл 2018, 17:36
1max1
Всё таки я оказался прав, что лучше не сравнивать вектора, а брать дистанцию
Кстати 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;
        }
    }
}

 

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

СообщениеДобавлено: 19 июл 2018, 19:56
kirya_355
всё наконец, работает , спасибо огромное , но есть вопрос,просто интересно , сколько раз в секунду проверяется конструкция
Синтаксис:
Используется csharp
 if ((banner.position - finishPosition).magnitude < 1.0f)

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

СообщениеДобавлено: 19 июл 2018, 20:00
1max1
каждый кадр