Как я могу генерировать лестницы? - PullRequest
0 голосов
/ 15 ноября 2018
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GenerateStairs : MonoBehaviour
{
    public GameObject stairsPrefab;
    public int delay = 3;
    public int stairsNumber = 5;
    public int stairsHeight = 0;
    public Vector3 stairsPosition;
    public Vector2 stairsSize;

    // Use this for initialization
    void Start ()
    {
        StartCoroutine(BuildStairs());
    }

    // Update is called once per frame
    void Update ()
    {

    }

    private IEnumerator BuildStairs()
    {
        for (float i = 0; i <= stairsSize.x; i++)
        {
            for (float k = 0; k <= stairsSize.y; k++)
            {
                stairsPosition = new Vector3(i, stairsHeight, k);
                GameObject stairs = Instantiate(stairsPrefab, stairsPosition, Quaternion.identity);
                stairs.transform.localScale = new Vector3(stairsSize.x, 1 , stairsSize.y);

                stairsHeight += 1;

                yield return new WaitForSeconds(delay);
            }
        }
    }

    private void CalculateNextStair()
    {

    }
}

Я все испортил. Например, я хочу построить 5 лестниц, но количество петель превышает размер лестницы, а не количество лестниц.

Во-вторых, он создает 10 наборов лестниц, а не 5 лестниц:

stairs

Другая проблема заключается в том, как я могу сделать так, чтобы каждая ступенька строилась медленно? Теперь просто медленно создавать с задержкой, но как я могу генерировать каждую ступеньку с задержкой?

Снимок экрана инспектора сценариев:

Inspector

Мой текущий код:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GenerateStairs : MonoBehaviour
{
    public GameObject stairsPrefab;
    public float delay = 0.3f;
    public int stairsNumber = 5;
    public int stairsPositions = 0;
    public int stairsStartPositionHeight = 0;
    public float stairsScalingHaight = 1;
    public Vector2 stairsPosition;
    public Vector2 stairsSize;

    // Use this for initialization
    void Start()
    {
        StartCoroutine(BuildStairs());
    }

    // Update is called once per frame
    void Update()
    {

    }

    private IEnumerator BuildStairs()
    {
        for (float i = 0; i <= stairsNumber; i++)
        {
            // x=0f, y=z=stairsHeight
            stairsPosition = new Vector3(0f, stairsPositions, stairsPositions);
            GameObject stairs = Instantiate(
                    stairsPrefab,
                    stairsPosition,
                    Quaternion.identity);
            stairs.transform.localScale = new Vector3(
                    stairsSize.x,
                    stairsScalingHaight,
                    stairsSize.y);

            stairsStartPositionHeight += 1;

            yield return new WaitForSeconds(delay);
        }
    }

    private void CalculateNextStair()
    {

    }
}

1 Ответ

0 голосов
/ 15 ноября 2018

Нет никакой причины перебирать размер лестницы вообще; Вы хотите перебрать stairsNumber, который еще не используется в вашем коде.

Кроме того, вам не нужно изменять x компонент вашей лестницы. Держите его на 0f (или что вам нужно).

Компоненты y и z вашего положения на лестнице (относительно начальной точки) должны быть коэффициентами stairHeight. В данном конкретном случае вы хотите, чтобы они были равны stairHeight, чтобы вы получали «квадратные» формы шагов.

private IEnumerator BuildStairs()
{
    for (int i = 0; i <= stairsNumber ; i++) {
        // x=0f, y=z=stairsHeight
        stairsPosition = new Vector3(0f, stairsHeight, stairsHeight);
        GameObject stairs = Instantiate(
                stairsPrefab, 
                stairsPosition, 
                Quaternion.identity);
        stairs.transform.localScale = new Vector3(
                stairsSize.x, 
                1f , 
                stairsSize.y);

        stairsHeight += 1f;

        yield return new WaitForSeconds(delay);
    }
}

Если вы измените stairSize на Vector3, то вы можете просто использовать stairSize непосредственно как localScale и увеличить stairsHeight на stairsSize.y вместо просто 1f.

Если вы хотите сместить начальную позицию вашей лестницы, вам нужно включить смещение. Я рекомендую хранить его отдельно от счетчика высоты, пока вам не понадобится добавить их.

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

Объединение этих изменений может выглядеть так:

Vector3 stairSize;
float stepWidthFactor=1f;
Vector3 stairsStartPosition;

private IEnumerator BuildStairs() {
    for (int i = 0; i <= stairsNumber ; i++) {

        stairsPosition = new Vector3(
                stairsStartPosition.x, 
                stairsStartPosition.y + stairsHeight,
                stairsStartPosition.z + stairsHeight*stepWidthFactor);

        GameObject stairs = Instantiate(
                stairsPrefab, 
                stairsPosition, 
                Quaternion.identity);

        stairsHeight += stairsSize.y;
        stairs.transform.localScale = stairSize;

        yield return new WaitForSeconds(delay);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...