ゲーム化!tomo_manaのブログ

ゲーム化!tomo-manaのブログ

Unityでゲームを作る方法について紹介しています

Unity学習#33-1 メッセージと送り先に求められるもの

シーンによるプロジェクトの分割を考えるにあたり、メッセージに求められる条件を考えました。


(「シーンによるプロジェクトの分割」と呼んでいるのは、ゲーム自体を複数のシーンに分けて作業性を高め、分割・結合を簡単にできるようにすることです。ゲーム全体を一つのマネージャー(ゲーム全体のデータを管理する構造体)に管理させるだけでなく、全てのシーンが揃っていなくても、最低限のシーンだけでテストができるようにします。)

概要

1) シーン間で送り合うメッセージの形態について考えた時に、メッセージと送り先をどう定義したらいいかで悩んだ。
2) 究極的には、送り先まで含めたメッセージはシステムの中でユニーク。メッセージは自然数(ID)でも良いし、文字列(ハッシュ)でも良い。文字列がハッシュ(ほぼユニーク)として機能しない場合、システムの外に管理台帳を置くことが前提。
3) 一般的な傾向として、メッセージ、送り先がそれぞれユニークかユニークでないかで、4種類に分類できる。それぞれ目的が異なる。また、日常的にメッセージを発する時、4種類を無意識に使い分けている。

メッセージの目的

特定の受け側に特別な何かを要求する、または受け側が何かするために合図をかけてもらうために送ります。

メッセージと送り先

メッセージは、受け側(送り先)とセットになります。

メッセージの型

メッセージがシステム内で一意に解釈できる(ユニーク)場合、送り先が省略できます。この場合、メッセージに送り先が暗黙的に含まれます。
メッセージがシステム内で一意に解釈できない(ユニークでない)場合、メッセージに一意さを求める追加の情報(文脈)、または送り先が必要です。一意に解釈できない、というのは、解釈に揺らぎがある、拡張性があるなどを指します。この場合、メッセージに追加の情報が追加されます。送り先も、この中に含まれます。

送り先の型

送り先は名前位置情報がセットで表現される。最終的な送り先は、あるツリー構造の1ノードです。よく考えると、住所メールアドレスURLファイルシステムも、みんなツリー構造をしています。漏れなく記載された送り先は、この世界に一つしかない場所です。送り先の各セグメント内で一つも重複してなかったなら。

プロトコル 根(root) 節(node) 葉(leaf)
住所 都道府県、市町村 番地、氏名
メールアドレス トップレベルドメイン ドメイン ユーザー名
URL トップレベルドメイン ドメインディレクト ファイル
ファイルシステム ルートディレクト ディレクト ファイル

メッセージと行動の決定

これまでの記述をまとめると、以下になります。

(1) プログラムの世界では、メッセージは常に誰か何らかのアクションを起こしてもらうために送ります。

(2) メッセージがユニークとは、特定の行動を誘発するかどうかを指します。
送り先がユニークとは、相手が特定できる(=特定の相手にしか意味を持たない)かどうかを指します。

(3) 誰かにメッセージを送りたい時、そのメッセージは、少なくとも特定の個人しか意味を持たなかったり、あえて相手を特定しなかったりします。送り先とメッセージの組み合わせで、以下の4種類に分かれます。

f:id:tomo_mana:20210417004350p:plain
メッセージと行動決定

メールボックス

特定の相手にしか意味を持たず、またそのメッセージだけで行動を誘発するのは、たとえば手紙(メールボックスです。

ブロードキャスト

特定の相手でなくても意味を持つが、特定の行動を誘発するのは、たとえば緊急警報、避難指示、迷子のお知らせなど(ブロードキャスト)です。

あいまいな指示

メッセージが特定の相手にしか意味を持たないが、そのメッセージだけで特定の行動を誘発できないものは、たとえばスローガンやプロパガンダ(背景や文脈が分からないと行動を起こせない言葉)です。その組織に属して、あの上司が言っているのだから、きっとこういう意味だろう、となります。メッセージを受けた相手は、さらに上司に説明を求めるか、あるいは思考停止(無視)します。

情報拡散、あるいは謎

メッセージが特定の相手でなくても意味を持ち、また特定の相手でなくても意味を持つものがあるとすれば、それは拡散情報です。たとえば新聞などの状況説明やゴシップ、ネット上などでのさらしなどでしょうか。そこから誘発される行動は、情報発信者からは想像もつかないので謎です。

システムにおけるメッセージの使い分け

システムにおけるメッセージの使い方として、最も一般的に使われるのは、特定のタスク/スレッドに対するサービス開始/終了などの指示です。これは特定のタスクのメールボックスにメッセージを投げ込んで使います。タイマーもこれに含まれます。

ブロードキャスト(ルート決定)

ブロードキャストは、ルートを自動で決定する仕組みで使われます。たとえば、IPアドレスを取得するために使われるDHCPプロトコルでは、IPアドレスを誰がくれるか分からない段階では、周りにいる全てのコンピュータに対して一斉にブロードキャスト(DHCPディスカバー)を飛ばします。DHCPサーバーはこれに応答して、IPアドレスが必要な特定のコンピュータに対してだけ必要な応答(DHCPオファー)を返してくれます。

あいまいな指示(メッセージ拡張・オプション・文脈指定)

あいまいな指示は、サービスの要求など、条件によって場合分けをするケースで使われます。たとえば、SSL/TLS暗号化通信では、暗号化の種類(オプション)を指定します。また、ネットショッピングで使われているHTTPは、何も指定しないときはいつも同じページを返しますが、マイページで購入情報を入力し終わると次のページに移動する処理をするためには、購入する個人(送り先)を特定するためのセッションIDや、購入情報(文脈)を設定するクッキーなどを追加することで、サーバーは次のページを表示するかどうかを判断します。

メッセージがユニークであること

任意のサービスから他のサービスにメッセージを送る場合、送り先まで含めたメッセージはシステム全体でユニークである必要があります(そうでないと複数の相手にメッセージが届いてしまう)。通常、複数の人数で開発を進める場合、開発者間のやり取りのため、システムの外に管理台帳を置きます。

もし、目的のサービスが存在しない場合、目的のサービスに近いサービスが代理応答するケースを考えた時、代理応答するサービスは、どの送り先に向けて送られたどのメッセージを代理応答するか決めます。その時、複数の解釈ができてしまうと、代理応答に失敗します。その意味でも、送り先を含めたメッセージはシステム全体でユニークである必要があります。

ユニークを作る方法は少なくとも2つあります。一つは台帳管理(通し番号=自然数、もう一つはハッシュ(=文字列)です。文字列に、十分な命名規則があり、メッセージ名が重複しない場合、ハッシュでシステムを構成できます。そうでない場合は、システムの外に台帳を持つのが一般的と思いました。

(以上)