【问题标题】:Sorting gameobjects using sorting algorithms使用排序算法对游戏对象进行排序
【发布时间】:2018-05-22 14:12:27
【问题描述】:

我想在 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 的新手。

【问题讨论】:

  • 请显示名称的样子。也许是“层次结构”选项卡的屏幕截图?
  • 球体,球体 (1),球体 (2),球体 (3),球体 (4),您可以在 link 看到。
  • List 中的对象排序后会发生什么?我不知道你接下来会期待什么
  • 排序后我想用排序的球体更改球体的位置,link 随机化后,我希望在使用排序按钮后对它们进行排序。 link

标签: c# sorting unity3d swap


【解决方案1】:

首先你可以做的是存储一个旧的 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

【讨论】:

  • +1。 tl; dr:您按对象名称对列表进行排序,然后在未排序的对象列表上应用排序位置。现在对象按排序顺序显示。
  • Result这是结果,可能是因为球体的名称可能是?
  • 很难看出哪个对象是哪个对象,哪个对象生成在哪里。目前,此代码仅按对象最初生成的位置进行排序。
  • 我不知道为什么,但我认为有一个额外的球保持在第二和第三的位置,所以它们似乎合并了,所以看不到,我认为旧的球需要被破坏在对生成的进行排序后,但顺序仍然有问题。排序后,它按 1 # # 5 2 对未排序的排序。:D Closer
  • 看起来你正在尝试在运行时编译脚本,不推荐,你是否也可以尝试在启动时检查列表的顺序和位置是否正确?请只使用一组对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-21
  • 2022-01-25
  • 1970-01-01
相关资源
最近更新 更多