我想说明按两个替换球排序的过程。就像这张图片一样;插图,但有了球,你能帮我做吗?
循环内应该有一些延迟来说明该过程,但我无法正确制作,当我单击排序按钮时,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++)
没有-1
Beacuse 长度从 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
它会对它进行一次排序,然后它会一次又一次地检查它,没有结束