Создание границы кубов вокруг экрана - PullRequest
0 голосов
/ 22 января 2020

Я пытаюсь динамически сгенерировать границу вокруг экрана / области просмотра (?), Используя стандартный объект куба. В настоящее время я сосредотачиваюсь только на создании границы на левой стороне, но это оказывается трудным.

Я близок со следующим примером, но я уверен, что у меня неверные расчеты, и мне может повезти, что он работает таким образом. Как вы можете видеть, выравнивание по оси Y не является правильным. Моя цель - иметь 10 идеально ровных кубов слева и справа от экрана и 5 сверху и снизу.

public GameObject WallPeice;

// Start is called before the first frame update
void Start()
{

}

// Update is called once per frame
void Update()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
        BuildWall();
    }
}


public void BuildWall()
{

    var height = Camera.main.orthographicSize * 2.0f * Screen.height / Screen.width;


    var screenSize = Camera.main.ScreenToWorldPoint(new Vector3(Screen.width, Screen.height));

    var mainHeight = height / 20;

    var screenHeight = Math.Abs(-screenSize.y) + screenSize.y;

    var screenDivided = screenHeight / 10;

    for (float i = -screenSize.y - (screenDivided / 2); i < (screenSize.y - (screenDivided / 2)); i+= screenDivided)
    {
        var cube = Instantiate(WallPeice, new Vector3(-screenSize.x, i + (height / 20), 0), new Quaternion(0, 0, 0, 0));

    }



}

Current implementation

1 Ответ

2 голосов
/ 22 января 2020

Во-первых, я получу положение углов, используя Camera.ViewportToWorldPoint.

Вы хотите убедиться, что вы не удваиваете углы, пропуская кубы, которые уже были размещены.

В вопросе не упоминается размер объектов WallPeice [sic], поэтому вам нужно поиграть с коэффициентом масштабирования, чтобы размер кубов соответствовал нужному размеру. быть 10х5.

В целом, это может выглядеть так:

public void BuildWall()
{

    Camera mainCam = Camera.main;

    Vector3 lowerLeftScreenWorld = mainCam.ViewportToWorldPoint(Vector3.zero);
    Vector3 upperRightScreenWorld = mainCam.ViewportToWorldPoint(new Vector3(1f,1f,0f));

    // 9f because 10 cubes means 9 intervals between them
    distancePerCube = (upperRightScreenWorld.y-lowerLeftScreenWorld.y)/9f;

    float cubeScalingFactor = 1f;

    Vector3 cubeScale = Vector3.one * cubeScalingFactor;

    // left/right walls
    for (float yPos = lowerLeftScreenWorld.y ; yPos <= upperRightScreenWorld.y 
         ; yPos += distancePerCube)
    {
        MakeCube(lowerLeftScreenWorld.x, yPos, cubeScale);
        MakeCube(upperRightScreenWorld.x, yPos, cubeScale);
    }

    // top/bottom walls
    for (float xPos = lowerLeftScreenWorld.x + distancePerCube 
         ; xPos + distancePerCube <= upperRightScreenWorld.x 
         ; xPos += distancePerCube)
    {
        MakeCube(xPos, upperRightScreenWorld.y, cubeScale);
        MakeCube(xPos, lowerLeftScreenWorld.y, cubeScale);
    }

}

private void MakeCube(float xPos, float yPos, Vector3 cubeScale)
{
    GameObject cube = Instantiate(WallPeice, new Vector3(xPos, yPos, 0f), 
            Quaternion.identity);
    cube.transform.localScale = cubeScale;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...