Как перемещать объект, нажимая вокруг него?

Физика в Unity

Как перемещать объект, нажимая вокруг него?

Сообщение ADev 28 сен 2015, 17:07

Здравствуйте!
Извините за непонятное название, просто ничего другого придумать не смог.

Задача такая: есть объект, допустим, куб. Нужно сделать так, чтобы при нажатии на свободное место экрана, куб начинал по нарастающей скорости уходить в противоположном направлении от того места, где нажали.
То есть если нажали где то слева от куба, то он поехал вправо и наоборот.

Заранее спасибо!
ADev
UNец
 
Сообщения: 36
Зарегистрирован: 22 июл 2015, 20:25

Re: Как перемещать объект, нажимая вокруг него?

Сообщение samana 28 сен 2015, 17:15

Здравствуйте. Это у вас вид сверху или сбоку? Используете ли физику?
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Как перемещать объект, нажимая вокруг него?

Сообщение ADev 28 сен 2015, 17:51

Вид сверху. Физику использую.
ADev
UNец
 
Сообщения: 36
Зарегистрирован: 22 июл 2015, 20:25

Re: Как перемещать объект, нажимая вокруг него?

Сообщение samana 28 сен 2015, 18:22

ADev писал(а):при нажатии на свободное место экрана

Место действительно свободное, то-есть вообще ничего нет?
Допустим "свободное место" - это объект (куб) пол, у которого установлен тег Floor.
Скрипт ниже, цепляется на тот объект, который будет двигаться.

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

public class Move : MonoBehaviour
{
    private Rigidbody _rb; //кеш для твёрдого тела
    private float force = 500f; //сила толчка =)

    void Start()
    {
        _rb = GetComponent<Rigidbody>();
    }

    // Update is called once per frame
    void Update()
    {
        //если нажали ЛКМ
        if (Input.GetMouseButtonDown(0))
        {
            //пускаем луч из камеры
            RaycastHit hit;
            if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out hit))
            {
                //если луч столкнулся с полом
                if (hit.collider.CompareTag("Floor"))
                {
                    // находим направление от вашего куба до точки столкновения луча с полом
                    Vector3 moveVector = transform.position - hit.point;
                    moveVector.y = 0; // чтобы объект не двигался вверх, а только по икс и зет.

                    _rb.AddForce(moveVector.normalized * force);    // добавляем к физическому телу вашего объекта силу
                                                                    // с найденным направлением
                }
            }
        }
    }
}
 
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Как перемещать объект, нажимая вокруг него?

Сообщение ADev 28 сен 2015, 18:45

А если у меня 2D игра и можно нажать по любому месту, то можно не использовать Raycast?

То есть оставить только это:

Синтаксис:
Используется csharp
 // находим направление от вашего куба до точки столкновения луча с полом
                    Vector3 moveVector = transform.position - Input.mousePosition;
                   

                    _rb.AddForce(moveVector.normalized * force);    // добавляем к физическому телу вашего объекта силу
                                                                    // с найденным направлением
 
ADev
UNец
 
Сообщения: 36
Зарегистрирован: 22 июл 2015, 20:25

Re: Как перемещать объект, нажимая вокруг него?

Сообщение samana 28 сен 2015, 18:57

Есть нюансы. Ведь для 2d используется другая физика. И вид сверху для 2d, это на самом деле вид сбоку.
Может конкретнее вашу игру покажете, ну там скриншотик показать)
Данный код для 2d не подходит совсем.
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Как перемещать объект, нажимая вокруг него?

Сообщение ADev 28 сен 2015, 19:17

Я решил это вот как:

Синтаксис:
Используется csharp
void Update () {
                if (Input.GetMouseButton (0)) {

                        // Берем позицию нажатия
                        Vector3 dVec = Camera.main.ScreenToWorldPoint(Input.mousePosition);
                        // Переводим его в Vector2
                        Vector2 dVecD = new Vector2 (dVec.x,dVec.y);
                        // Переводим позицию игрока в Vector2
                        Vector2 playerPos = new Vector2 (playerTransform.position.x,playerTransform.position.y);

                        // Высчитываем направление
                        Vector2 movementVector = playerPos - dVecD;

                        // Добавляем силу
                        playerBody.AddForce(movementVector.normalized * force);

                       
                }
        }


Но мне кажется, что этот код не слишком эффективный, из-за всех этих переводов между 2D и 3D векторами. Может есть способ перевести попроще?
ADev
UNец
 
Сообщения: 36
Зарегистрирован: 22 июл 2015, 20:25

Re: Как перемещать объект, нажимая вокруг него?

Сообщение samana 28 сен 2015, 19:31

Есть такая ведь, как приведение типов. Например:
Синтаксис:
Используется csharp
Vector2 dVecD = (Vector2)Camera.main.ScreenToWorldPoint(Input.mousePosition);


А здесь, ось z автоматически уберётся. Возможно это сработает и в коде выше.
Синтаксис:
Используется csharp
Vector2 playerPos = playerTransform.position;
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Как перемещать объект, нажимая вокруг него?

Сообщение ADev 28 сен 2015, 19:50

Спасибо, сработало! :)

Еще вопрос, но уже не по теме:

Нашел опцию при выделении кода - рефакторинг. Насколько я знаю, это что то вроде оптимизации? Допустим я выделил код

Синтаксис:
Используется csharp
x = y + z


И он мне это выделил в отдельную функцию. Что будет быстрее? Просто так посчитать или через функцию?
ADev
UNец
 
Сообщения: 36
Зарегистрирован: 22 июл 2015, 20:25

Re: Как перемещать объект, нажимая вокруг него?

Сообщение samana 28 сен 2015, 20:19

Вызов метода в любом случае медленнее, чем выполнение кода напрямую, но это не значит, что настолько медленно и теперь надо всё писать в одной функции, нет.
Рефакторинг, это не повышение скорости выполнения кода, а организация кода для его лучшего понимания. Посмотрите в вики, там лучше объясняется. https://refactoring.guru/ru?utm_campaig ... witter.com
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск


Вернуться в PhysX

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

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