用于数组列表的Unity Gizmo

本文关键字:Unity Gizmo 列表 数组 用于 | 更新日期: 2023-09-27 18:29:03

如何将Gizmo应用于位置的并行数组?我现在的代码是,Gizmo完成了它的工作。但由于它是一个循环,它会闪烁,这意味着要通过循环并使用方法绘制阵列

Gizmos.DrawRay();

但我不希望它穿过循环,画一条射线,然后去掉它,用一个新的位置重复这个过程。我希望它为数组中的每个元素绘制一条光线,并将光线固定在不会被重写的地方。这是我当前的代码。

编辑:

void Platform_Position_Scale_Generator(int i) {
    posX[i] = Random.Range(minPosRange, maxPosRange + 1);
    posY[i] = Random.Range(minPosRange, maxPosRange + 1);
    posZ[i] = 0;
    scaleX[i] = Random.Range(minScaleRange, maxScaleRange + 1);
    scaleY[i] = 1;
    scaleZ[i] = 1;
}
void Platform_Generator(int i) {
    platformPrefabPosition[i].x = posX[i];
    platformPrefabPosition[i].y = posY[i];
    platformPrefabPosition[i].z = posZ[i];
    Instantiate(platformPrefab, platformPrefabPosition[i], Quaternion.identity);
    platformPrefab.transform.localScale = new Vector3(scaleX[i], 1, 1);

}
void OnDrawGizmos() {
    if(numOfGeneratedPlatforms < numOfPlatformsToGenerate) {
        Platform_Position_Scale_Generator(numOfGeneratedPlatforms);
        Platform_Generator(numOfGeneratedPlatforms);
        Gizmos.color = Color.blue;
        Gizmos.DrawRay(new Vector3((posX[numOfGeneratedPlatforms]), (posY[numOfGeneratedPlatforms]), (posZ[numOfGeneratedPlatforms])), transform.TransformDirection(Vector3.up));
        numOfGeneratedPlatforms++;
    }
}

用于数组列表的Unity Gizmo

Unity和SceneView每次发生变化时都需要重新绘制整个区域。没有办法画出会留下来的东西。如果你想让它保持不变,你必须在每次重新绘制SceneView时重新绘制它。与运行时不同,在edittime,Unity只在某个事件发生时重新绘制窗口。

因此,如果你想为每个位置画一条线,每次调用它时,你都必须在OnDrawGizmos中为每个位置绘制一条线。SceneView的工作原理与GameView相同。但是,它使用不可见的摄影机从编辑器的角度渲染场景。每次重新绘制时,SceneView都将被清除并完全重新绘制。在此过程中,Unity将调用您的OnDrawGizmos方法,在该方法中,您必须绘制希望在场景中可见的所有内容。

编辑

要为所有元素绘制所有线条,只需使用一个循环,如下所示:

void OnDrawGizmos()
{
    Gizmos.color = Color.blue;
    for(int i = 0; i < posX.Length; i++)
    {
        Gizmos.DrawRay(new Vector3(posX[i], posY[i], posZ[i]), transform.up);
    }
}

这将从列表中的每个点向上画一条一个单位长的线。正如我所说,如果你使用位置,通常使用单个数组更容易,并且使用Vector3具有类型:

public Vector3[] positions;

或者,如果你必须经常添加/删除项目,请使用通用列表:

public List<Vector3> positions

ps:在我看来,你想向上画一条线有点掉队。如果你想从一点到另一点画一条线,你必须这样做:

void OnDrawGizmos()
{
    Gizmos.color = Color.blue;
    // important to reduce the upper limit by one since we add 1 inside the loop
    for(int i = 0; i < posX.Length-1; i++)
    {
        Gizmos.DrawLine(
            new Vector3(posX[i], posY[i], posZ[i]),
            new Vector3(posX[i+1], posY[i+1], posZ[i+1])
        );
    }
}