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

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

СообщениеДобавлено: 28 сен 2015, 17:07
ADev
Здравствуйте!
Извините за непонятное название, просто ничего другого придумать не смог.

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

Заранее спасибо!

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

СообщениеДобавлено: 28 сен 2015, 17:15
samana
Здравствуйте. Это у вас вид сверху или сбоку? Используете ли физику?

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

СообщениеДобавлено: 28 сен 2015, 17:51
ADev
Вид сверху. Физику использую.

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

СообщениеДобавлено: 28 сен 2015, 18:22
samana
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);    // добавляем к физическому телу вашего объекта силу
                                                                    // с найденным направлением
                }
            }
        }
    }
}
 

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

СообщениеДобавлено: 28 сен 2015, 18:45
ADev
А если у меня 2D игра и можно нажать по любому месту, то можно не использовать Raycast?

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

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

                    _rb.AddForce(moveVector.normalized * force);    // добавляем к физическому телу вашего объекта силу
                                                                    // с найденным направлением
 

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

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

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

СообщениеДобавлено: 28 сен 2015, 19:17
ADev
Я решил это вот как:

Синтаксис:
Используется 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 векторами. Может есть способ перевести попроще?

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

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


А здесь, ось z автоматически уберётся. Возможно это сработает и в коде выше.
Синтаксис:
Используется csharp
Vector2 playerPos = playerTransform.position;

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

СообщениеДобавлено: 28 сен 2015, 19:50
ADev
Спасибо, сработало! :)

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

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

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


И он мне это выделил в отдельную функцию. Что будет быстрее? Просто так посчитать или через функцию?

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

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