
Bom dia a todos, meu nome é Sergey Noskov. Hoje eu gostaria de falar sobre a criação do meu primeiro projeto indie completo chamado 35MM, lançado no Steam em 2016. A história é obviamente longa e, desde então, vários artigos e entrevistas sobre o tema do projeto já foram publicados, no entanto, não havia descrição detalhada do processo de desenvolvimento. Além disso, os aspectos técnicos da implementação foram pouco tocados. Na verdade, falaremos sobre isso.
Vamos começar com um pouco de fundo. 35MM é uma aventura com uma visão em primeira pessoa no cenário de um pós-apocalipse na Rússia. As pessoas - um simulador de caminhada. O jogo nos conta a história da jornada de dois andarilhos pelas terras desertas deixadas pela civilização. A maior parte da população morreu depois de uma doença terrível, e agora a natureza recupera seus pontos da humanidade. Infelizmente, não me lembro exatamente como nasceu a idéia deste projeto, mas definitivamente me lembro que naquela época eu era um fervoroso fã do tópico de perseguidores, jogos de metrô e geralmente um ambiente atmosférico. As paisagens de cidades abandonadas, zonas industriais e aldeias sempre despertaram minha ansiedade e deleite. Não sei que tipo de doença é e como explicar esse amor, mas há muitos de nós. Em geral, essa paixão por esse tópico foi suficiente para começar a criar seu próprio mundo de pequenos jogos.

Como eu já tinha dois projetos pequenos (Light e Train), além de experiência no mecanismo Unity, comecei a desenvolver um novo jogo nele. Se não me engano, naquela época a quinta versão do mecanismo já estava disponível, mas até certo ponto sou um conservador (não é meu melhor traço profissional), então decidi permanecer na versão 4.7. Para um entendimento geral, existem muitas diferenças significativas entre as versões 4 e 5 do mecanismo, especialmente em termos de renderização, iluminação e materiais. O Unity 5 introduziu shaders fisicamente precisos que podem refletir corretamente a luz e exibir reflexos. Em palavras simples - o brilho e as reflexões em materiais com esses shaders parecem mais naturais e atraentes. Na versão 4, os shaders básicos eram muito mais simples, no entanto, escrever seus próprios shaders poderia melhorar significativamente a qualidade da imagem. Falaremos sobre isso um pouco mais tarde. É claro que o desenvolvimento do jogo inclui muitos aspectos, além de trabalhar no próprio mecanismo. Para que o mecanismo tenha algo para amolar, é necessário conteúdo: modelos, texturas, sons, scripts etc. Tudo isso no final, vemos no monitor e ouvimos nas colunas. E, claro, cada tipo de conteúdo requer seu próprio software. Para criar modelos 3D, usei o 3D max, para trabalhar com gráficos 2D e criar texturas - Photoshop, para trabalhar com som - Adobe Audition, escrevi o código no programa Monodevelop que acompanha o Unity. Eu recomendo especialmente que você feche os olhos ou pule para o próximo capítulo - o jogo está escrito em Javascript. Só shh, não conte a ninguém. Só sei que para alguns isso é de mau gosto e ninguém escreve em Javascript. Em geral, as principais ferramentas são selecionadas e o fluxo de trabalho está se afastando lentamente.
Como tudo começou
Em algumas entrevistas, eu já mencionei que geralmente não tenho um plano de desenvolvimento claro, mas apenas o quadro geral. Portanto, frequentemente, a criação de locais ocorre espontaneamente e o design é pensado em movimento. Isso, é claro, é mais um sinal de menos do que um sinal de mais, mas há um lado positivo - é muito divertido e você nunca sabe exatamente o que acontecerá a seguir. Acontece que o jogo até certo ponto vive sua própria vida já nos estágios iniciais. O desenvolvimento de 35MM começou com a criação do primeiro local - uma casa de floresta abandonada e um terreno espaçoso com campos e florestas de coníferas.

Para construir a superfície da terra terrane usado com 5-6 texturas de grama e terra. O shader terrane padrão pinta a superfície com texturas diferentes usando a máscara RGBA, que criamos com um pincel no próprio mecanismo, e o resultado geralmente parece muito desfocado, as transições entre as texturas são muito suaves e não parecem naturais. Para refinar esse ponto, o sombreador terrane foi alterado e uma máscara de deslocamento foi adicionada. A textura em preto e branco "mudou" a máscara desenhada no terrane e criou bordas rasgadas e mais nítidas, o que visualmente complicou ligeiramente a aparência da superfície.


A superfície de nossa terra foi complementada por vários tipos de grama na forma de pleins espalhados aleatoriamente. A unidade também possui um modo de outdoor (quando as planícies de grama sempre olham para o jogador), mas não é muito adequado para jogar com uma visão em primeira pessoa, porque é perceptível como a grama "assiste" nossa câmera. Você deve sempre ter cuidado com a grama e adicioná-la dentro de limites razoáveis, pois esse prazer gera muitas chamadas e isso, por sua vez, afeta o desempenho. Quanto mais chamadas, maior a carga no sistema do computador. Mas não esqueça que não apenas os desafios aumentam a carga. Existem várias maneiras de diminuir o desempenho no jogo. Além da grama no chão, para variar, foram espalhadas malhas com galhos e pedras, além de uma série de adesivos com sujeira e vestígios de rodas de carros.

Depois de criar a superfície, vá para a vegetação, árvores e arbustos. Eu preferi plantar a parte principal da floresta (árvores coníferas) usando as ferramentas do próprio terrane - ou seja, com uma escova. A vantagem desse método é que ele é feito de maneira rápida e fácil, além disso, a uma grande distância, essa floresta é transformada de malhas em outdoors, o que afeta muito a otimização. No entanto, perto da carga é muito aumentada, porque, pelo que entendi, essas árvores não rolam. Talvez eu esteja errado e alguém me corrija. Butching é uma ferramenta muito importante para otimização. Grosso modo, essa é uma combinação de malhas com um material em uma malha comum, o que reduz significativamente o número de chamadas de tração, respectivamente, reduz a carga. Outro ponto negativo do assentamento no terreno é a mesma posição das árvores, ou seja, todas elas são criadas no mesmo ângulo e essa uniformidade é impressionante. Nesse sentido, instalei manualmente alguns pinheiros, abetos e árvores de folha caduca em diferentes ângulos e tamanhos, o que agregou variedade à paisagem. Os arbustos foram arranjados da mesma maneira.


Para ser completo, resta lidar com o céu. Para esta tarefa, foi utilizado um material skybox comum com seis texturas. Houve tentativas de modificar o sombreador para que o céu parecesse dinâmico, mas o resultado não se justificou e essa ideia teve que ser abandonada. Uma alternativa foi o uso de um sistema de partículas com textura de nuvens e outdoors horizontais com interpolações de movimento. Tanto quanto me lembro, uma opção semelhante foi usada no jogo Stalker, e de fato há muito mais em outros lugares.

Iluminação
Na quarta versão do mecanismo Unity, havia um modo muito conveniente para criar mapas de luz - mapeamento duplo de luz. Existe uma opção semelhante nas versões atuais, mas ainda não a estudei em detalhes. O modo duplo nos permitiu desenhar sombra e brilho em tempo real a curta distância, mas à medida que nos afastávamos da câmera, tudo isso se transformou suavemente em mapas de luz cozidos, o que facilitou muito a tarefa do nosso hardware. Em geral, usei esse método em todos os locais do jogo. Como resultado, para cada local do meio, foi cozido um conjunto de 5 a 10 mapas de luz para o plano próximo e uma quantidade semelhante para o distante (em segundo plano, mapas de luz também foram usados, mas apenas com ambiente de ambiente).


Em geral, em muitas áreas, tentei usar a luz completamente cozida, com exceção da luz do sol. Luzes pontuais foram colocadas em locais para enfatizar acentos e mais luz. Isso foi feito principalmente em salas onde pouca luz externa penetrava. Em vários lugares, é claro, também foram usadas lâmpadas em tempo de rampa com sombras: luz de um incêndio, um candeeiro de mesa, um teto ou luminária de parede. A propósito, ao trabalhar com iluminação, tive que lidar com um grande problema relacionado às lâmpadas Point e às sombras em tempo real. Em algumas áreas, o olhar da câmera em uma fonte pontual de luz com sombras deu frisos e freios assustadores. Não está totalmente claro por que a carga era tão alta, mas o criador de perfil naquele momento mostrou chamadas de escala fora de escala por uma fração de segundo. Para corrigir a situação, o uso de duas luminárias Spot direcionadas em direções opostas uma da outra ajudou. Essa opção acabou sendo menos pesada.

Modelos
A maioria dos modelos 3D do jogo foi criada de forma independente. Algo foi feito com muito cuidado, com mapas normais e outras sutilezas, e algo foi criado às pressas para economizar tempo. A maioria dos objetos foi criada em grupos e usou uma única textura de atlas. Ou seja, em uma textura havia seções, por exemplo, para um bloco de concreto, um sinal de trânsito, detritos de tijolos, uma escotilha de esgoto etc. Isso permitiu que um material fosse usado para todos esses objetos e, consequentemente, permitiu que os objetos rissem. Como lembramos, isso é muito bom. Alguns modelos foram fielmente baixados por mim da Internet, de bibliotecas gratuitas. Basicamente, esses são pequenos acessórios para encher as salas, no entanto, tentei modificar um pouco todos esses modelos para que a semelhança não fosse muito evidente. Muitas vezes, notei ativos idênticos em jogos independentes, o que de certa forma influenciou minha percepção, não da melhor maneira. O mais problemático em termos de criação foi o transporte. A modelagem de veículos com rodas do zero consome muito tempo e leva muito tempo. Portanto, várias cópias dos carros foram compradas por mim na Asset Store.



Uma "música" separada foi a criação de personagens. Ainda é um experimento. Para aqueles que não têm uma boa idéia de quanto trabalho é necessário para que um personagem apareça capaz de existir de alguma forma no jogo, explicarei. Um modelo de alto poli é criado com todos os detalhes, botões nas mangas, rugas no rosto, etc. Um modelo de baixo poli do mesmo personagem é criado com uma varredura de textura (no meu jogo, o número de polígonos por personagem era, em média, de 5 a 8 mil). Além disso, um mapa normal, um mapa ambiente (sombreamento suave) é removido do modelo de alto poli para o baixo de poli por manipulações astutas ou descomplicadas. Normalmente, do ambiente, faço um mapa difuso no Photoshop. No mapa difuso no canal alfa, crie um mapa especular para criar brilho.


Para 2019, é claro, já é muito primitivo, mas por 16 anos e para o projeto indie foi bastante adequado.
Além disso, nosso persa precisa ser paquerado - para colocar ossos nele, devido aos quais ele pode mover seus membros, mover sua mandíbula, dobrar e dobrar os dedos, etc. Bem, no final, tudo precisa ser animado. Geralmente, um conjunto de animações com estados diferentes é criado para o personagem: andando, correndo, em pé ou sentado. Mas fragmentos únicos também são necessários, por exemplo, no meu caso, para o parceiro de nosso herói Petrovich, um grande número de variações de ações foi necessário: abrir portas, examinar um mapa, uma luta com bandidos, lançar uma bomba leve no nível Bor, etc. Tudo isso teve que ser animado à mão, o que, é claro, é muito marcante em sua falta de jeito. Em geral, a animação manual de movimentos humanos é uma tarefa muito difícil e extremamente difícil de alcançar um resultado plausível. Portanto, o motion cap é a solução mais adequada para esta tarefa. Até onde eu sei, agora essa opção é mais barata e mais rápida que o trabalho do animador, embora os dados recebidos precisem ser processados e "limpos" manualmente.

Shaders
Esclareço imediatamente que entendi a escrita shader naquela época muito superficialmente. Meu treinamento foi principalmente na análise de exemplos prontos e seu refinamento. Peguei várias opções da rede, alterei parâmetros, adicionei novas ou removi as antigas e verifiquei como isso afeta o resultado. Verificou-se que esta é uma atividade extremamente emocionante. De particular interesse para mim foi o manuseio de diferentes canais de textura como uma máscara. Em alguns casos, tentei ajustar a quantidade máxima de informações em uma textura e usá-la. No começo do artigo, mencionei as diferenças entre a quarta e a última versão do Unity e, especificamente, a presença de sombreamento fisicamente correto nas últimas. Tentei eliminar essa falha sozinho e o efeito fresnel foi adicionado ao shader padrão com um mapa especular, cubmap e normal. Essa é uma característica dos materiais refletivos, nos quais superfícies inclinadas em relação à nossa visão refletem o ambiente (ou cubmap neste caso) com mais força e geralmente parecem mais leves e contrastantes. Isso é muito perceptível em uma bola brilhante, cujas bordas parecem mais brilhantes que o centro. Consegui repetir esse efeito, além de adicionar a capacidade de pintar o cubmap no material, o que geralmente podemos ver em superfícies reflexivas, mas ásperas. Esse shader me serviu completamente e foi aplicado à maioria dos materiais do jogo.


A segunda experiência interessante foi a criação de um shader para a pele dos personagens. A base foi um código encontrado na Internet que permite usar uma textura gradiente, responsável pela força e cor da iluminação que afeta o modelo. Uma textura semelhante com uma tonalidade avermelhada no meio tornou possível imitar a pele humana, que, por assim dizer, é um pouco translúcida, ou seja, possui espessura própria, na qual a luz é espalhada suavemente. O efeito não é perfeito, mas parece melhor do que o plástico colidido especular padrão.

Além dos shaders acima, muitas opções secundárias com efeitos individuais foram criadas no processo. Por exemplo, um shader poça com um cubmap e uma deformação difusa do mapa. Como é muito caro usar reflexos reais para poças e eu não queria usar uma renderização na textura (é quando o quadro é salvo na textura e aplicado no material, durante o qual, por exemplo, podem ser feitas distorções do ar quente), decidi fazer distorções simples da textura da terra, esticado sobre uma poça. O efeito foi bastante agradável e não esticou o ferro. Aliás, um shader com uma renderização de textura foi usado para distorcer o ar de lâmpadas de querosene e uma fogueira. Parece ter distorcido o calor do recurso Detonator. Além disso, para simular raios de luz volumétricos, um shader de vértice foi criado com o efeito Soft Particle e o efeito de luz da borda (quando olhamos polígonos em ângulo, a malha entra em alfa). Essa é uma maneira clássica e já barbada de implementação. Agora, para a nova Unidade, existe uma opção interessante que funciona com base no pós-efeito e permite que você atraia raios reais de luz, mesmo levando em conta as sombras.
Outro ponto a ser destacado é o conjunto de shaders feitos para simular superfícies molhadas. O jogo tem um episódio em que, em algum momento, começa uma forte chuva e alguns materiais adquirem suavemente um brilho característico. O principal efeito foi aplicado ao terreno, no qual, como no caso das poças, a textura difusa começou a distorcer. Vazamentos de água também apareceram nas janelas das casas. Bem, o chip mais "molhado" foram as gotas caindo nas lentes. Ali, na verdade, fiquei atormentado por dúvidas, porque o herói não tinha óculos nem capacete, e como as gotas tão intrusivamente aparecem na tela não eram claras. No entanto, visualmente gostei tanto do efeito que simplesmente não consegui recusá-lo.

Então, passamos suavemente para os pós-efeitos. Falando em gotas na tela, tudo é simples: algumas gotas da textura se multiplicam e se movem para baixo em velocidades diferentes. Paralelamente, as ondas (texturas gradientes) estão se movendo para baixo, que são multiplicadas, cada uma por seu próprio grupo de gotas. Então a coisa toda é resumida, levemente exibida na “difusão”, por assim dizer, mas é usada principalmente como uma máscara para mudar as coordenadas. Como resultado, nossa imagem é distorcida pela refração das gotas de água. O principal conjunto de pós-efeitos que foram sempre ou opcionais na câmera (se o player os ativou ou desativou) é anti-aliasing, SSAO, Bloom, Aberration, Vignette, Sun Shafts. Todos esses são os efeitos padrão do Unity, mas o SSAO foi modificado para que a renderização de sombras à distância fosse reduzida a zero, porque à distância no nevoeiro os pontos escuros das sombras pareciam estranhos. O efeito de aberração também foi alterado (esta é a distorção de cor da imagem ao usar lentes, algo como contornos de cores nas bordas dos objetos) .O efeito padrão do Unity pintou as bordas verde-bordô dos objetos (uma solução bastante estranha na minha opinião). De fato, na maioria das vezes as cores estão mais próximas do amarelo-vermelho-azul, o que eu percebi. Outro efeito permanente foi a correção de cores feita por conta própria. O efeito padrão da Unidade me parecia muito intensivo em recursos, de modo que o seu próprio e simplificado foi realizado. Basicamente, ele criou o efeito de tonmapping e mudou ligeiramente o esquema de cores para um mais frio. Escolher uma paleta de cores para uma imagem é sempre uma tarefa difícil, difícil de determinar. Acontece que você pode gostar de opções completamente opostas e tomar uma decisão é extremamente difícil. Neste projeto, decidi por cores opacas e frias. Para muitos, ela parecia desbotada demais, mas parece-me que ela transmite com muita precisão o clima que tentei refletir em meu jogo, o clima de tristeza, desânimo e solidão.


E o código?
Mencionei repetidamente em uma entrevista que sempre estava longe do tópico de programação e me concentrei mais no componente visual. Comecei a escrever o primeiro código completo enquanto trabalhava no jogo "Train", então, quando desenvolvi 35MM, já tinha algumas habilidades. Em geral, o gênero da busca me pareceu muito adequado para entender a programação no meu nível inicial. A maioria das ações no jogo é baseada em gatilhos. Um objeto entra no gatilho (um cubo com um colisor) e algo começa a acontecer, por exemplo, uma cena cortada é iniciada. No roteiro, como no roteiro de uma performance teatral, é descrito linha por linha quando e o que acontece - agora a câmera do jogador desliga, a câmera de cena é ligada, o personagem aparece no quadro, a animação da conversa começa etc. Acredito que existem ferramentas que facilitam todo esse processo (acreditoporque não foi profundo), mas essa opção ainda me parece mais compreensível, porque você mesmo controla todos os eventos.O movimento do nosso parceiro no jogo foi implementado usando gatilhos, que eram pontos de verificação de sua rota. Se você pressionar o gatilho, alguma nova animação poderá ser ativada ou o personagem poderá dizer algo.
Este método foi usado em todos os níveis, exceto o último. No local final da cidade, se a procurássemos com um parceiro, ele não mais nos levaria ao longo do caminho, mas correria atrás de nós. Lá, um controlador baseado no NavMesh (um sistema que permite que um objeto procure um caminho para um destino e vá para ele) já foi usado.
As coisas ficaram mais difíceis com o urso no segundo local do jogo. Foi utilizado um controlador que funciona apenas com um corpo rígido (corpo físico), de modo que a fera era estúpida e freqüentemente colidia com árvores e outros objetos. O material físico com atrito zero nos permitiu evitar congestionamentos graves, e o urso finalmente escorregou e continuou nos perseguindo. Aqui, e em geral nas áreas em que você pode morrer, encontrei o problema mais sério para mim - o lançamento da morte e o reinício. No momento da morte, era necessário levar em consideração todos os estados atuais do personagem: a lanterna está acesa, o cartão está aberto, a faca está ativada etc. Também era necessário preservar os valores de saúde e todos os recursos e, em seguida, tudo o que era ativado, era necessário desativar e iniciar a animação da câmera caindo. Depois de escurecer a tela, era necessário retornar tudo e ler os valores armazenados.De fato, não há grandes dificuldades com a abordagem correta, mas no meu caso muitos insetos apareceram: ou a faca permaneceu em minhas mãos diante dos meus olhos quando o urso atacou, então o cartão não foi embora - tudo assim. Além disso, você nunca sabe como um jogador pode liderar-se neste momento, para onde ele corre e em que condições um urso pode liderar, o que pode ficar preso em algum lugar ou, por exemplo, nos atacar pelo muro. Em geral, existem muitas nuances que você não previrá imediatamente.nos atacar através da parede. Em geral, existem muitas nuances que você não previrá imediatamente.nos atacar através da parede. Em geral, existem muitas nuances que você não previrá imediatamente.A interação do nosso personagem com os objetos foi realizada usando o raio Raycast. Todos os objetos interativos foram marcados com a tag Subject e, quando o feixe os atinge, ativa a luz de fundo (a malha é um indicador com arestas realçadas) e inclui um script que já é responsável por quais ações podemos executar com esse objeto, por exemplo, pegar um objeto, ler uma nota ou abra a porta.Para a interação, inicialmente havia planos de fazer mãos completas que alcançariam objetos, isso criaria um efeito mais óbvio da presença. Mas essa opção representou para mim a grande dificuldade de implementação e a perspectiva de ter todo um "pacote" de bugs no futuro, então havia apenas mãos que carregavam itens já selecionados. Há uma casa pré-fabricada com pequenas alças na frente da câmera, na qual todos os objetos já estão presentes (câmera, faca, machado etc.). Quando você seleciona um objeto durante o jogo, o desejado é ativado e os desnecessários são desativados.
Um ponto interessante foi relacionado à animação dos personagens conversando. A técnica é primitiva, mas eu mesma pensei nisso, orgulhosa, sim. A princípio, pensei que, ao comunicar os personagens, teria que iniciar a animação da abertura da mandíbula em ordem aleatória a cada frase. Mas me ocorreu que um script podia ler o nível de volume da trilha sonora no momento da reprodução e transferi-lo para um valor flutuante, que já é responsável pela posição da mandíbula do herói. Por fim, a mandíbula se abriu automaticamente ao pronunciar palavras ao ritmo do arquivo de som. Isso simplificou bastante a tarefa, embora parecesse muito "máquina".Otimização
A otimização é uma parte muito importante do desenvolvimento, da qual depende quão suavemente o jogo funcionará em diferentes hardwares. Vou abordar a otimização do componente visual do projeto. Existem vários métodos úteis para isso: grupos de filas, o abate é ocluído, cortando objetos à distância. O grupo LOD deve ser usado no caso de objetos high-poly de alta densidade. Para fazer isso, crie várias malhas com um número diferente de polígonos. Quanto mais a câmera estiver do assunto, mais simplificado o modelo será desenhado no quadro. Por exemplo, para 35MM, os lods foram usados em modelos de carros, personagens e algumas árvores. Geralmente eram feitos 2-3 filões, entre os quais cada malha subsequente tinha quase 2 vezes menos polígonos. Para maior clareza: o modelo original do carro é composto por 15 mil polígonos, o primeiro LOD já possui cerca de 9 toneladas.(o número de nervuras diminui, peças pequenas como dobradiças e peças internas são removidas), o segundo LOD já chega a 5 toneladas (maçanetas das portas, espelhos dentro da cabine são removidos, a geometria fica ainda mais fácil). Mais na mesma linha. Para os lods, a propósito, um truque interessante foi usado. Quando assamos mapas de luz para um objeto com filamentos, precisamos assar para os dois objetos. Para reduzir o tempo de cozimento e economizar memória do sistema, usei um script que transferia automaticamente o mapa de luz atribuído com todas as coordenadas do objeto pai (zero LOD) para todos os outros lods.um truque interessante foi usado. Quando assamos mapas de luz para um objeto com filamentos, precisamos assar para os dois objetos. Para reduzir o tempo de cozimento e economizar memória do sistema, usei um script que transferia automaticamente o mapa de luz atribuído com todas as coordenadas do objeto pai (zero LOD) para todos os outros lods.um truque interessante foi usado. Quando assamos mapas de luz para um objeto com filamentos, precisamos assar para os dois objetos. Para reduzir o tempo de cozimento e economizar memória do sistema, usei um script que transferia automaticamente o mapa de luz atribuído com todas as coordenadas do objeto pai (zero LOD) para todos os outros lods.O segundo método de otimização é o Oclusion Culling. Esse é um mecanismo no qual tudo o que não está no campo de visão da câmera ou é fechado por outro objeto é cortado. Por exemplo, quando entramos na sala, atrás da parede, não vemos mais muitos objetos na rua e, portanto, não há necessidade de gastar recursos em renderizá-los.
Outra maneira útil de simplificar a renderização é recortar objetos à distância. Esta é a primeira opção que conheci desde a época do projeto “Light”. Um script está pendurado na câmera que ajusta sua distância de renderização para cada camada. No meu caso, três categorias de camadas foram criadas especialmente, com pequenos objetos (utensílios domésticos, martelos, tijolos e pequenos detritos), com tamanhos médios e ligeiramente superiores à média (bules, arbustos, vasos de flores, pequenos postes de luz etc.). Foram atribuídas três categorias a distâncias: 40, 80 e 120 metros. Uma vez além da distância especificada, a câmera parou de renderizar o objeto correspondente. A opção é muito conveniente e eficaz, já que pequenos objetos não podem mais ser vistos de longe e, portanto, renderizá-los não faz sentido.Som
A maioria dos sons do jogo foi retirada de bibliotecas gratuitas da Internet. Geralmente, eu baixava as opções necessárias e as combinava e misturava no Adobe Audition. Em geral, não há muito o que dizer sobre essa parte do trabalho, porque é um processo bastante rotineiro e chato e não é particularmente atraente para mim. A propósito, o trabalho de introdução de sons, pontuação de cenas cortadas, ajuste de arquivos de som para que o som desejado seja reproduzido no momento certo - tudo isso provavelmente levou um quarto do tempo total trabalhando no jogo. O único momento agradável foi a introdução da música, na qual o compositor legal e extremamente talentoso Dmitry Nikolaev trabalhou. Estou muito satisfeito com o que ele fez, porque, em geral, eu não sabia exatamente o que queria ouvir. Mas Dmitry sentiu o clima muito bem,que foi estabelecido no projeto e implementado na forma de ambiente atmosférico. Aconteceu algo fantástico, misterioso e melódico.Outro passo interessante foi trabalhar com personagens de dublagem. Apesar das críticas de fora, ainda estou satisfeito com o resultado e acho que os atores fizeram seu trabalho muito bem. A propósito, os personagens principais dublados por Vsevolod Petrykin e Alexander Bragi, pelos quais muitos agradecem a eles.Em geral, não havia problemas sérios com o som, embora, após o lançamento, um bug raro fosse descoberto que eu ainda não conseguia superar, porque ainda não entendia sua natureza. Às vezes, parte dos sons deixava de tocar ou soava com algum efeito de eco forte. Ao falar com um herói, uma voz pode desaparecer repentinamente e, do mesmo modo, recuperar-se repentinamente. Havia conjecturas associadas a uma grande carga e a um grande número de sons tocando ao mesmo tempo. Também havia suposições sobre a conexão do bug com as zonas de reverb, mas isso não é exato.Provavelmente é tudo. Já faz muito tempo desde o desenvolvimento, algumas coisas foram esquecidas e outras se tornaram completamente irrelevantes, mas espero que o artigo seja útil para alguém e possa fornecer respostas para algumas perguntas. Obrigado a todos e boa sorte!