我想用两个替换球来说明两个排序的过程。就像在这张图片中一样; illustration但是Balls,你可以帮我做吗?
循环内部应该有一些延迟用于说明过程,但是我无法正确地进行操作,当我单击排序按钮时,Unity会让人感到烦恼。
随机化后,randomized balls的面是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);
}
}
}
}
答案 0 :(得分:0)
你的代码中有很多错误
第一个:你不应该写
`for (int i = 0; i < instantiatedObjects.Length - 1; i++)`
改为写
for (int i = 0; i < instantiatedObjects.Length; i++)
没有-1
Beacuse长度从1开始计数,所以如果你在数组中有五个元素,它将返回5并且循环将完成5次,所以如果你想添加-1
你应该输入
for (int i = 0; i <= instantiatedObjects.Length - 1; i++)
等于或小于符号(&lt; =)
第二个:您不应该输入While j > 0
因为它被认为是无限循环J = 0 + 1所以j&gt; 0
如果j仍然大于零,那么它会在while循环中执行所有代码,然后一次又一次地执行所有代码,这就是为什么统一冻结
无限循环的例子是:
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
它会对它进行一次排序然后它会一次又一次地检查它而不是结束