【Unity?】ロジックを独立させる。乱数クラスを例とした依存関係逆転の法則の適用について

はじめに

趣味でボードゲームやパズルゲームを主としたゲーム開発をしていますが、もくもく会で「Unityを使用しない形でロジック部分を作成して、Unityは画面に表示したりユーザーの操作を受け取るの役割で作成してます」と話をしたら、「乱数のクラスとかどうしてますか?」と質問頂いたので回答がてら記事にします。

前提

基本的に下図のパッケージ構成でゲームを作成しています。

MyGame:MVC、MVPで言う所のM担当。ゲームの要素やルールと行ったロジック部分を管理します。

MyGameforUnity:MVCで言う所のVC、MVPで言う所VP担当。実際に作成する際はVとC、VとPを分割しますが今回は省略します。

で、基本的にMyGameの部分はピュアなC#で作るようにしています。

質問

RandomとかMathのクラスを使用する場合にどうしているのか。.Netのライブラリで代用しているのか。

.Netのライブラリで代用?

回答

依存関係逆転の法則を適用して解決してます。

依存関係逆転の法則について

SOLID原則の一つ。

A.上位のモジュールは下位のモジュールに依存してはならない。どちらのモジュールも「抽象」に依存すべきである。

B.「抽象」は実装の詳細に依存してはならない。実装の詳細が「抽象」に依存すべきである。

著:ロバート・C・マーチン 訳:瀬谷啓介 アジャイルソフトウェア開発の奥義

詳細は引用元の本を読んでください。

依存関係逆転の法則を適用する

依存関係逆転の法則を適用せずにUnityのRandomクラスを使用する場合

依存関係逆転の法則を適用しない場合

依存関係逆転の法則を適用しない場合、Unityが無いと動かないと言うことで前提のパッケージ構成通りに作れません。

依存関係逆転の法則を適用する場合

依存関係逆転の法則を適用する場合

まずは、ロジック(domain)が必要とする乱数のインターフェースを定義します。

そして、インターフェースの実装クラスをUnityや.NetのRandomクラスを利用して実装します。

実行環境に応じて依存性の注入(DI)しています。

と言った感じで解決しています。

金策「GMOの株主優待でConoHa の費用を節約」

概要

GMOの株主優待でConoHaの維持費を節約しようという話。

ConoHaについて

GMOが提供しているレンタルサーバーのサービスです。

このサイトはConoHaのVPS(メモリ1GB)のプランで運用してます。

参考:https://www.conoha.jp/vps/?btn_id=header_vps

方法

  1. GMOインターネット 株式会社(9449) の株を1単元(100株)購入する。
  2. 年2回(毎年6、12月末日権利確定) の株主優待(参照: https://ir.gmo.jp/st-newstockholders/second/)で各種サービス利用料5,000円分 を取得する。
  3. 上記をConoHaの支払いに充てる。

感想

ConoHaのVPS メモリ1GBのプランが月額972円(税込)。12ヶ月で11,664円。

優待が5000円の年2回で10,000円。

差し引き1,664円でサーバーが1年間運用できる。

さらに配当金が1株あたり29.5円(2018年実績)、100株で2950円。

むしろプラス。

てなわけで個人的には株式投資のリスクを負えるならお勧めです。

優待はお名前.comでも使えるので、既にサーバーがある人はドメイン代に充ててもいいかもしれません。

金策「Google アンケート モニター」

概要

金策としての「Google アンケート モニター」についてまとめたページです。

方法

Google Playでアプリ「Google アンケート モニター」をインストールしてたまにくるアンケート( 1回数分、月10回前後)に回答するだけです。

報酬

アンケート回答毎に Google Playのクレジット 10~100円(50円を超えたのは2回)。

大体一年で1500円くらいは稼げます。

感想

稼げる額は少ないですが、Androidのスマートフォン1台あれば気楽に開始できるため、おすすめです。

これまでに稼いだ額(2016年7月開始)

2019年2月6日時点

4497円

独善的システム設計論「設計=分割×命名×構築」

設計=?

設計=分割×命名×構築

概要

独善的システム設計論として、システム設計について個人的に考えていることを纏めていくにあたり、まず最初に「設計=分割×命名×構築」という考え方について説明します。

設計=分割×命名×構築

システム設計とはシステム化する対象を分割し、分割した要素に命名し、構築することである。

以下、「分割」「命名」「構築」の3要素について概要を解説する。

分割

システム化する対象を、特定の観点と基準で細分化すること。

様々なレベルの「分割」があり、複数の「分割」を用いてシステムを設計する。

分割の例

  • MVC
    アーキテクチャの一つ。システムをモデル(Model)、ビュー(View)、コントローラー(Controller)の3つに分割する。
  • オブジェクト指向
    パラダイム(考え方)の1つ。システム化する対象を複数のオブジェクト(データとそれに関する振る舞いを纏めたモノ)から構築されていると捉え、オブジェクト間の相互作用によって対象のシステムを捉える考え方。
    ⇒要はシステムを複数のオブジェクトに分割して捉える考え方。
  • 3層アーキテクチャ
    Webシステムのアーキテクチャの1つ。プレゼンテーション層、アプリケーション層、データアクセス層の3層に分割して構築する。

命名

「分割」した個々の要素に名前を付けること。

「命名」の基本は

  • 適切な名前を付ける。
  • システム内で一意な名前を付ける。
  • 同じ意味の要素に複数の名前を付けない。

構築

「分割」し「命名」した各要素を組み立てシステムを作成すること。

各要素間の繋がりを定義すること。

最終的にはプログラミングしたプログラムによって表現する。

プログラミングは設計の一部です。

おわりに

投稿内容は私個人の意見です。
私の所属する企業・部門には一切関係ありません。

【Unity】スプライトにEventTriggerでクリックやタッチ時のイベントを設定する。

環境

Unity Version 2018.1.1f1 personal

手順

シーンにイベントシステムを追加

Hierarchy(ヒエラルキー)の何も無いとこを右クリック⇒UI⇒「Event System」で追加。

カメラ(Main Camera)に「Physics 2D Raycaster」を追加

「Main Camera」のInspector(インスペクター)から「Add Component」⇒Event⇒「Physics 2D Raycaster」で追加

対象のスプライトに「Collider」と「Event Trigger」を追加

「Collider」を追加

対象のスプライトのInspector(インスペクター)から「Add Component」⇒「Physics 2D」⇒「*** Collider」で追加
※Colliderの種類は任意。

「Event Trigger」を追加

対象のスプライトのInspector(インスペクター)から「Add Component」⇒「Event」⇒「Event Trigger」で追加。

後は「Event Trigger」の「Add New Type Event」で任意のイベントを追加する。

四川省・二角取りのアルゴリズム

四川省・二角取りのゲームを作成中なので、
アルゴリズムのメモ

前提

  • 取る牌の位置は同じでないこと。
  • 下記の図を例に説明。

アルゴリズム

1 取る対象の牌の位置を含めてそれぞれのx軸の空いている位置を探索。

2 上記で探索したそれぞれの位置から同じx軸の位置を選択し二つの位置間に牌が無いか確認。無ければ取れる。

取れない場合。

取れる場合。

3 y軸についても同様に確認する。