Я не застрял с моим кодом, потому что я не знаю, как его написать, но больше, потому что я разделен между двумя способами и не знаю, какой путь выбрать.
Iсначала напишу мою проблему, а затем опубликую некоторый код.
Итак, у меня есть переключатель с 4 случаями, а затем в моей функции, вызываемой случаями, у меня есть еще два случая (ifs). Я должен переписать код, используемый во всех этих случаях, но немного отличается в каждом.
Если я напишу весь код, у меня будет меньше вещей, чтобы проверить его, потому что он более производительный, но это делает код менее гибким.
private void FillDiagonalStartAndEnd(FastNoise noiseBiome, FastNoise noiseTransition)
{
switch (direction)
{
case DirectionOfBiomeCell.NE:
TransitionDiagonallyNorthEast(noiseBiome, noiseTransition); // Less checks
break;
case DirectionOfBiomeCell.SE:
towardsRight = 1;
TransitionDiagonallyED(noiseBiome, noiseTransition, new Vector2(spacePosX -1, spacePosZ + BIOME_CELL_SIZE), new Vector2(spacePosX + BIOME_CELL_SIZE - 1, spacePosZ)); // More flexible
break;
case DirectionOfBiomeCell.SW:
//TransitionLinearlySouth(noiseBiome, noiseTransition);
break;
case DirectionOfBiomeCell.NW:
//TransitionLinearlyWest(noiseBiome, noiseTransition);
break;
default:
Debug.Log("Default case in FillDiagonallyStartAndEnd");
break;
}
}
Выше, у меня есть направление NE, которое болееЯ думаю, что это перманент, а затем SE направление, которое является гибким с параметрами.
Затем в функциях:
private void TransitionDiagonallyED(FastNoise noiseBiome, FastNoise noiseTransition, Vector2 start, Vector2 end)
{
//Variables for flexible function
int heightModificator;
//Start and ending values for diagonal line
int startValue = TerrainGen.GetNoise2D(noiseBiome, (int)start.x, (int)start.y, TerrainGen.min, TerrainGen.max);
int endValue = TerrainGen.GetNoise2D(noiseTransition, (int)end.x, (int)end.y, TerrainGen.min, TerrainGen.max);
//Step values
float endMinusStart = endValue - startValue;
float stepValue = endMinusStart / BIOME_CELL_SIZE;
//1 or 0 for height start of diagonal
heightModificator = (int)start.y > spacePosX ? 1 : 0;
for (int xz = 0; xz < BIOME_CELL_SIZE; xz++)
{
//Making diagonal and adjusting if it starts at the bottom or top of the square
transitionHeights[xz, Mathf.Abs((BIOME_CELL_SIZE - 1) * heightModificator - xz)] = Mathf.RoundToInt((startValue + stepValue * (xz + 1)) * towardsRight + (endValue - xz * stepValue) * towardsLeft);
}
}
Я не буду публиковать все остальные функции, так как они очень длинные, но над вамив цикле видно, что я использую умножение на 0 или 1. Это устанавливается в heightModificator, которого нет в другой функции без параметров. Это очень удобно, так как оно гибкое и устанавливается в начале урока.
public int towardsRight = 0;
public int towardsLeft = 0;
Теперь другой функции это не нужно, поскольку ее можно использовать только в том случае, если направление NE
private void TransitionDiagonallyNorthEast(FastNoise noiseBiome, FastNoise noiseTransition)
{
float endMinusStart;
float stepValue;
if (position == PositionOfBiomeCell.outward)
{
//For diagonal
endMinusStart = valuesFromTransitionNoiseEND[BIOME_CELL_SIZE - 1] - valuesFromBiomeNoiseSTART[0];
stepValue = endMinusStart / BIOME_CELL_SIZE;
for (int xz = 0; xz < BIOME_CELL_SIZE; xz++)
{
//Filling diagonal
transitionHeights[xz, xz] = Mathf.RoundToInt(valuesFromBiomeNoiseSTART[0] + (xz + 1) * stepValue);
Итак, выше вы можете видеть, что нет умножения на heightModificator,Функции не завершены, поэтому в обеих функциях было бы еще два таких цикла. Я не хотел их писать, так как не знаю, на что пойти. Что считается хорошей практикой, быть более гибким, но менее эффективным или наоборот?
В моем случае этот код будет выполнен МНОГО раз. Я бы сказал, что в моей функции Start () около 2080 (потому что многие объекты используют этот код). Более того, две мои петли, каждая из которых повторяется около 496 раз, будут вложены в первую.
Спасибо за чтение
С уважением.