Переместить объект до столкновения

Я хочу, чтобы мой объект продолжал двигаться в направлении цели навсегда или до тех пор, пока он не столкнется, часть столкновения я уже обработал; Тем не менее, у меня проблемы с частью движения.

Сначала я пытаюсь повернуть свою цель, используя эти строки кода

Vector2 diff = target - transform.position;
float angle = Mathf.Atan2(diff.y, diff.x) * Mathf.Rad2Deg;
transform.rotation = Quaternion.Euler(0.0f, 0.0f, angle);

Это работает отлично, и мой объект вращается в нужном мне направлении. В моем методе обновления у меня есть следующее

if (isMoving)
    {
        Vector2 f = transform.forward;
        transform.position = Vector3.MoveTowards(transform.position, target + Vector3.forward, speed * Time.deltaTime);
    }

Теперь это работает, но не достигает цели, и я знаю, почему, это имеет смысл, но не уверен, как это исправить. Объект движется к точке в правильном направлении, но я не хочу, чтобы он останавливался на цели, я хочу, чтобы он продолжал движение.

я тоже пробовал

rb.MovePosition(rb.position + f * Time.deltaTime * speed);

rb — это твердое тело2D

так же как

rb.AddForce(rb.position + f * Time.deltaTime * speed);

Но в обоих случаях объект вращается, но никогда не движется.

Я также использовал перевод и то же поведение, что и MovePosition.

P.S. это 2D игра


person Muhand Jumah    schedule 06.09.2017    source источник
comment
Опубликуйте полный код, включая обновление, триггеры столкновений и т. д.   -  person Isma    schedule 06.09.2017
comment
@Isma Спасибо, я смог решить это, используя линейное уравнение. Я ответил на свой вопрос, если вы хотите взглянуть на подход.   -  person Muhand Jumah    schedule 07.09.2017


Ответы (1)


Просматривая Интернет, я не нашел ничего, что действительно делало бы то, что я ищу, вы не можете переводить кинематический объект навсегда (очевидно, вы должны справиться с тем, что объект должен быть уничтожен в какой-то момент или что-то в этом роде, но дело не в этом). Поэтому я пошел дальше и решил написать свою собственную библиотеку, чтобы сделать это проще. Я смог достичь своей цели, используя линейное уравнение. Просто я предпринял эти шаги, чтобы решить мою проблему.

  1. В начале я получаю наклон между двумя точками
  2. Вычислить y-пересечение
  3. переведите объект, используя линейное уравнение с фиксированным значением X (шагом), каждое значение x находит соответствующее значение y и переводит объект в него.
  4. Повторите шаг 3 в FixedUpdate и все.

Конечно, это еще не все, обработка случаев, когда x = 0, что дает деление на 0 для наклона или y = 0 и т. д. Я решил все это в библиотеке. Кому интересно, вы можете проверить это здесь EasyMovement

Если вам не нужна библиотека, то вот простой код, который это сделает.

 //Start by Defining 5 variables
 private float slope;
 private float yintercept;
 private float nextY;
 private float nextX;
 private float step;
 private Vector3 direction;    //This is your direction position, can be anything (e.g. a mouse click)

В методе Начать

//step can be anything you want, how many steps you want your object to take, I prefer 0.5f
step = 0.5f;

//Calculate Slope => (y1-y2)/(x1-x2)
slope = (gameObject.transform.position.y - direction.y) / (gameObject.transform.position.x - direction.x);

//Calculate Y Intercept => y1-x1*m
yintercept = gameObject.transform.position.y - (gameObject.transform.position.x * slope);

Теперь в FixedUpdate

//Start by calculating the nextX value
//nextX
if (direction.x > 0)
    nextX = gameObject.transform.position.x + step;
else
    nextX = gameObject.transform.position.x - step;

//Now calcuate nextY by plugging everything into a line equation
nextY = (slope * nextX) + yintercept;

//Finally move your object into the new coordinates
gameObject.transform.position = Vector3.MoveTowards(gameObject.transform.position, new Vector3(nextX, nextY, 0), speed * Time.deltaTime);

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

person Muhand Jumah    schedule 07.09.2017