Логика распространения точечного источника света в моей игре - Minecraft на Unity.

public sealed class ChunkLight
{
private readonly Queue<Vector3Int> _lightsQueue = new();
private readonly int[,,] _blockIds;
private readonly byte[,,] _blockLights;
public void SetLamp(Vector3Int position, byte lightForce)
{
AddLightForNeighbors(position, lightForce);
while(_lightsQueue.Count > 0)
{
position = _lightsQueue.Dequeue();
AddLightForNeighbors(position, _blockLights[position.x, position.y, position.z]);
}
}
private void AddLightForNeighbors(Vector3Int position, byte lightForce)
{
lightForce -= 1;
AddLight(position + Vector3Int.left, lightForce);
AddLight(position + Vector3Int.right, lightForce);
AddLight(position + Vector3Int.back, lightForce);
AddLight(position + Vector3Int.forward, lightForce);
AddLight(position + Vector3Int.down, lightForce);
AddLight(position + Vector3Int.up, lightForce);
}
private void AddLight(Vector3Int position, byte lightForce)
{
if (_blockIds[position.x, position.y, position.z] != 0) return;
if (lightForce <= _blockLights[position.x, position.y, position.z]) return;
_lightsQueue.Enqueue(position);
_blockLights[position.x, position.y, position.z] = lightForce;
}
}Это упрощенный вариант кода, нет проверок на границы чанков, только чистая логика света. И представим _blockIds заполнен данными 0 и 1 (0 - нету блока, 1 - есть блок), а
_blockLights имеет значения от 0 до 15.
1. Блок света (Лампа) устанавливается в ячейку с координатами (x, y, z), а сила его света lightForce = 15.
2. Перебираю соседние ячейки: (x - 1, y, z), (x + 1, y, z), (x, y - 1, z), (x, y + 2, z), (x, y, z - 1), (x, y, z + 1).
2.1 Если в соседней ячейке есть блок, то он пропускается. И если lightForce внутри блока уже больше или равен присваиваемому lightForce, то блок пропускается.
2.2 Если блока нет, то ячейке присваивается lightForce= 14. Так же эта ячейка добавляется в очередь _lightsQueue.
3. Запускаю цикл While и также перебираю блоки внутри _lightsQueue.
Если вам интересно следить за разработкой игры и влиять на саму игру, у меня есть телеграмм канал.
