在Unity 3D中均匀分布对象以填充弯曲空间的最佳方法是什么?

joh*_*117 5 distribute unity-game-engine placement evenly

我想用椅子(在编辑器中)填充这个礼堂座位区,让它们都面对相同的焦点(舞台)。然后,我将在运行期间将椅子随机地放进不同的人。每次跑步后,椅子应保持不变,但应将人员清理干净,以便在下次跑步时,人群看起来有所不同。

座位区目前没有连接对撞机,椅子或人员也没有。

在此处输入图片说明

我发现这段代码已经完成了椅子的旋转操作,因此它们的目标是同一焦点。但是我仍然很好奇是否有更好的方法可以做到这一点。

//C# Example (LookAtPoint.cs)
using UnityEngine;
[ExecuteInEditMode]
public class LookAtPoint : MonoBehaviour
{
    public Vector3 lookAtPoint = Vector3.zero;

    void Update()
    {
        transform.LookAt(lookAtPoint);
    }
}
Run Code Online (Sandbox Code Playgroud)

其他截图

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明

zwc*_*oud 5

您可以编写一个编辑器脚本来自动均匀地放置它们。在这个脚本中,

我在以下代码中不处理世界和本地/模型空间。记得在需要的时候去做。

  1. 生成网格中从 +y 到 -y 的平行光线。该网格的补丁大小取决于您的椅子和网格(弯曲空间)的大小。以获得合适的补丁大小。获取椅子的边界框(A)和弯曲空间网格(B),然后将它们分开(B/A)并将结果用作面片大小。

    Mesh chairMR;//Mesh of the chair
    Mesh audiMR;//Mesh of the auditorium
    var patchSizeX = audiMR.bounds.size.X;
    var patchSizeZ = audiMR.bounds.size.Z;
    var countX = audiMR.bounds.size.x / chairMR.bounds.size.x;
    var countZ = audiMR.bounds.size.z / chairMR.bounds.size.z;
    
    Run Code Online (Sandbox Code Playgroud)

    因此,您需要生成的光线数量约为countX*countZ。补丁大小为(patchSizeX, patchSizeZ).

    然后,可以确定光线的原点:

    //Generate parallel rays that come form +y to -y.
    List<Ray> rays = new List<Ray>(countX*countZ);
    for(var i=0; i<countX; ++i)
    {
        var x = audiMR.bounds.min.x + i * sizeX + tolerance /*add some tolerance so the placed chairs not intersect each other when rotate them towards the stage*/;
        for(var i=0; i<countZ; ++i)
        {
            var z = audiMR.bounds.min.z + i * sizeZ + tolerance;
            var ray = new Ray(new Vector3(x, 10000, z), Vector3.down);
            //You can also call `Physics.Raycast` here too.
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 获取放置椅子的位置。

    1. 将 MeshCollider 临时附加到您的网格物体上
    2. 对于每条射线,Physics.Raycast它(您可以在没有放置椅子的地方放置一些障碍物。为这些障碍物设置特殊图层。)
    3. 获取生命值并在生命值处创建一把椅子并将其旋转到舞台
  3. 重用这些生命值来将你的人员安置在运行时。

    将它们中的每一个转换为模型/局部空间点。并通过序列化将它们保存到json或 asset 中,以便稍后在运行时使用:随机放置人员。