我想用椅子(在编辑器中)填充这个礼堂座位区,让它们都面对同一个焦点(舞台)。然后我将随机填充不同人的椅子(在运行时)。每次运行后,椅子应该保持不变,但应该清理人员,以便在下一次运行中人群看起来不同。
座位区目前没有连接对手,椅子或人也没有。
我发现这个代码已经照顾好了旋转椅子,所以他们瞄准了同一个焦点。但是,如果有更好的方法可以做到这一点,我仍然很好奇。
//C# Example (LookAtPoint.cs)
using UnityEngine;
[ExecuteInEditMode]
public class LookAtPoint : MonoBehaviour
{
public Vector3 lookAtPoint = Vector3.zero;
void Update()
{
transform.LookAt(lookAtPoint);
}
}
其他截图
答案 0 :(得分:3)
您可以write a editor script自动均匀放置它们。在这个脚本中,
我不会在以下代码中处理世界和本地/模型空间。请记住在需要时执行此操作。
在网格中生成来自+ 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;
因此,您需要生成的光线数量约为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.
}
}
获取放置椅子的位置。
Physics.Raycast
它(你可以在没有放置椅子的地方放置一些障碍物。为那些障碍物设置special layer。)重复使用这些生命值,让您的员工在运行时。
将每个转换为模型/本地空间点。并通过序列化将它们保存到json或资产中以供以后在运行时使用:随机放置人员。