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 ();
}
}
}
Есть ли лучший / более ясный способ сделать это? Как я могу сделать это процедурно?