Ладно, я не знаю, как именно сейчас устроена логика обработки графических и скриптовых ресурсов в вашей игре, но вот что я могу посоветовать.
Разделите игру на как можно более мелкие ресурсы: звуки, спрайты, фоны, тексты, сценарии. Не объединяйте их в группы, пусть их будет много – по уровням, по сценам, по роутам.
Пусть игра, когда ей нужен какой-то очередной ресурс по имени – шлёт POST запрос на один и тот же endpoint (типа /getresource.php), в котором отправляет имя нужного ресурса и, быть может, токен авторизации. (Особо шифровать тут смысла не много, потому что если ломать эту систему – то «шифрование на клиенте» снять будет проще, чем разделаться с самой такой системой, но в принципе оно может усложнить первоначальный инжиниринг).
На этот запрос – сервер отдаёт путь на статический файл этого ресурса. Имя файла обязательно должно содержать секретный рандомный (но статический) кусочек, который никак нельзя узнать, кроме как запросить данным способом.
Пусть эти ресурсы продолжают кешироваться браузером и отдаваться по одним и тем же путям.
Например, игровые ресурсы могут лежать в таком виде:
2Or12GtHd2_init.json
xrQEELWeaj_menu.json
mXu01dwsxu_menu-music.mp3
OptPHCVeP9_menu-back1.webp
wOIbhCOWFb_menu-buttons.webp
MNIyaiO0fu_intro.json
4w3PlAqUuV_intro-music1.mp3
aes04tgHfL_intro-effect.ogg
LECcQxGAKz_intro-char1.webp
TsUNWgyvKm_intro-char2.webp
daOWHJ71p2_level1-act1.json
LviUS74wvA_level1-act1-back1.webp
…
EgIAUhSxvP_level1-act2.json
…
(То есть, на запрос «menu-buttons.webp» сервер ответит «wOIbhCOWFb» и клиент сможет собрать и воткнуть правильный путь в <IMG src=""> или куда там).