[Thắc Mắc] Về việc swap object trong Unity

doreamonhihidoreamonhihi Posts: 38Registered
edited October 2019 in Unity
Chào mọi người
Em muốn swap object trong Unity, cụ thể là từ một danh sách vật thể cho trước, em muốn xáo trộn lại vị trí các vật thể.
Tuy nhiên, sau khi xáo trộn lại thì nhìn trên màn hình thì vị trí của chúng vẫn như cũ, dù theo như debug thì các vật thể đã được xáo trộn rồi.
Như mọi người có thể thấy, đáng ra thứ tự từ trái sang phải sẽ là b, c , d ,e ,f , a theo như debug log bên dưới, nhưng trên màn hình thì vẫn không thay đổi.

Code shuffle em code theo như thế này:
https://docs.unity3d.com/Manual/RandomNumbers.html?fbclid=IwAR1MAbzQv0PGhdJqK6Am_ginoIuL4PUi467J9uZ2Nrdxn2vvjMC1GFhDK8s

Danh sách các kí tự kia em lấy từ 1 text có sẵn (TextMeshPro), cụ thể là cái GivenText ở kia, sau đó em tạo một mảng game object mới, instantiate từ kí letter gốc (sau đó ẩn cái letter gốc đi). 

Mọi người cho em hỏi em shuffle như thế kia có sai gì không mà sao debug báo vẫn đúng mà hiển thị lại vẫn như cũ (tức lúc chưa shuffle). Em cảm ơn. :(

Comments

  • Dang_KhoaDang_Khoa Posts: 3,861Administrators
    Bạn đưa code của bạn lên xem thử được không?   8-)
  • doreamonhihidoreamonhihi Posts: 38Registered
    edited October 2019
    Dang_Khoa said:
    Bạn đưa code của bạn lên xem thử được không?   8-)
    Bây giờ em sửa được rồi :+1:
    Lúc đầu là em tráo nội dung ở trong mảng kí tự kia, chứ k tráo vị trí của chúng nên bị thế:
    Code gốc em để ntn:
               
    for (int i = 0; i < letter_arr.Length; i++)
                {
                GameObject temp = letter_arr[i];
                //Vector3 temp = letter_arr[i].transform.position;
                    int randomIndex = Random.Range(0, letter_arr.Length);
                    letter_arr[i]= letter_arr[randomIndex];
                    letter_arr[randomIndex = temp;
                }

    Code em sửa lại để nó hoạt động nó ntn:
               
    for (int i = 0; i < letter_arr.Length; i++)
                {
                //GameObject temp = letter_arr[i];
                Vector3 temp = letter_arr[i].transform.position;
                    int randomIndex = Random.Range(0, letter_arr.Length);
                    letter_arr[i].transform.position= letter_arr[randomIndex].transform.position;
                    letter_arr[randomIndex].transform.position = temp;
                }
    Hình như trong Unity (C#) cách swap object nó hơi khác cách em hiểu như em học thuật toán thuần trước kia ^_^ (em chuyển từ bên C++ sang nên cách thức hoạt động swap trong C# em không rõ lắm ._. )



  • doreamonhihidoreamonhihi Posts: 38Registered
    À quên đính chính lại và phải chuyển cả nội dung trong object lẫn position, nếu không thì vị trí trên màn hình chuyển, nhưng nội dung lúc debug thì lại chưa chuyển :p
  • Dang_KhoaDang_Khoa Posts: 3,861Administrators
    edited October 2019
    Cần xác định rõ bạn muốn xáo trộn vị trí của object trên màn hình (position) hay là xáo trộn vị trí của object trong mảng (index).
    Code của bạn là xáo vị trí trên màn hình, chạy cũng đúng đó nhưng không được tối ưu lắm  :)
  • doreamonhihidoreamonhihi Posts: 38Registered
    edited October 2019
    Dang_Khoa said:
    Cần xác định rõ bạn muốn xáo trộn vị trí của object trên màn hình (position) hay là xáo trộn vị trí của object trong mảng (index).
    Code của bạn là xáo vị trí trên màn hình, chạy cũng đúng đó nhưng không được tối ưu lắm  :)
    Có cách nào tối ưu hơn không nhỉ, vừa chuyển được vị trí trên màn hình mà lại chuyển được vị trí trong mảng vậy ad 8-)
  • Dang_KhoaDang_Khoa Posts: 3,861Administrators
    edited October 2019
    Trong thực tế thì người ta chỉ xáo vị trí trong mảng thôi, còn vị trí trên màn hình sẽ được set dựa vào vị trí trong mảng để đồng bộ, tránh trường hợp không khớp nhau.
    Ví dụ ta có mảng letter_arr đã được sắp xếp rồi, thì chỉ cần dùng code này để sắp xếp lại vị trí các object:
    for (int i = 0; i < letter_arr.Length; i++)
    {
    letter_arr[i].transform.position = new Vector3(0, 1, 0) * i;
    }


Sign In or Register to comment.