プレーヤーがアチーブメントを完了したかどうかを確認するにはどうすればよいですか?


13

MMOゲームを作成していますが、成果を実装する必要があります...どうすればよいですか?最も簡単なことは、これを100msごとに1回実行することです。

for a in achievements
    for p in players
        if a.meetsRequirements(p) then p.completeAchievement(a)

しかし、それはさらに複雑な問題を引き起こします。たとえば、アチーブメントが実際に完了したかどうかを確認するにはどうすればよいですか?プレイヤーは特定の成果のためだけにカスタムプロパティを持っていますか?私はクエストでこの種のことをしました。なぜなら、それらは主に「100個の木材を収集する」からです。また、それをチェックするより良い時間があるはずです、これは私のサーバーを定期的に遅くするでしょう、と思います。


7
アクションが行われたときに適切なチェックを実行しないのはなぜですか?すなわち、ユーザーが木材を収集する場合、「木材を収集する」仕様に一致するかどうかを確認します。
マイククロック

1
ちょっと面倒くさいようです...あちこちにたくさんのチェックがあります。私は...私はので、それのシンプルで、上記のアルゴリズムに固執すると思う
jcora

10
面倒な作業を減らす方法があります。たとえば、「OnChange」イベントハンドラーを使用して、それらにアチーブメント「オブジェクト」を添付し、そこでロジックを処理するなどです。また、現在の設定ではO(n ^ 2)レベルの複雑さを持っていることを理解してください。これは、より多くのキャラクターでゲームがかなり遅くなることを意味します。MMOの一種の問題
マイク・クラック

回答:


23

何をするかは、成果の性質に依存します。実績がすべて単純なパターン(X個のYを収集)に適合しない限り、ある程度特殊なケースを作成する必要があります。

メッセージベースの通信システムを使用して、特殊なケースのコーディングをローカライズするフックを提供できます。特定のアクションで、自分自身を登録するリスナーにメッセージを送信できます。その後、アチーブメントコード/スクリプトを適切なリスナーに登録するだけで、アチーブメントを実行するために必要なテストを実行できます。

実績をリッスンしたい典型的なイベントについてのメッセージがあります。「プレイヤーがアイテムXを獲得した」や「エンティティYがエンティティZを殺した」などです。このようにして、プレイヤーが殺したZの数などを追跡できます。

これはおそらく、達成のためのシステムに対してできる最善の方法です。コードを可能な限り集中化し、実際の成果を検出するためにリスナーに責任を負わせます。

また、集中化されたアチーブメントシステム(X-Box Live、Steamアチーブメント)の場合、アチーブメントへの進捗は通常サーバーに保存されることに注意してください。したがって、アチーブメントの累積(「タスクXYの回数を実行」)の場合、アチーブメントスクリプトはXがいつ実行されたかを検出し、サーバーのカウントを増やします。他の種類の成果(「タスクXを実行する」)の場合、サーバーの成果はバイナリです。それを実行したか、実行していないかのどちらかです。


+1これは素晴らしい情報です。現時点で成果を実装する必要がなくても便利です。
ジョシュアヘッジズ

ありがとう!これを実装するのを待つことができない、私は私が...前にこのアイデアを持っていたい
jcora

3

アチーブメントの性質に応じて、何らかの「マーカーアチーブメント」を導入することもできます。

あなたは例のために持っている場合は、連続して3回の実績:
ウッド1 -コレクト100木材
ウッド2 -コレクト500木材
ウッド3 -収集1K木材

その後、プレーヤーが完了するまで、最初のアチーブメントのOnChangeイベントを登録するだけで十分です。完了すると、次の達成オブジェクトを登録できます。

もちろん、これには実績の依存関係ツリーの設計(または計算)が必要です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.