오픈 소스 모험: 에피소드 47: BATTLETECH DLC가 데이터를 저장하는 방법
대부분의 게임은 모든 데이터, "기본 게임"데이터 및 "DLC"데이터를 동일한 방식으로 저장합니다. DLC 부품이 일부 플래그로 비활성화된 상태로 같은 위치에 있습니다. 또는 동일한 구조를 가진 일부
dlc/whatever/
에 있습니다.BATTLETECH는 기본 게임 데이터와 완전히 다른 방식으로 DLC 데이터를 저장하기로 결정한 최초의 게임입니다.
BATTLETECH 기본 게임 데이터 저장 방법
느슨한 JSON 파일로 단순히
BattleTech_Data\StreamingAssets\data
에 있습니다.DLC 데이터는 그렇게 저장되지 않습니다. 각 DLC의 모든 파일은
BattleTech_Data/StreamingAssets/data/assetbundles/heavymetal
와 같은 단일 UnityFS 아카이브로 함께 패키징됩니다.무기의 경우
heavymetal
DLC의 콘텐츠에만 액세스하면 됩니다. 기계 분석을 실행하려는 경우 flashpoint
및 urbanwarfare
에도 일부가 포함되어 있는 것 같습니다.아카이브에 게임 스토어 데이터가 있는 이유는 무엇입니까?
게임에서 파일을 느슨한 파일 대신 아카이브로 저장하는 것은 매우 일반적입니다. 여기에는 매우 간단한 이유가 있습니다. Windows 운영 체제는 많은 수의 작은 파일을 처리하는 성능이 터무니없이 떨어집니다.
Linux에서는 엄청난 수의 작은 파일 또는 동일한 데이터가 있는 하나의 큰 아카이브 사이에 기본적으로 차이가 없으므로 그러한 아카이브는 상당히 무의미합니다.
대부분의 게임이 실행되는 Windows에서 느슨한 작은 파일은 성능 재앙이므로 게임은 운영 체제가 수행해야 하는 작업을 수행하고 가상 파일 시스템을 읽기만 합니다.
UnityPack으로 UnityFS 아카이브의 압축을 푸는 방법
UnityPack
을 시도했지만 decrunch
를 시도하면 종속성 pip3 install decrunch
이 충돌합니다.I used workaround suggested by the issue :
$ sudo ln -s /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/malloc/malloc.h /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/malloc.h
그런 다음
unityextract --all heavymetal
를 실행했는데 어쨌든 충돌이 발생했습니다.Written 369790 bytes to 'barrel.obj'
Traceback (most recent call last):
File "/usr/local/bin/unityextract", line 159, in <module>
main()
File "/usr/local/bin/unityextract", line 155, in main
exit(app.run())
File "/usr/local/bin/unityextract", line 57, in run
self.handle_asset(asset)
File "/usr/local/bin/unityextract", line 106, in handle_asset
self.write_to_file(d.name + ".cg", d.script)
File "/usr/local/lib/python3.9/site-packages/unitypack/engine/object.py", line 6, in _inner
ret = self._obj[f]
KeyError: 'm_Script'
좋아, 일부 개체 파일의 압축을 풀다가 충돌이 발생했지만 JSON만 필요합니다.
그래서 대신
unityextract --text heavymetal
를 시도했고 다른 충돌이 발생했습니다.Traceback (most recent call last):
File "/usr/local/bin/unityextract", line 159, in <module>
main()
File "/usr/local/bin/unityextract", line 155, in main
exit(app.run())
File "/usr/local/bin/unityextract", line 57, in run
self.handle_asset(asset)
File "/usr/local/bin/unityextract", line 82, in handle_asset
for id, obj in asset.objects.items():
File "/usr/local/lib/python3.9/site-packages/unitypack/asset.py", line 84, in objects
self.load()
File "/usr/local/lib/python3.9/site-packages/unitypack/asset.py", line 110, in load
self.tree.load(buf)
File "/usr/local/lib/python3.9/site-packages/unitypack/type.py", line 117, in load
self.target_platform = RuntimePlatform(buf.read_uint())
File "/usr/local/Cellar/[email protected]/3.9.10/Frameworks/Python.framework/Versions/3.9/lib/python3.9/enum.py", line 384, in __call__
return cls.__new__(cls, value)
File "/usr/local/Cellar/[email protected]/3.9.10/Frameworks/Python.framework/Versions/3.9/lib/python3.9/enum.py", line 702, in __new__
raise ve_exc
ValueError: 520093696 is not a valid RuntimePlatform
좋아, 그것은 작동하지 않을 것이 분명하다.
다음은 무엇입니까?
파일을 직접 사용할 수 없고 작업
UnityPack
을 할 수 없으므로 몇 가지 옵션이 있습니다.UnityFS
언패커를 구현합니다. 형식이 충분히 단순해 보이지만 모든 UnityPack
충돌은 결국 그렇게 간단하지 않을 수 있음을 나타냅니다UnityPack
- 다른 사람의 코드를 수정하는 것은 처음부터 모두 작성하는 것보다 어려운 경우가 많습니다Reference
이 문제에 관하여(오픈 소스 모험: 에피소드 47: BATTLETECH DLC가 데이터를 저장하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/taw/open-source-adventures-episode-47-how-battletech-dlcs-store-data-h70텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)