使用排序算法对游戏对象进行排序
Sorting gameobjects using sorting algorithms
我想在 Unity 中使用排序算法对 5 个球体进行排序。单击排序按钮后,它们将按排序顺序交换位置。我设法为游戏对象创建了一个列表,但据我所知,它只是对列表进行排序,然后什么都不做。如何创建我想要的脚本?它将按游戏对象名称交换对象。 The Envrioment,
到目前为止我制作的代码;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
using UnityEngine.UI;
namespace Assets
{
class Gameobjects : MonoBehaviour
{
public Button s_YourButton;
[SerializeField]
private GameObject[] deck;
public List<GameObject> instanciatedObjects;
void Start()
{
Button btn = s_YourButton.GetComponent<Button>();
//Calls the TaskOnClick method when you click the Button
btn.onClick.AddListener(TaskOnClick);
}
void TaskOnClick()
{
Fill();
instanciatedObjects = instanciatedObjects.OrderBy(Sphere => Sphere.name).ToList();
}
public void Fill()
{
instanciatedObjects = new List<GameObject>();
for (int i = 0; i < deck.Length; i++)
{
instanciatedObjects.Add(Instantiate(deck[i]) as GameObject);
}
}
}
}
欢迎任何想法让我做进一步的研究,我是 Unity 的新手。
首先,您可以存储旧 Vector3 的列表。基本上 List.Add(spawnedObject.transform.position);
在 Fill()
.
的 for 循环中
然后在对它们进行排序后,循环 instanciatedObjects
并将它们设置为与 Vector3 列表相同的顺序。
List<Vector3> vectorList = new List<Vector3>();
void TaskOnClick()
{
Fill();
instantiatedObjects = instantiatedObjects.OrderBy(Sphere => Sphere.name).ToList();
for(int i = 0; i < instanciatedObjects.Count; i++)
{
instantiatedObjects[i].transform.position = vectorList[i];
}
}
public void Fill()
{
vectorList.Clear();
instantiatedObjects = new List<GameObject>();
for (int i = 0; i < deck.Length; i++)
{
GameObject spawnedObject = Instantiate(deck[i]) as GameObject;
instantiatedObjects.Add(spawnedObject);
vectorList.Add(spawnedObject.transform.position);
}
}
顺便说一句,您的代码中有一个错字:instanciatedObjects
应该是 instantiatedObjects
我想在 Unity 中使用排序算法对 5 个球体进行排序。单击排序按钮后,它们将按排序顺序交换位置。我设法为游戏对象创建了一个列表,但据我所知,它只是对列表进行排序,然后什么都不做。如何创建我想要的脚本?它将按游戏对象名称交换对象。 The Envrioment, 到目前为止我制作的代码;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
using UnityEngine.UI;
namespace Assets
{
class Gameobjects : MonoBehaviour
{
public Button s_YourButton;
[SerializeField]
private GameObject[] deck;
public List<GameObject> instanciatedObjects;
void Start()
{
Button btn = s_YourButton.GetComponent<Button>();
//Calls the TaskOnClick method when you click the Button
btn.onClick.AddListener(TaskOnClick);
}
void TaskOnClick()
{
Fill();
instanciatedObjects = instanciatedObjects.OrderBy(Sphere => Sphere.name).ToList();
}
public void Fill()
{
instanciatedObjects = new List<GameObject>();
for (int i = 0; i < deck.Length; i++)
{
instanciatedObjects.Add(Instantiate(deck[i]) as GameObject);
}
}
}
}
欢迎任何想法让我做进一步的研究,我是 Unity 的新手。
首先,您可以存储旧 Vector3 的列表。基本上 List.Add(spawnedObject.transform.position);
在 Fill()
.
然后在对它们进行排序后,循环 instanciatedObjects
并将它们设置为与 Vector3 列表相同的顺序。
List<Vector3> vectorList = new List<Vector3>();
void TaskOnClick()
{
Fill();
instantiatedObjects = instantiatedObjects.OrderBy(Sphere => Sphere.name).ToList();
for(int i = 0; i < instanciatedObjects.Count; i++)
{
instantiatedObjects[i].transform.position = vectorList[i];
}
}
public void Fill()
{
vectorList.Clear();
instantiatedObjects = new List<GameObject>();
for (int i = 0; i < deck.Length; i++)
{
GameObject spawnedObject = Instantiate(deck[i]) as GameObject;
instantiatedObjects.Add(spawnedObject);
vectorList.Add(spawnedObject.transform.position);
}
}
顺便说一句,您的代码中有一个错字:instanciatedObjects
应该是 instantiatedObjects