コンテンツをハードコードするのが悪いのはなぜですか?


41

ほとんどのゲームはダイアログテキストをファイルに保存しますが、実際にコンテンツ(マップ、選択肢、プレーヤーコマンド、ストーリーテキスト)をゲームコードにプログラムするテキストベースのゲームもいくつか見ました。

いくつかの理由が考えられますが、テキストゲームでさえプログラム外のファイルにすべてを保持する主な理由は何ですか?

実装の詳細は、一般的なXML形式のようなコンテンツを保持し、解析し、XMLファイルから作成された変数に基づいてマップを表示/表示し、XMLファイルを完全に放棄することでほとんど異なりません。これらは両方とも、画面に出力される文字列になります。違いは単なる表記ではありませんか?

ゲームの中には、コード内にグラフィック(ASCIIアート?)を保持するものさえあります。私はこれが正しくないことを知っており、それが悪い理由をいくつか推測できますが、主な理由もわかりません。

ほとんどのコンテンツをプログラム外に置くことは非常に人気があります。Dwarf Fortressでさえ実際のASCII文字を使用しませんが、メモリに読み込まれたASCII文字の画像を使用します。

私が主に尋ねるのは、XMLファイルを作成、解析、および操作するのが少しPITAであるためです。ご存知のように...すべてのユニークなダンジョン(コンテンツ)を独自のクラスにするという怠zyな選択肢と比較してください。


9
テキストベースのゲームは多くのコンテンツをハードコーディングしますが、それは単にそれらが開発された時期と貧弱なデザインの選択のためだと思います。同じことがドワーフ要塞にも当てはまるかもしれません。私は個人的にすべてのテキストベースのゲームを取得し、コンテンツをソースの外にデータベースに移動しました。それは私の人生をとても楽にしてくれました。
グレンスワン14

7
i18nは、ソースに埋め込まれたコンテンツを扱うのは非常に困難です。
14

5
これがゲーム開発固有のものかどうかはわかりません。将来は、プログラマーSEまたはstackoverflowに問い合わせることを検討してください。
マイケルハウス

13
just making every unique dungeon (content) its own class.それはただ震えさせた。ロジックからデータを分離することは私にとって非常に基本的な原則であるため、開発者がまだそれに違反していることに驚いています。
リリエンタール14年

4
あなたが何を決めようとも、コンテンツをハードコーディングすることでより多くの特別なケースが可能になることを理解してください。特定のボスを真夜中から午前7時(リアルタイム)の間にのみ表示したいですか?モンスターを特定の時間にのみ表示する一般的な方法を作成するよりも、ハードコーディングする方がはるかに簡単です。
user253751 14年

回答:


85

その理由はいくつかあります。ほんの少し触れます。

  1. それはあなたのソースコードを混乱させます。多くのダイアログ(ツリー)がある場合、コードベースの大部分は、実際のゲームコードとは関係のない単なるテキストです。
  2. 単一の文字に変更するたびに再コンパイルする必要があります。
  3. ダイアログ自体をナビゲートするのは困難です。いくつかは言うまでもなく、ソース全体に完全にダイアログツリー全体を実装しようとすると、スパゲッティや入れ子になったifs、switchesなどの入れ子になります。その結果、エラーが発生しやすく、読みにくく、デバッグしにくいコードが作成されます。
  4. 人々があなたのゲームを変更したり拡張したりできるようにしたい場合、何かを変更するためにソースコードを扱う必要がなければ、それははるかに簡単です。
  5. チームで作業する場合、上記の点はさらに重要です。ライターがダイアログを入力するためだけにコードを台無しにする必要はありません。
  6. 既存のライブラリを使用する場合、XMLまたは他の標準ファイル形式の解析は非常に簡単です。そのため、その方法で実装するコストは非常に低く、多くの利点を提供し、上記の問題を回避します。
  7. @MiloPriceが以下に指摘したように、テキストが外部ファイルにある場合、ゲームをローカライズするのもはるかに簡単です。ファイルを追加することで言語を追加できます。ソースに触れることなく、チームが翻訳を処理できます(すべてのコードを表示することになっていない人に翻訳を許可する場合は特に重要です-フリーランサー、自分のチームに属していないコミュニティなど)。

10
あなたのコードを混乱させるとは言いません。そうでなければ、コンテンツであろうとなかろうと、何もかもが混乱とみなされます。コードと同じように、コンテンツを適切な構造で構成できます。しかし、残りのポイントは依然として強力です。
グレンスワン14

28
ローカリゼーション/翻訳の容易さも別の大きな利点です。
ミロP 14

2
@Christian:データを直接インプレースで使用できる形式でプログラムにデータが埋め込まれたデータ駆動型プログラムを作成できます(たとえば、CまたはC ++で、const静的ストレージ期間のある大規模な配列)。これにより、実行時に外部データ表現をロード/変換するためのすべてのコードとランタイムメモリコストが節約されます。もちろん、データを外部に保持するその他の理由はすべて適用されます。
R .. 14

2
個人的には、ここで列挙したのと同じ理由で、より強力なアプローチを好みます。ほとんどのコードをスクリプト言語でも移動します。C / C ++でコアを構築し、PythonやLuaなどの言語を埋め込み、APIをエクスポートします。Don't Starveこのアプローチに従い、それは私が見た中で最もよく書かれたゲームの一つです。過去および現在の他の多くのゲームもこれを行い、アプリケーション(およびまれにユーティリティ)も同様です。全体として、小さなプロジェクトや小さなユーティリティ以外では、重層化分離は常にあなたの友人だと思います。
mechalynx 14


30

ゲームコンテンツデータをコードに入れると、そのゲームコンテンツデータの潜在的な変更または反復を確認するには、ゲーム自体を再コンパイルする必要があります。これは2つの理由で悪いです:

  • ゲームが記述されている多くの言語では、コンパイル時間が長くなります。C ++は特にこの点で非常に悪い場合があり、C ++は大規模な商用ゲームの非常に一般的な言語です。C#やJavaなどの言語では問題になりませんが、ゲームを実際に実行して変更を確認しながらホットリロードできる外部ファイルにゲームデータを保存できるほど高速ではありません。

  • 多くのゲームは、多くの場合、コンテンツを制作する非技術的な開発者(デザイナーやアーティスト)で構成されるチームによって開発されています。非技術者はゲームを再コンパイルしたり、「面倒なプログラマーツール」に対処してコンテンツを反復したりする必要がないだけでなく、プログラマーのみにソースコードを公開するのを最小限に抑えることが望ましい場合があります(ソースコードにアクセスできれば、それを漏らすことができる人が少なくなります-偶然かどうかにかかわらず)。

テキストまたはXMLファイルからデータをロードする複雑さを過大評価していると思います。ほとんどの場合、これを行うにはライブラリを使用する必要があります。これにより、XML / JSON /などの解析プロセスがはるかに簡単になります。はい、データ駆動型のレベルローディングシステムを書くには少し前払いのコストがありますが、一般的に各レベルを表すユニークなクラスのトンに対して、長い目で見れば多くの時間を節約できます。

小規模または単純なゲームは、データ駆動型アプローチの長期投資からそれほど多くの利益を得ることができないため、開発者がそれをサポートする既存のフレームワーク/エンジンを使用していない限り、単純にデータをエンコードする方が効率的かもしれませんゲームコード。

もちろん、特定のゲームがデータを外部ファイルに格納する(またはしない)ことを選択する理由は多数あります。それらをすべてリストすることはできません。あるレベルでは、通常、それらはすべて、ゲームを再構築しないことで提供できる追加の反復速度または柔軟性に要約されます。


コンパイル時間はそれほど重要ではないと思いますが、開発者として常に「ニートコード」に努めています...これは、それ自体を適切に分離するためのかなりの理由です...
戦争14

4
C ++では@Wardyのコンパイル時間が非常に重要です。プロジェクトのサイズ、テンプレートの積極的な使用、または開発者の怠laz(不要なヘッダーを含む)のいずれかのために、ビルドに15分以上かかるソリューションを使用しました。そして、これは巨大な商用ゲームの場合だと確信しています。
concept3d 14年

1
@ concept3d:私のプロジェクトが15分であったことを望みます。専用ビルドサーバーでのクリーンビルドには、約50分かかります。
Mooingダック14年

ソースコードにアクセスできる人が少ないほど、C ++が引き起こす脳の損傷に苦しむ人が少なくなります。:P
セージボルシュ14

ホットリロードのポイントを見逃している人もいると思います-ゲームの再コンパイルに30秒かかる場合、アーティストはゲームを再起動したくない場合、キーボードショートカットが必要なため、異なるアニメーションをテストできますその場でテクスチャ。実際、これは彼らが最も望むものの一つです。ゲームの外で物事がどのように見えるかを見るのは一つのことですが、ゲームでそれらを見ることが重要です。
wolfdawn 14年

7

いつものように、いつものように、それは依存します。しかし、最初に、ハードコーディング自体は悪くないことを主張したいと思います。

いくつかの単純なゲームでは、ハードコーディングされたコンテンツ、特にダイアログテキストがありますが、世界は終わりませんでした。プログラマーは抽象化が大好きですが、抽象化の各レイヤーがプログラムをより複雑にし、理解しにくくすることを忘れないでください。

ゲームがシンプルで、コンテンツをハードコーディングできる場合は、単純にするためにゲームを検討します。

ただし、これは実際にはあまりスケールしません。コンテンツを外部リソースに配置する最も一般的な理由は、チームワークを簡素化することです。1人またはチームがゲームの作成に集中し、別の人またはチームがコンテンツの作成と洗練に集中できるためです。

ただし、プログラムとコンテンツの間に線を引くことは必ずしも簡単ではありません。テクスチャは100%コンテンツであると言えます。しかし、手続き的に生成されたテクスチャはどうでしょうか?ダイアログテキストは100%のコンテンツと見なすことができます。しかし、以前のアクションに応じてダイアログが変更されるときはどうでしょうか?スクリプトやシェーダーなど、プログラムの100%の一部であると見なされる他の要素も、ゲームのコンテンツの一部と見なされます。ハードコーディングする必要がありますか?外部リソースとしてロードする必要がありますか?

ただし、ゲームでサポートする各タイプのコンテンツには、それに関連するロードおよび解釈コードが必要であるため、一般的に、疑わしい場合は、コンテンツをハードコーディングし、外部リソースにのみ持ち出すことをお勧めします本当にその柔軟性が必要です(あなたがそれを必要とすると思うときではなく、実際に必要とするとき)

最後に、リソースファイルにデータを保存する利点の1つは、必要な場合にのみロードできるため(ゲームのロード時間を短縮できる可能性がある)、不要になった場合にアンロードできることです(したがって、より多くのコンテンツを保持できます)メモリに収まるよりも)。(Nitpickersのコーナー:リソースDLLはほぼ間違いなく外部リソースと見なすことができます)


7
「しかし、抽象化の各レイヤーは、プログラムをより複雑にし、理解しにくくすることを忘れないでください。」私は同意しなければならない、抽象化はプログラムをより単純にすることができ、確かに理解しやすくする必要がある。
NPSF3000 14年

1
@ NPSF3000抽象化複雑さを増しますが、追加するよりも複雑さ取り除くことできます。
user253751 14年

2
@immibis。したがって、抽象化実装した後のプロジェクトの複雑さの合計は、以前よりも低くなります。
NPSF3000 14年

3
@ NPSF3000:私のポイントは、できるからといって抽象化を作成すべきではないということです。データをハードコーディングする方が簡単で、わかりやすく、簡単です。たいていの場合、ゲームがソフトコーディングへの道をたどるのにしましたが、それは残念です。また、抽象化を追加することは、削除するよりも常に簡単なので、必要な場合にのみ抽象化を追加することを強く推奨します。
パンダパジャマ14年

「できるからといって」何かをする@PandaPajamaは、それが何であるかに関係なく、問題を引き起こす可能性があります。それは、何かが本質的に複雑であることを意味するものではなく、それが私の関心事でした。また、抽象化を追加することは、抽象化を削除するよりも簡単だと思いますか?私の頭上ではそうではないと思います-抽象化を後から追加することは重要なリファクタリングを意味しますが、不要な抽象化の削除が複雑になる場合をすぐに考えることはできません。XMLからハードコードされた文字列への変更は簡単なはずです。
NPSF3000 14年

3

テキストファイルに保存する大きな理由は、再利用性です。テキストファイルからマップ、ダイアログ、およびその他のリソースを読み取るテキストゲームフレームワークを作成すると、他のゲームでフレームワークを再利用できます。テキストゲームを超えて、これはCall of Dutyのような大きな予算のタイトルが毎年新しいゲームをリリースする方法です。

もう1つの理由は、移植性です。Web、PC、Mac、Androidなどに同じファイルを使用できます。これらの異なるプラットフォーム用にフレームワークをモックアップするだけで、ゲームデータの大部分は変更されません。

ファイルにスクリプトとデータが保存されているテキストベースのゲームを超えると、再コンパイル時間が短縮され、データを簡単に操作するためのインターフェイスを作成できるようになります。


1
もちろん、ほとんどのものを再利用可能にすることで、すでにあるルールから「特別な」ことをやめざるを得ない傾向があります。私は間違いなくビッグゲームのハードコーディングを推奨していませんが、試作ゲームや実験的なゲームを書いているときに非常に便利です-それはあなたにはるかに柔軟性を与えます。もちろん価格が付いているので、ゲームプレイが実際に機能するようになったら、すべてをリファクタリングすることをお勧めします。ゲームプレイは難しい部分です-建築地獄を飛び越えずにテストできることを確認してください:Dコンクリートを手に入れた後、通常は一般的な形を見つける方が簡単です。
ルアーン14年

3

変更を高速化するために、大規模なプロダクションでの開発をトン単位で高速化します。

簡単な変更を加えるためにソースにアクセスしてソースを編集する方法を全員に教える必要はありません。実際のコードからそれをドラッグすることで、より多くの人がだまされる機会を得ることができ、どのオプションで遊ぶことができるかを見つけやすくなり、ゲームのさまざまな部分を微調整するプロセス全体がはるかに短い時間で済みます。Q&Aでもサポートできます。


3

誰もまだこれについて言及していなかったとは信じられませんが、大きな理由はローカリゼーションをもっと簡単にすることです。英語、フランス語、ドイツ語、スペイン語、ポルトガル語、イタリア語、ロシア語、中国語、および目的とするその他の言語をサポートする必要がある場合、ハードコーディングするには、すべての言語に個別のコードビハインドが必要です。また、特定のコンテンツを削除する必要がある場合(検閲)、コードを変更して回避する必要があることも意味します。 「。また、他のライブラリをロードする必要があるため、言語を変更するためにゲームを再起動する必要がある可能性が高いため、消費者にとってはやや不愉快です。最後に、

一方、外部リソースを使用している場合、異なる言語をサポートすることは、異なるリソースファイルをロードすることを意味します。これは、ゲームの実行中に簡単に実行できます。つまり、単一のコードベースを使用できるため、開発が大幅に簡素化されます。また、他の言語のリリース後サポートを簡単に追加できることも意味します。最後に、特定の言語(ゲームではそれほど頻繁に行われない機能ですが、まだ可能な機能)のインストールをユーザーにオプトアウトさせて、ディスクスペースと帯域幅を節約できることを意味します。


3

キーフレーズは懸念の分離だと思います。

コードにテキストが含まれていない場合、コードはそれほど複雑ではありません。コードを記述するプログラマーは、特定のテキストについて考える必要がなく、コードに集中できます。

彼はローカライズについて考える必要はありません。ローカライズを行う人は、コードを心配する必要はありません。


3

「白より枯れた」男になるのは簡単すぎると思い、外部のテキストリソースファイルを暖かく使用することをお勧めします。

どうして?ここには、各ソリューションのコスト/問題/利点のバランスを取るという選択肢があるためです。

外部ファイルを使用する場合...まあ、他の答えは利点を十分に説明していると思います。しかし、コストはどうですか?有効な形式を定義し、インタープリターを作成し、ファイル形式に同意する必要があります。さらに悪いことに、別のアプリケーション(エディター)を作成する必要があります。大規模なプロジェクトを構築している50人のコーダーチームのメンバーである場合、これは0.00%の問題です。しかし、あなたが一人でいる場合:あなたは失速しています。

繰り返しますが、外部リソースの大きな柔軟性の利点を過小評価していません。データ駆動型プログラミングは、ビデオゲームに行く方法のように思えます。しかし、コストを忘れないでください。

一方、コード内にテキストを含めると、迅速なプロトタイピングが可能になるため、初めて使用することをお勧めします。次に、プロジェクトが成熟するにつれて、ダイアログのモデル化に必要なデータの種類(mood / history-state / ...)を分析することをお勧めします。その後、ある時点でクラス/ルール/ファイル形式を決定し、本物に進み、他の人がコードをコンテンツから編集/分離できるようにします。または、シンプルなダイアログ(マリオ...)を使用するゲームの場合、コストが高すぎると考え、いくつかの文字列/動作をハードコーディングしたままにします。
あなたの電話。

(ローカライズについての注意:ハッシュテーブルから離れているため、独立した簡単に解決可能な問題です。)


ただし、テキストをコードに挿入した場合でも、これらのことのいくつかは真実です。それでも、特定の形式、ツリー内を移動する方法などが必要です。これを念頭に置いて、特にこれらのファイルの解析、書き込み、編集、および作成用の成熟したライブラリおよびエディターが存在するため、外部コンテンツソースを実装するための追加コストは比較的低いようです。ダイアログの複雑さによっては、特殊なエディターを使用せずに、標準のテキストエディターを使用することもできます。
クリスチャン14

1
確かに、私は十分に明確ではなかったのかもしれませんが、ダイアログの形状が何であるかを知っているだけです(単純な直線から複雑なツリーまたは状態マシンまで)。最初のステップでは、いくつかの(最も簡単な)ifs +いくつかのハードコードされた文字列は問題ありません。次に、ニーズを明確に予測できる場合は、各ソリューションのコスト/メリットを評価してから選択します。
GameAlchemist 14

現在のワンマンゲームプロジェクトで使用している妥協点は、コンパイル前に解析済みファイルから生成されたコンテンツをハードコーディングすることです。多くの場合、これは両方の世界で最悪のソリューションになりますが、実際に必要なのはかなり良いことです。
グレナトロン14年

2

ライセンスは、コードにコンテンツを含めない理由でもあると思います。

例えば、

  • あなたのコードはFLOSSかもしれませんが、コンテンツにまったくライセンスを与えたくありません(他の人が異なるコンテンツで同様のゲームを作成できるようにゲームコードを公開したいかもしれません)
  • コードはFLOSSかもしれませんが、コンテンツにはクリエイティブコモンズライセンスを使用する必要があります(ソフトウェアライセンスコンテンツではうまく機能せず、その逆も同様です)
  • あなたのコードはプロプライエタリであるかもしれませんが、無料のコンテンツを再利用しています
  • あなたのコードはプロプライエタリであるかもしれませんが、あなたはフリー/リブレライセンスの下であなた自身のコンテンツを公開したいです
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.