오픈 소스 모험: 에피소드 47: BATTLETECH DLC가 데이터를 저장하는 방법

4439 단어 rubygamedev
무기 통계 스크립트를 완성한 직후 UAC와 같은 무기가 부족하다는 것을 알았습니다. 아 맞다, 그들은 기본 게임에 없고 DLC에 있습니다.

대부분의 게임은 모든 데이터, "기본 게임"데이터 및 "DLC"데이터를 동일한 방식으로 저장합니다. DLC 부품이 일부 플래그로 비활성화된 상태로 같은 위치에 있습니다. 또는 동일한 구조를 가진 일부dlc/whatever/에 있습니다.

BATTLETECH는 기본 게임 데이터와 완전히 다른 방식으로 DLC 데이터를 저장하기로 결정한 최초의 게임입니다.

BATTLETECH 기본 게임 데이터 저장 방법



느슨한 JSON 파일로 단순히 BattleTech_Data\StreamingAssets\data 에 있습니다.

DLC 데이터는 그렇게 저장되지 않습니다. 각 DLC의 모든 파일은 BattleTech_Data/StreamingAssets/data/assetbundles/heavymetal 와 같은 단일 UnityFS 아카이브로 함께 패키징됩니다.

무기의 경우 heavymetal DLC의 콘텐츠에만 액세스하면 됩니다. 기계 분석을 실행하려는 경우 flashpointurbanwarfare에도 일부가 포함되어 있는 것 같습니다.

아카이브에 게임 스토어 데이터가 있는 이유는 무엇입니까?



게임에서 파일을 느슨한 파일 대신 아카이브로 저장하는 것은 매우 일반적입니다. 여기에는 매우 간단한 이유가 있습니다. 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 - 다른 사람의 코드를 수정하는 것은 처음부터 모두 작성하는 것보다 어려운 경우가 많습니다
  • .
  • JSON을 추출한 사람이 있는지 확인하고 다운로드용으로 제공합니다
  • .
  • 프로젝트
  • 를 삭제하십시오.

    좋은 웹페이지 즐겨찾기