使用排序算法说明 Unity 中球的排序过程



我想说明按两个替换球排序的过程。就像这张图片一样;插图,但有了球,你能帮我做吗?

循环内应该有一些延迟来说明该过程,但我无法正确制作,当我单击排序按钮时,Unity 会感到不安。

随机化后,随机球的面为 5 3 2 4 1,因此它应该对 5 - 3 进行排序并显示排序然后排序 2 - 5 然后排序 4 - 5,以便需要说明替换。

我还有其他排序算法,例如选择和气泡,但我可以自己做,我想如果我能得到这个问题的答案。

按钮

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
using UnityEngine.UI;
using System.Collections;

namespace Assets
{
class Gameobjects : MonoBehaviour
{
public Button s_YourButton;
[SerializeField]
public GameObject[] Balls = new GameObject[5];

public GameObject[] instantiatedObjects= new GameObject[5];
void Start()
{
Button btn = s_YourButton.GetComponent<Button>();
//Calls the TaskOnClick method when you click the Button
btn.onClick.AddListener(TaskOnClick);
Balls[0] = GameObject.Find("5");
Balls[1] = GameObject.Find("3");
Balls[2] = GameObject.Find("2");
Balls[3] = GameObject.Find("4");
Balls[4] = GameObject.Find("1");
}
List<Vector3> vectorList = new List<Vector3>();
void Update()
{
performInsertionSort(instantiatedObjects); 
}
void TaskOnClick()
{
Fill();
//instantiatedObjects = instantiatedObjects.OrderBy(go => go.name).ToList();
//performInsertionSort(instantiatedObjects);
//for (int i = 0; i < instantiatedObjects.Length; i++)
//{
//    instantiatedObjects[i].transform.position = vectorList[i];
//}
string name = "1";
string name1 = "2";
string name2 = "3";
string name3 = "4";
string name4 = "5";
GameObject go1 = GameObject.Find(name);
GameObject go2 = GameObject.Find(name1);
GameObject go3 = GameObject.Find(name2);
GameObject go4 = GameObject.Find(name3);
GameObject go5 = GameObject.Find(name4);
//if the tree exist then destroy it
if (go1 & go2 & go3 & go4 & go5)
{
Destroy(go1.gameObject);
Destroy(go2.gameObject);
Destroy(go3.gameObject);
Destroy(go4.gameObject);
Destroy(go5.gameObject);
}
}
private void performInsertionSort(GameObject[] instantiatedObjects)
{
{
int k = 0;
for (int i = 0; i < instantiatedObjects.Length - 1; i++)
{
int j = i + 1;
while (j > 0)
{
if (string.Compare(instantiatedObjects[j - 1].name, instantiatedObjects[j].name) > 0)
{
GameObject temp = instantiatedObjects[j - 1];
instantiatedObjects[j - 1] = instantiatedObjects[j];
instantiatedObjects[j] = temp;
while (k < instantiatedObjects.Length){
instantiatedObjects[k].transform.position = vectorList[k];
}
k++; 
}
j--;
}
StartCoroutine(Example());
}
}
}
IEnumerator Example()
{
print(Time.time);
yield return new WaitForSeconds(0.5f);
print(Time.time);
}
public void Fill()
{
vectorList.Clear();
instantiatedObjects = new GameObject[5];
for (int i = 0; i < Balls.Length; i++)
{
GameObject spawnedObject = Instantiate(Balls[i]) as GameObject;
instantiatedObjects[i] = spawnedObject ;
vectorList.Add(spawnedObject.transform.position);
}
}
}
}

你的代码中有很多错误

第一个:是你不应该写

`for (int i = 0; i < instantiatedObjects.Length - 1; i++)`

而是写

for (int i = 0; i < instantiatedObjects.Length; i++)

没有-1Beacuse 长度从 1 开始计数,所以如果你在数组中有五个元素,它将返回 5 并且循环将完成 5 次,所以如果你想添加-1你应该输入

for (int i = 0; i <= instantiatedObjects.Length - 1; i++)

带等于或小于号(<=(

第二个:你不应该输入While j > 0因为它被认为是无限循环 J = 0 + 1,所以 j> 0 它将在while循环中执行所有代码,检查j是否仍然大于零,然后一次又一次地执行所有代码,这就是Unity冻结的原因 无限循环的示例是:

int x = 0;
while(1 > 0)
{
x++;
}

它永远不会去掉这两个括号,因为它是一个无限循环 有限循环示例:

int x = 0;
while(x < 10)
{
x++
}

这是一个有限循环,因为在 11 次循环之后,x 将等于 11,而 11 大于 10,因此它会转到脚本中的其余代码

第三个您应该在函数的开头键入StartCoroutine(Example());

第四个是你应该在fixedUpdate内部调用函数而不是Update因为它里面有一个叫做corutine,所以最好使用start()只对一个进行排序 因为如果你用过fixedupdte它会对它进行一次排序,然后它会一次又一次地检查它,没有结束

最新更新