C# процедурное поколение - как сделать всегда установленный номер?

Хорошо, работаем в Unity и пытаемся вывести динамику этой основной игры. По сути, у меня есть все эти 3D-платформы, которые имеют определенный вес (вес означает, как часто они появляются в массиве, из которого игра может выбрать следующую платформу) -

Прямо сейчас каждая платформа имеет набор из 4 основных направлений (плюс вверх / вниз, но у всех есть такие), где она может породить следующую платформу, на которую игрок может перейти, иначе они упадут. Это перечисление, и я установил это вручную.

Перед тем, как игрок делает первые шаги на платформе, он находится на полпути, поэтому выглядит как маркер. После того, как они ступают, получается 1 альфа и, следовательно, не выглядит как "маркер", см. Здесь:

введите описание изображения здесь

Когда игрок ходит через джойстик, я хочу, чтобы платформы появлялись в квадратных "ярусах" - скажем, для платформ длиной 10 - и я сделаю что-нибудь, когда уровень будет заполнен. Моя проблема в том, что я пробовал несколько разных систем, но не знаю, как это реализовать. Модель изображения, где есть различные конфигурации, но в конечном итоге предел 10х10:

введите описание изображения здесь

Вот мой метод порождения, основанный на направлении - проблема в том, что направление субъективно, основано на точке зрения объекта игрока:

foreach(Direction d in directionsAvailable)
        {
            Vector3 pos = transform.position;
            float dist = container.GetComponent<Renderer> ().bounds.size.x;

            switch (d) {
            case Direction.Backward:
                pos = new Vector3 (pos.x, pos.y, pos.z-dist);
                break;
            case Direction.Forward:
                pos = new Vector3 (pos.x, pos.y, pos.z+dist);
                break;
            case Direction.Left:
                pos = new Vector3 (pos.x-dist, pos.y, pos.z);
                break;
            case Direction.Right:
                pos = new Vector3 (pos.x+dist, pos.y, pos.z);
                break;
            case Direction.Down:
                pos = new Vector3 (pos.x, pos.y-(2*dist), pos.z);
                break;
            case Direction.Up:
                pos = new Vector3 (pos.x, pos.y+(2*dist), pos.z); //hits itself, might have to do more dist
                break;
            default:
                break;
            }

Вот как я проверяю, находится ли платформа в позиции или позиция открыта:

public Platform PlatAtPos(Vector3 pos)
    {
        platformsSpawned = GameObject.FindObjectsOfType<Platform>();
        foreach(Platform p in platformsSpawned)
        {
            if(p.originPos == pos || p.transform.position == pos) //or just delete one of them
            {
                return p;
            }
        }
        return null;
    }
public void checkForPlatsAround()
    {
        gameController = GameObject.FindObjectOfType<GameController> ();
        float dist = container.GetComponent<Renderer> ().bounds.size.x;
        foreach (Platform.Direction dir in Enum.GetValues(typeof(Platform.Direction))) {
        Vector3 pos = transform.position;

            switch (dir) {
            case Direction.Backward:
                pos = new Vector3 (pos.x, pos.y, pos.z-dist);
                break;
            case Direction.Forward:
                pos = new Vector3 (pos.x, pos.y, pos.z+dist);
                break;
            case Direction.Left:
                pos = new Vector3 (pos.x-dist, pos.y, pos.z);
                break;
            case Direction.Right:
                pos = new Vector3 (pos.x+dist, pos.y, pos.z);
                break;
            case Direction.Down:
                pos = new Vector3 (pos.x, pos.y-(2*dist), pos.z);
                break;
            case Direction.Up:
                pos = new Vector3 (pos.x, pos.y+(2*dist), pos.z); //hits itself, might have to do more dist
                break;
            default:
                break;
            }
            if(gameController.PlatAtPos(pos) != null)
            {
                gameController.PlatAtPos (pos).showAsMarker ();
            }
        }
    }

Есть ли лучший / более ясный способ сделать это? Как я могу сделать это процедурно?

0 ответов

Другие вопросы по тегам