【问题标题】:Unity - Move (Shuffle) multiple GameObject from their current position to a new destination positionUnity - 将多个游戏对象从当前位置移动(随机播放)到新的目标位置
【发布时间】:2020-02-17 15:10:13
【问题描述】:

我正在尝试执行随机播放功能,以便可以更改多个 GameObjects 的顺序。

我在一个圆圈中有多个“字母”(GameObjects),当我点击“随机播放”时,我只需要重新排列它们的位置,但显示字母移动到新位置。

我试过了: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 而不显示任何移动。

【问题讨论】:

    标签: c# unity3d gameobject lerp


    【解决方案1】:

    获取所有字母的列表,使用协程移动字母,并在协程开始时,弄清楚每个字母从哪里移动到哪里,然后在每一帧中使用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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多