用于arraylist的Unity Gizmos

时间:2014-11-03 12:20:25

标签: c# arrays loops unity3d

如何将Gizmos应用于平行阵列? 我现在的代码是,Gizmos完成它的工作。 但由于它是一个循环,它会闪烁,这意味着通过循环并使用方法

绘制一个数组
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++;

    }
}

1 个答案:

答案 0 :(得分:0)

Unity和SceneView需要在每次更改时重绘整个区域。没有办法画出会留下来的东西。如果你希望它保持不变,你必须在每次重绘SceneView时重绘它。与运行时不同,在编辑时,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])
        );
    }
}