シンプルな GUI 開発ツールを含むゲーム エンジンに取り組んでいます。GUI ツールを使用すると、ユーザーはさまざまなエンティティとコンポーネントを定義し、構成ファイルに保存できます。ゲーム エンジン ランタイムが構成ファイルをロードすると、ゲームで使用するさまざまなエンティティとコンポーネントを作成する方法を決定できます。
構成ファイルの保存メカニズムには、PyYAML を使用しています。私が抱えている問題は、シリアル化プロセスが、PyYAML を介してファイルをロードして解析するモジュールとは異なるディレクトリにあるモジュールで発生するという事実に起因しています。
簡素化されたシリアライザー
import yaml
def save_config(context, file_name):
config_file = file(file_name, 'w')
# do some various processing on the context dict object
yaml.dump(context, config_file)
config_file.close()
これは、さまざまなゲーム オブジェクトを表すcontext
オブジェクトを受け取り、dict
それを構成ファイルに書き込みます。これは問題なく動作します。
エンジン内の簡略化されたデシリアライザー
import yaml
def load(file_name):
config_file = open(file_name, 'r')
context = yaml.load(config_file)
return context
ここで問題が発生します。ではyaml.load(config_file)
、特定のモジュールでさまざまな名前が見つからないため、エラーが発生します。なぜこれが起こっているのか理解しています。たとえば、構成ファイルをシリアル化すると、AssetComponent
(エンジン内のコンポーネント タイプ) が at としてリストされengine.common.AssetComponent
ます。ただし、デシリアライザーの観点からは、 は にあるAssetComponent
はずですcommon.AssetComponent
(デシリアライゼーション コード自体がengine
パッケージ内に存在するため) engine
。
PyYAML でシリアル化または逆シリアル化するときにパスを手動で処理する方法はありますか? 両方が同じ「視点」から起こるようにしたいと思います。
編集: 以下は、問題のある構成ファイルがどのように見えるかを示し、その後に手動で修正された構成がどのように見えるかを示しています
問題あり
!!python/object/apply:collections.defaultdict
args: [!!python/name:__builtin__.dict '']
dictitems:
assets:
- !!python/object:common.Component
component: !!python/object:engine.common.AssetComponent {file_name: ../content/sticksheet.png,
surface: null}
text: ../content/sticksheet.png
type_name: AssetComponent
修正済み
!!python/object/apply:collections.defaultdict
args: [!!python/name:__builtin__.dict '']
dictitems:
assets:
- !!python/object:tools.common.Component
component: !!python/object:common.AssetComponent {file_name: ../content/sticksheet.png,
surface: null}
text: ../content/sticksheet.png
type_name: AssetComponent