Unity - Переместить (Shuffle) несколько GameObject из их текущей позиции в новую позицию назначения - PullRequest
0 голосов
/ 21 октября 2019

Я пытаюсь сделать функцию перемешивания, чтобы я мог изменить порядок нескольких GameObjects.

У меня есть несколько "букв" (GameObjects) в круге, и когда я нажимаю "Перемешать"Мне просто нужно изменить их положение, но показать, что буква переместилась на новую позицию.

enter image description here

Я пытался: Vector3.Lerp(startPosition, targetPosition, Time.time/2)

или

Vector3.MoveTowards(startPosition, targetPosition, Time.time/2)

, но он перемещается неправильно.

Мне удается сделать это следующим образом:

Vector3 tempPosition = object1.transform.position; object1.transform.position = object2.transform.position; object2.transform.position = tempPosition;

, но я могу двигаться только 2 GameObjects, не показывая никакого движения.

1 Ответ

1 голос
/ 21 октября 2019

Получите список всех букв, используйте сопрограмму для перемещения букв, и в начале сопрограммы определите, куда каждая буква движется и куда движется, затем используйте lerp в каждом кадре, чтобы установить положение:

public float letterMoveTime = 1f; // duration of shuffle movement (in seconds)
List<GameObject> letters;
IEnumerator shuffleCoroutine;

void Awake()
{
    letters = new List<GameOobject>();
    letters.AddRange(GameObject.FindGameObjectsWithTag("Letter"));

    shuffleCoroutine = null;
}

public void StartShuffle() // call this on button click
{
    if (shuffleCoroutine != null) return;

    shuffleCoroutine = DoShuffle();
    StartCoroutine(shuffleCoroutine);
}

IEnumerator DoShuffle()
{
    List<Vector3> startPos = new List<Vector3>();
    List<Vector3> endPos = new List<Vector3>();
    foreach (GameObject letter in letters)
    {
        startPos.Add(letter.transform.position);
        endPos.Add(letter.transform.position);
    }

    // shuffle endPos
    for (int i = 0 ; i < endPos.Count ; i++) {
         Vector3 temp = endPos[i];
         int swapIndex = Random.Range(i, endPos.Count);
         endPos[i] = endPos[swapIndex];
         endPos[swapIndex] = temp;
     }

     float elapsedTime = 0f;

     while (elapsedTime < letterMoveTime)
     {
         // wait for next frame
         yield return null;

         // move each letter
         elapsedTime  = Mathf.Min(letterMoveTime, elapsedTime+Time.deltaTime);
         float t = elapsedTime / letterMoveTime;

         for (int i = 0 ; i < startPos.Count ; i++) {
             letter[i].transform.position = Vector3.lerp(startPos[i],endPos[i],t);
         }
     }

     // allow shuffling to occur again
     shuffleCoroutine = null;
}
...