Перемещение объекта кодом по определённой траектории[РЕШЕНО]

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

Перемещение объекта кодом по определённой траектории[РЕШЕНО]

Сообщение Vlasil 03 апр 2018, 18:53

Добрый день. Помогите пожалуйста начинающему грамотно решить проблему.
С поставленной задачей справился, но понимаю, что сделал не правильно.
Задача:
Объект прилетает в кадр и начинает кружить по периметру кадра.
(под кадром подразумеваю отображаемое камерой пространство т.е. камеру).

Перелопатил весь форум и другие сайты, но так и не смог найти конкретного решения.
Решил задачу при помощи вот таких вот самодельных костылей:

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

public class PerimeterMotion : MonoBehaviour
{
    [SerializeField]
    private float speed = 5;
    [SerializeField]
    private Transform endPoint_0, endPoint_1, endPoint_2, endPoint_3;
   

    void Start()
    {
        transform.position = new Vector2(-15, -4);
        endPoint_0.transform.position = new Vector2(-7, -4);
        endPoint_1.transform.position = new Vector2(7, -4);
        endPoint_2.transform.position = new Vector2(7, 5);
        endPoint_3.transform.position = new Vector2(-7, 5);
        Debug.Log("Start programm. Position: -5, -1");
    }


    void FixedUpdate()
    {
            if(transform.position.x <=7)
                {                    
                    transform.position = Vector3.MoveTowards(transform.position, endPoint_1.position, Time.deltaTime * speed);
                    Debug.Log("Move to right");
                }
       
            if (transform.position == endPoint_1.position)
                {

                    endPoint_1.transform.position = endPoint_2.transform.position;
                    endPoint_2.transform.position = endPoint_1.transform.position;
                    Debug.Log("Move to up");
                }

            if (transform.position == endPoint_2.position)
                {
           
                    endPoint_2.transform.position = endPoint_3.transform.position;
                    Debug.Log("Move to left");
                }

            if (transform.position == endPoint_3.position)
            {
                    endPoint_3.transform.position = endPoint_0.transform.position;
                       
            Debug.Log("Move to down");
            }

            if (transform.position == endPoint_0.position)
            {
            endPoint_1.transform.position = new Vector2(7, -4);
            endPoint_2.transform.position = new Vector2(7, 5);
            endPoint_3.transform.position = new Vector2(-7, 5);
        }
    }
}

Как можно это сделать более грамотным способом?
Последний раз редактировалось Vlasil 04 апр 2018, 20:10, всего редактировалось 1 раз.
Vlasil
UNец
 
Сообщения: 3
Зарегистрирован: 23 мар 2018, 10:42

Re: Перемещение объекта кодом по определённой траектории

Сообщение Anonymyx 03 апр 2018, 20:54

Массив координат (целей), переменная для хранения текущей цели, если дистанция до текущей цели меньше, допустим, 0.003f, то текущей целью становится index+1, т.е. следующая из массива. Если дошли до конца массива, возвращаемся на 0 индекс.

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

Re: Перемещение объекта кодом по определённой траектории

Сообщение Vlasil 04 апр 2018, 13:33

Спасибо за ответ.
Не получается поменять индекс элементу массива (буду очень благодарен, если вы покажете как это делать в коде).
Изменение направления получилось только за счёт присваивания переменной "CurrentTarget" позицию другого элемента.
Подскажите пожалуйста, на правильном ли я пути?
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PerimeterMotionArray : MonoBehaviour
{
   
    public GameObject[] targets = new GameObject[4];
    public float speed = 5.0f;
    private Vector3 CurrentTarget;
    public float distanсe;

        void Start ()
    {
        transform.position = new Vector2(-15, -5);

        targets = GameObject.FindGameObjectsWithTag("target");

        targets[0].transform.position = new Vector2(8.0f, -5.0f);
        targets[1].transform.position = new Vector2(8.0f, 5.0f);
        targets[2].transform.position = new Vector2(-8.0f, 5.0f);
        targets[3].transform.position = new Vector2(-8.0f, -5.0f);

        CurrentTarget = targets[0].transform.position;
    }


    void FixedUpdate ()
    {
       
        distanсe = Vector3.Distance(transform.position, CurrentTarget);
        transform.position = Vector3.MoveTowards(transform.position, CurrentTarget, Time.deltaTime * speed);
        Debug.Log("Move to right")

        if (distanсe < 0.003f)
        {
            CurrentTarget = targets[1].transform.position;
            Debug.Log("Change index");
        }
    }
}
 
Vlasil
UNец
 
Сообщения: 3
Зарегистрирован: 23 мар 2018, 10:42

Re: Перемещение объекта кодом по определённой траектории

Сообщение djon801 04 апр 2018, 16:18

Debug.Log("Move to right") где ; ?
где переменная speed?
Это у Вас вообще по сути не работает
может так!Как человек выше описал
Синтаксис:
Используется csharp
 public GameObject[] targets = new GameObject[4];
    public Vector2[] coordinats = new Vector2[4];
    public int speed;
    private Vector3 CurrentTarget;
    private float distanсe;
    private int index = 0;
    void Start()
    {
        transform.position = new Vector2(-15, -5);
        for (int i = 0; i < 4; i++)
        {
            targets[i].transform.position = coordinats[i];
        }
        CurrentTarget = targets[0].transform.position;
    }
    void FixedUpdate()
    {
        distanсe = Vector3.Distance(transform.position, CurrentTarget);
        transform.position = Vector3.MoveTowards(transform.position, CurrentTarget, Time.deltaTime * speed);
     
        if (distanсe < 0.003f)
        {
           
            CurrentTarget = targets[index++].transform.position;
        }
        else if(index == 4)
        {
            index = 0;
        }
    }

Изображение
Последний раз редактировалось djon801 04 апр 2018, 16:51, всего редактировалось 1 раз.
Аватара пользователя
djon801
Старожил
 
Сообщения: 506
Зарегистрирован: 03 май 2014, 15:08

Re: Перемещение объекта кодом по определённой траектории

Сообщение Anonymyx 04 апр 2018, 18:03

Синтаксис:
Используется csharp
 [SerializeField] Vector3[] vectors;
    [SerializeField] Vector3 currentTarget;

    [SerializeField] float velocity;

    int currentIndex;

    private void Start()
    {
        currentTarget = vectors[0];
    }

    void Update ()
        {
        if (Vector3.Distance(transform.position, currentTarget) < 0.003f)
            currentTarget = vectors[currentIndex == vectors.Length ? currentIndex = 0 : currentIndex++];

        transform.position = Vector3.MoveTowards(transform.position, currentTarget, velocity * Time.deltaTime);
    }


Зачем создавать GameObject'ы, если нужна просто позиция?
Аватара пользователя
Anonymyx
Адепт
 
Сообщения: 1973
Зарегистрирован: 05 апр 2015, 15:55

Re: Перемещение объекта кодом по определённой траектории

Сообщение djon801 04 апр 2018, 18:16

Anonymyx писал(а):
Синтаксис:
Используется csharp
 [SerializeField] Vector3[] vectors;
    [SerializeField] Vector3 currentTarget;

    [SerializeField] float velocity;

    int currentIndex;

    private void Start()
    {
        currentTarget = vectors[0];
    }

    void Update ()
        {
        if (Vector3.Distance(transform.position, currentTarget) < 0.003f)
            currentTarget = vectors[currentIndex == vectors.Length ? currentIndex = 0 : currentIndex++];

        transform.position = Vector3.MoveTowards(transform.position, currentTarget, velocity * Time.deltaTime);
    }


Зачем создавать GameObject'ы, если нужна просто позиция?

Разговора нет! По професиональнее)))
Мне тоже не понятно зачем там GameObject.Может там в дальнейшем они будут передвигаться как то.а что то будет там маневрировать за ними.Но в любом случае у Вас по красивее получилось :)
Аватара пользователя
djon801
Старожил
 
Сообщения: 506
Зарегистрирован: 03 май 2014, 15:08

Re: Перемещение объекта кодом по определённой траектории

Сообщение djon801 04 апр 2018, 18:20

Anonymyx вопросик не большой,не по теме правда.В чём разница if и if{}
Мне например удобнее со скобками,тогда код форматируется и читается удобнее.Или есть ещё что то в этих скобках или в их отсутствии?
и ещё не понятно как отрабатывает эта строчка,какую роль выполняет (?)?
Синтаксис:
Используется csharp
currentTarget = vectors[currentIndex == vectors.Length ? currentIndex = 0 : currentIndex++];
Последний раз редактировалось djon801 04 апр 2018, 18:25, всего редактировалось 1 раз.
Аватара пользователя
djon801
Старожил
 
Сообщения: 506
Зарегистрирован: 03 май 2014, 15:08

Re: Перемещение объекта кодом по определённой траектории

Сообщение Anonymyx 04 апр 2018, 18:24

Ну если после оператора if следует только 1 выражение, то можно скобки опустить.
А так, технически вроде никакой разницы, чисто визуальная.

и ещё не понятно как отрабатывает эта строчка,какую роль выполняет (?)?

https://docs.microsoft.com/ru-ru/dotnet ... l-operator
То же самое что и if() else(), там пример есть.
Аватара пользователя
Anonymyx
Адепт
 
Сообщения: 1973
Зарегистрирован: 05 апр 2015, 15:55

Re: Перемещение объекта кодом по определённой траектории

Сообщение djon801 04 апр 2018, 18:32

[quote="Anonymyx"][/quote]
Спасибо за ответы! да я уже тоже нашёл за оператор (?).Но там бывает так сложно описывают,трудно для восприятия.Но вроде вникать стал
Аватара пользователя
djon801
Старожил
 
Сообщения: 506
Зарегистрирован: 03 май 2014, 15:08

Re: Перемещение объекта кодом по определённой траектории

Сообщение Vlasil 04 апр 2018, 19:08

Спасибо огромное за ответы!
Код идеален!
Чувствовал, что вопрос решается с помощью тернарного оператора гораздо элегантнее, но не хватило знаний его применить.
GameObject создавал по причине того, что просто ступил. Забыл, что можно просто объявить массив и в инспекторе всё настроить.
Ещё раз спасибо!
Vlasil
UNец
 
Сообщения: 3
Зарегистрирован: 23 мар 2018, 10:42


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

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

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