2016-12-06 7 views
2

У меня есть сценарий, который в настоящее время меняет положение двух объектов. Объекты имеют одинаковый размер и форму, так что, когда они меняются местами, это мгновенно, и вы не видите, что они двигаются к позиции. Как я могу сделать это так, чтобы скорость движения, когда эти два объекта меняются местами, так что вы можете видеть их на самом деле движущиеся позиции. Мне также нужно выяснить, как добавить третий объект, чтобы они все переключали позиции случайным образом. Что-то, как это моя конечная цель: http://i249.photobucket.com/albums/gg240/OldNewby4507/shell-game-animated.gifКак я могу поменять местами двух объектов на разных скоростях вместо мгновенного обмена?

using UnityEngine; 
using System.Collections; 

public class NewBehaviourScript : MonoBehaviour 
{ 

    public float movementSpeed = 10; 
    public GameObject g1; 
    public GameObject g2; 
    public Vector3 vec1; 
    public Vector3 vec2 = new Vector3(2F, 2F, 2F); 
    public bool swapBack = false; 

    void Start() 
    { 
     g1 = GameObject.Find("object1"); 
     g2 = GameObject.Find("object2"); 
     vec1 = new Vector3(g1.gameObject.transform.position.x, g1.gameObject.transform.position.y, g1.gameObject.transform.position.z); 
     vec2 = new Vector3(g2.gameObject.transform.position.x, g2.gameObject.transform.position.y, g2.gameObject.transform.position.z); 

    } 

    void Update() 
    { 
     if (Input.GetMouseButtonDown(0)) 

     { 
      vec1 = g1.gameObject.transform.position; 
      vec2 = g2.gameObject.transform.position; 
      g1.gameObject.transform.position = vec2; 
      g2.gameObject.transform.position = vec1; 
     } 
    } 
} 

сейчас моя movementSpeed ​​переменная не используется.

+2

Обратите внимание, что если вы остановились на одном из ответов на ваш [предыдущий вопрос] (http://stackoverflow.com/questions/41001473/how-do-i-get-an-object-to-move-and- swap-places-with-another-object-on-a-mouse-c), вы должны рассмотреть возможность принятия одного из них. В качестве альтернативы, подайте свой собственный ответ на вопрос. – Serlite

ответ

1

Вы можете использовать Slerp или любой другой метод Vector3. Вы можете использовать Lerp.

Вы также можете использовать библиотеки, предлагающие операции Tweening, такие как iTween среди множества других в хранилище активов, которые позаботятся о вас для перехода.

2

Путь я бы решить это следующее:

Вам нужно создать функцию, которая вызывается, например, MovePath. MovePath будет определяться формулой, которая определяет, как объект перемещается из точки A в точку B (это может быть линейно, exp, log и т. Д.). MovePath принимает три параметра: vector Start, vector End и int или double MoveSpeed. Для перехода от точки A к точке B будут выполняться шаги, равные MoveSpeed. Таким образом, вы рассчитываете позиции на каждом шагу.

Обновление необходимо будет изменить так, чтобы в качестве параметра потребовалось значение Int MoveSpeed. Обновление будет продолжать обновляться с использованием метода movepath до тех пор, пока векторное начало не станет концом вектора. Вы будете вызывать MovePath дважды (по одному для каждого перемещаемого объекта), пока позиция g1 не станет g2, а позиция g2 станет g1. Обновление будет отслеживать, когда G1 == G2 и G2 == G1 относительно позиций и прекратить обновление после завершения.

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

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

Редактировать: есть много способов реализовать это. Другой пример - вы можете изменить MovePath так, чтобы он вызывал себя рекурсивно до тех пор, пока не будет выполнено конечное условие. Я просто хотел дать вам представление о том, как справиться с этим.

1

Я бы использовал Lerp, или Slerp. Это методы интерполяции, использующие математику, и являются довольно простыми и бесшовными. Ваш код будет выглядеть примерно так:

void Update() { 
    if (Input.GetMouseButtonDown(0)) { 
     vec1 = g1.gameObject.transform.position; 
     vec2 = g2.gameObject.transform.position; 
     g1.gameObject.transform.position = Vector3.Lerp(vec1, vec2, 0.5f); 
     g2.gameObject.transform.position = Vector3.Lerp(vec2, vec1, 0.5f); 
    } 
} 

Here является прекрасным объяснением Lerp, это может помочь вам в этом!

+1

Я пробовал этот код, они по-прежнему меняются «мгновенно», без показанного движения, есть ли способ сделать скорость так, чтобы вы могли физически видеть перевод объектов? –

+0

Я допустил ошибку, 10.0f должен быть числом от 0 до 1, попробуйте 0,5f. – KenSchnetz

+1

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

 Смежные вопросы

  • Нет связанных вопросов^_^