Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 尝试创建在Unity 3D中进入球体的对象变换列表_C#_Unity3d - Fatal编程技术网

C# 尝试创建在Unity 3D中进入球体的对象变换列表

C# 尝试创建在Unity 3D中进入球体的对象变换列表,c#,unity3d,C#,Unity3d,我尝试将我的对象与周围的对象对齐,并让对象尝试获取其周围对象的平均位置,我尝试创建一个所有进入球体的对象的列表,并使用那里的变换进行计算,但是unity只接受碰撞器列表。我真的很感激一些帮助或建议,进一步的信息是,这个脚本是在同一个游戏对象的200个克隆,下面的脚本给出了错误 无法将类型“UnityEngine.Collider[]”隐式转换为“System.Collections.Generic.List” IEnumerator Flock() { Collider[] Nearb

我尝试将我的对象与周围的对象对齐,并让对象尝试获取其周围对象的平均位置,我尝试创建一个所有进入球体的对象的列表,并使用那里的变换进行计算,但是unity只接受碰撞器列表。我真的很感激一些帮助或建议,进一步的信息是,这个脚本是在同一个游戏对象的200个克隆,下面的脚本给出了错误 无法将类型“UnityEngine.Collider[]”隐式转换为“System.Collections.Generic.List”

IEnumerator Flock()
{

    Collider[] NearbyBoids = Physics.OverlapSphere(BoidVec, VisionRange, BoidMask, QueryTriggerInteraction.Collide);

    foreach (Collider Boid in NearbyBoids)
    {
        List<Transform> context = NearbyBoids;
    }
    yield return null;
}
IEnumerator Flock()
{
Collider[]NearbyBoids=Physics.OverlapSphere(BoidVec、VisionRange、BoidMask、QueryTriggerInteraction.Collide);
foreach(碰撞器Boid位于NearbyBoid)
{
列表上下文=nearbyboid;
}
收益返回空;
}

有两种方法

快速的方法是使用LINQ。为此,需要使用名称空间声明

using System.Linq;

Collider[] arrayOfNearbyTransforms = Physics.OverlapSphere(BoidVec, VisionRange, BoidMask, QueryTriggerInteraction.Collide);
List<Transform> listOfAllNearbyTransforms = arrayOfNearbyTransforms.Select(x => x.transform).ToList();
使用System.Linq;
Collider[]arrayOfNearbyTransforms=Physics.OverlapSphere(BoidVec、VisionRange、BoidMask、QueryTriggerInteraction.Collide);
列出所有NearByTransforms=arrayOfNearbyTransforms.Select(x=>x.transform.ToList();
您发布的代码的问题是您正在循环中创建一个列表。在循环中声明的变量只存在于该循环的执行过程中,因此实际上创建的列表数量与碰撞器的数量相同,而不使用任何一个

相反,您应该在循环外部创建列表,并从循环内部添加变换组件

    void Flock()
    {
        // This is the array of colliders you've gathered from nearby objects
        Collider[] NearbyBoids = Physics.OverlapSphere(BoidVec, VisionRange, BoidMask, QueryTriggerInteraction.Collide);

        // This is a brand new list. It's empty at the moment
        List<Transform> listOfAllNearbyTransforms = new List<Transform>();

        // We're looping through every collider in the array.
        foreach (Collider currentColliderReference in NearbyBoids)
        {
            // Everything that happens in here happens once for every collider.
            // The variable currentColliderReference refers to the collider we're looking at during this part of the loop. So throughout the loops execution, it will change to refer to every collider in your array, one at a time.

            // We get a reference to the current collider's transform component
            Transform transformOfCurrentCollider = currentColliderReference.transform;

            // We add that to the list of transform component
            listOfAllNearbyTransforms.Add(transformOfCurrentCollider);
        }

        // At this point listOfAllNearbyTransforms will be a list of all transforms within the area specified in your OverlapSphere() call
    }

void Flock()
{
//这是您从附近对象收集的碰撞器阵列
Collider[]NearbyBoids=Physics.OverlapSphere(BoidVec、VisionRange、BoidMask、QueryTriggerInteraction.Collide);
//这是一个全新的列表,目前是空的
List listOfAllNearbyTransforms=新列表();
//我们在阵列中的每个对撞机上循环。
foreach(碰撞器currentColliderReference in NearbyBoids)
{
//这里发生的每件事都会对每台对撞机发生一次。
//变量currentColliderReference指的是我们在循环的这一部分中查看的碰撞器。因此,在整个循环执行过程中,它将更改为指数组中的每个碰撞器,一次一个。
//我们得到了对当前碰撞器的变换组件的引用
Transform transformOfCurrentCollider=currentColliderReference.Transform;
//我们将其添加到转换组件列表中
添加(transformOfCurrentCollider);
}
//此时,listOfAllNearbyTransforms将是在Overlapphere()调用中指定的区域内的所有变换的列表
}

正如您所知,我还将返回类型更改为void。这个函数没有理由成为一个协程

虽然在这个阶段我不会作为一个协程来做这件事,但我会尽可能地保留你的代码。除非你真的想象有很多单元是1000,否则要运行的代码中最长的部分就是重叠部分

List<Transform> context = new List<Transform>();

    IEnumerator Flock()
    {
        context.Clear(); // if there are 1000s this could be costly
        Collider[] NearbyBoids = Physics.OverlapSphere(BoidVec, VisionRange, BoidMask, QueryTriggerInteraction.Collide);

        foreach (Collider Boid in NearbyBoids)
        {
            context.Add(NearbyBoids.transform);
        }
        yield return null;
    }
List context=newlist();
IEnumerator Flock()
{
context.Clear();//如果有1000个,那么成本可能会很高
Collider[]NearbyBoids=Physics.OverlapSphere(BoidVec、VisionRange、BoidMask、QueryTriggerInteraction.Collide);
foreach(碰撞器Boid位于NearbyBoid)
{
Add(NearbyBoids.transform);
}
收益返回空;
}
这将为您提供一个类级别的上下文列表,您可以从其他地方访问该列表


然后你的上下文列表将有当前的转换,但我不想经常运行它,我个人会使用一个列表和触发器。。。因此,添加到list OnNet,并从list onleave中删除..

为了减少BOID必须进行的迭代次数,让它们保留其他BOID的上下文列表可能是有意义的,这些BOID可以进入或离开您在inspector中设置为“可视区域”的触发器卷。然后,您可以让每个Boid在
Update
中计算它自己的最新上下文

大致如下:

使用System.Collections.Generic;
使用UnityEngine;
公共类Boid:单一行为
{
私有列表上下文=新列表();
专用空对撞机(对撞机其他)
{
//如果您想调用另一个Boid组件,这很好
Boid Boid=other.gameObject.GetComponent();
如果(boid!=null)
{
context.Add(other.transform);
}
}
私有无效OnTriggerExit(碰撞器其他)
{
//相当有效,需要标记boid对象
if(其他比较标记(“boidTag”))
{
context.Remove(other.transform);
}
}
私有void更新()
{
foreach(在上下文中转换otherBoid)
{
//在上下文中基于boid做一些事情
}
}
}

OK,所以您的列表只存在于for循环中,所以如果有100次,您可以将一个新变量设置为整个列表。。。但它不会去任何地方…我的计划是以某种方式遍历列表中的每个元素,并将其转换为转换数据类型。我知道它没有任何作用,但它是因为它不是一个可用的数据类型,一旦我可以转换它,它就会去某处。为什么这是一个协同程序?谢谢你的答案,但我需要解决的问题是将碰撞器列表转换成转换,在你的第二个示例代码中,你有一个名为“listOfAllNearbyTransforms”的列表但我的问题是,这个列表并不存在,我拥有的最接近的东西是“Collider[]NearbyBoids”系统,但它存储碰撞器而不是转换。第二个代码片段确实将碰撞器数组转换为碰撞器转换的列表。我会改变我的回答