簡単にデータにアクセス!?Singletonをふんわり理解する!

image

-- 注意!! 雰囲気で理解できればOK理論で、曖昧な表現が多いです・・・ --

Unityで遊んでたある日のこと・・・

「う〜ん、このGameManagerオブジェクト、FindとかGetComponentせずに、 もっと簡単にアクセスできないかなぁ・・・」
「ム、ムム!?Singleton ??」

Singleton?なんだそれ・・・

調べてみると、Singletonとは以下のことを指すようです。

「シングルトンとは、オブジェクト指向プログラミングにおけるクラスのデザインパターンの一つで、
実行時にそのクラスのインスタンスが必ず単一になるよう設計すること。」

(引用:https://e-words.jp/w/%E3%82%B7%E3%83%B3%E3%82%B0%E3%83%AB%E3%83%88%E3%83%B3.html)

なるほど、つまりGameManagerのような同一シーンに2個以上存在して欲しくないクラスを、
Singletonによって1個に制限?するような考え方のようです。

「あ、あれ?Singletonがデータに簡単にアクセスする方法じゃないの?」

どうやら

Singleton == データに簡単にアクセスする

ではなく

Singleton == クラスのインスタンスが1つしかないことを保証する

ということらしいです。

プログラミング初心者の自分は最初、Singletonにすること自体が、データに簡単にアクセスできるようになる と勘違いしていました💦
(しっかりとオブジェクト指向の勉強もしていかなくては・・・泣)

さて記事の本題の「データに簡単にアクセスする」のは、単にアクセス修飾子のstaticのようです。

staticは 「メモリ領域を最初に確保する」 == 「ずっとある。」 == 「インスタンス化してから使う必要がない」   ということで、staticなクラスにすることで、そこに簡単にアクセスできるようになります。

ちなみに余談ですが、C#においてstaticのメモリ領域が割り当てられるのは、そのクラスが初めて評価されるタイミングのようです。
参考 : https://bxdxmx.hatenablog.com/entry/20090623/1245766764

本題

では、GameManagerのような簡単にアクセスできつつ、1つしかないことを保証したいオブジェクトがあります。 ということで、static と Singletonを組み合わせることで綺麗に実現できそうじゃないですか??

MonoBehaviorを継承した汎用的なSingletonクラスのコードをご紹介します。 参考 : https://github.com/dilmerv/UnityMultiplayerPlayground/blob/master/Assets/Scripts/Core/Singleton.cs


 public class Singleton<T> : MonoBehaviour
        where T : Component
    {
        private static T _instance;
        public static T Instance
        {
            get
            {
                if (_instance == null)
                {
                    var objs = FindObjectsOfType(typeof(T)) as T[];
                    if (objs.Length > 0)
                        _instance = objs[0];
                    if (objs.Length > 1)
                    {
                        Debug.LogError("There is more than one " + typeof(T).Name + " in the scene.");
                    }
                    if (_instance == null)
                    {
                        GameObject obj = new GameObject();
                        obj.name = string.Format("_{0}", typeof(T).Name);
                        _instance = obj.AddComponent<T>();
                    }
                }
                return _instance;
            }
        }

このSingletonクラスを継承することで、簡単にSigletonを実装できます。 使い方は以下の通りです。


public class GameManager : Singleton<GameManager>
{
     ・・・

いつもMonoBehaviourで継承しているところをこいつに変えてやりましょう!!
そしてあとはGameManager.Instance.〇〇のように取得ができます。

最後に

なんとなく少しでも理解の手助けに慣れていたら幸いです。

またさらに、複数のシーンでまたぐオブジェクトにしたい時は、DontDestroyOnLoad()を入れると良いでしょう。 参考 : https://dkrevel.com/makegame-beginner/make-2d-action-game-manager/

またさらに詳しくSingletonなどについて調べたい方は、以下の記事が参考になる気がします。

https://soft-rime.com/wp-content/uploads/2022/09/Unity%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B%E8%A8%AD%E8%A8%88%E6%8A%80%E8%A1%93%EF%BC%88%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%80%80%E3%82%B7%E3%83%B3%E3%82%B0%E3%83%AB%E3%83%88%E3%83%B3%EF%BC%89.pdf

https://qiita.com/Kosei-Yoshida/items/d7dc37bcde3a52cb5265#static-class-singleton

お知らせ

可茂IT塾ではFlutterインターンを募集しています!

可茂IT塾ではFlutterインターンを募集しています!

可茂IT塾ではFlutterインターンを募集しています!可茂IT塾のエンジニアの判断で、一定以上のスキルをを習得した方には有給でのインターンも受け入れています。

Read More
U30可茂ITインターンハッカソン

U30可茂ITインターンハッカソン

12月28,29日開催。2日間でアプリ開発の企画から完成までを目指す!U30可茂ITインターンハッカソンを開催します。

Read More

タグ

Flutter (108)初心者向け (28)イベント (18)Google Apps Script (15)Nextjs (11)可茂IT塾 (8)Firebase (7)riverpod (6)React (6)ChatGPT (5)デザイン (5)新卒 (4)就活 (4)vscode (4)Figma (4)Dart (4)JavaScript (4)お知らせ (4)FlutterWeb (3)Prisma (3)NestJS (3)Slack (3)TypeScript (3)ワーケーション (3)インターン (3)設計 (2)線型計画法 (2)事例 (2)Git (2)Image (2)File (2)Material Design (2)画像 (2)iOS (2)アプリ開発 (2)React Hooks (2)tailwindcss (2)社会人 (2)大学生 (2)RSS (1)Google (1)Web (1)CodeRunner (1)個人開発 (1)Android (1)Unity (1)WebView (1)Twitter (1)フルリモート (1)TextScaler (1)textScaleFactor (1)学生向け (1)supabase (1)Java (1)Spring Boot (1)shell script (1)正規表現 (1)パワーポイント (1)趣味 (1)モンスターボール (1)CSS (1)SCSS (1)Cupertino (1)ListView (1)就活浪人 (1)既卒 (1)保守性 (1)iPad (1)シェアハウス (1)スクレイピング (1)PageView (1)画面遷移 (1)flutter_hooks (1)Gmail (1)GoogleWorkspace (1)ShaderMask (1)google map (1)Google Places API (1)GCPコンソール (1)Google_ML_Kit (1)Vercel (1)Google Domains (1)DeepLeaning (1)深層学習 (1)Google Colab (1)オンラインオフィス (1)オブジェクト指向 (1)クラスの継承 (1)ポリモーフィズム (1)LINE (1)Bitcoin (1)bitFlyer (1)コミュニティー (1)文系エンジニア (1)Freezed (1)permission_handler (1)flutter_local_notifications (1)markdown (1)GlobalKey (1)ValueKey (1)Key (1)アイコン (1)go_router (1)debug (1)datetime_picker (1)Apple Store Connect (1)FlutterGen (1)デバッグ (1)Widget Inspector (1)検索機能 (1)Shader (1)Navigator (1)メール送信 (1)Firebase App Distribution (1)Fastlane (1)Dio (1)CustomClipper (1)ClipPath (1)カスタム認証 (1)アニメーション (1)Arduino (1)ESP32 (1)経験談 (1)フリーランス (1)mac (1)csv (1)docker (1)GithubActions (1)Dialog (1)BI (1)LifeHack (1)ショートカット (1)Chrome (1)高校生 (1)キャリア教育 (1)非同期処理 (1)生体認証 (1)BackdropFilter (1)レビュー (1)getAuth (1)Algolia (1)コンサルティング (1)Symbol (1)

お知らせ

可茂IT塾ではFlutterインターンを募集しています!

可茂IT塾ではFlutterインターンを募集しています!

可茂IT塾ではFlutterインターンを募集しています!可茂IT塾のエンジニアの判断で、一定以上のスキルをを習得した方には有給でのインターンも受け入れています。

Read More
U30可茂ITインターンハッカソン

U30可茂ITインターンハッカソン

12月28,29日開催。2日間でアプリ開発の企画から完成までを目指す!U30可茂ITインターンハッカソンを開催します。

Read More