ইউনিটিতে, আমি কীভাবে সিঙ্গলটন প্যাটার্নটি সঠিকভাবে প্রয়োগ করব?


36

আমি ইউনিটিতে সিঙ্গলটন অবজেক্ট তৈরির জন্য বেশ কয়েকটি ভিডিও এবং টিউটোরিয়াল দেখেছি, মূলত এটির জন্য GameManager, যেগুলি সিঙ্গলটন ইনস্ট্যান্টেশন এবং বৈধকরণের জন্য বিভিন্ন পদ্ধতির ব্যবহার করে বলে মনে হচ্ছে।

এখানে কি কোনও সঠিক, বা বরং পছন্দসই পদ্ধতির রয়েছে?

আমি দুটি প্রধান উদাহরণের মুখোমুখি হ'ল:

প্রথম

public class GameManager
{
    private static GameManager _instance;

    public static GameManager Instance
    {
        get
        {
            if(_instance == null)
            {
                _instance = GameObject.FindObjectOfType<GameManager>();
            }

            return _instance;
        }
    }

    void Awake()
    {
        DontDestroyOnLoad(gameObject);
    }
}

দ্বিতীয়

public class GameManager
{
    private static GameManager _instance;

    public static GameManager Instance
    {
        get
        {
            if(_instance == null)
            {
                instance = new GameObject("Game Manager");
                instance.AddComponent<GameManager>();
            }

            return _instance;
        }
    }

    void Awake()
    {
        _instance = this;
    }
}

আমি দুজনের মধ্যে যে প্রধান পার্থক্যটি দেখতে পাচ্ছি তা হ'ল:

প্রথম পদ্ধতির গেম অবজেক্ট স্ট্যাক নেভিগেট করার চেষ্টা করবে এর উদাহরণ খুঁজে বার করতে GameManager যার যদিও এটি কেবল ঘটে (বা কেবল হওয়া উচিত) একবার দেখে মনে হচ্ছে এটি বিকাশের সময় দৃশ্যের আকারে বেড়ে যাওয়ার কারণে এটি খুব অযৌক্তিক হতে পারে।

এছাড়াও, অ্যাপ্লিকেশনটির দৃশ্যের পরিবর্তন হওয়ার পরে প্রথম পদ্ধতির অবজেক্টটি মুছে ফেলা না হওয়ার চিহ্ন চিহ্নিত করে, যা নিশ্চিত করে যে বস্তুর দৃশ্যের মধ্যে অবিচল থাকে। দ্বিতীয় পদ্ধতির এটি মেনে চলার জন্য উপস্থিত হয় না।

দ্বিতীয় পদ্ধতির ক্ষেত্রে যেমনটি নজরে আসে না তেমনই অদ্ভুত বলে মনে হয়, এটি একটি নতুন গেমবজেক্ট তৈরি করবে এবং এতে একটি গেমমঞ্জার উপাদান নির্ধারণ করবে। যাইহোক, এই গেমম্যানেজার উপাদানটি দৃশ্যের কোনও বস্তুর সাথে ইতিমধ্যে সংযুক্ত থাকা ছাড়া এটি চলতে পারে না, সুতরাং এটি আমার কিছুটা বিভ্রান্তির কারণ করছে।

সুপারিশ করা হবে যে অন্য কোন পদ্ধতির, বা উপরের দুটি একটি সংকর আছে? সিলেটলেট সম্পর্কিত প্রচুর ভিডিও এবং টিউটোরিয়াল রয়েছে তবে এগুলির মধ্যে এতটাই পার্থক্য রয়েছে যে দুজনের মধ্যে যে কোনও তুলনা আঁকানো শক্ত এবং সুতরাং কোনটি সেরা / পছন্দের পদ্ধতির একটি সিদ্ধান্তে উপসংহারে আসে।


গেমম্যানেজারের কী করার কথা বলা হয়? এটি কি গেম অবজেক্ট হতে হবে?
বাম্মজ্যাক

1
এটি আসলে কী করা GameManagerউচিত তা নয়, বরং কীভাবে সেখানে কেবলমাত্র একমাত্র উদাহরণ রয়েছে এবং তা কার্যকর করার সর্বোত্তম উপায় কী তা নিশ্চিত করা যায়।
ক্যাপ্টেনরেডমফ

এই টিউটোরিয়াল খুব সুন্দরভাবে ব্যাখ্যা, কিভাবে Singleton বাস্তবায়ন unitygeek.com/unity_c_singleton , আমি আশা করি এটা দরকারী হল
রাহুল ললিত

উত্তর:


30

এটি নির্ভর করে তবে সাধারণত আমি তৃতীয় পদ্ধতি ব্যবহার করি। আপনি যে পদ্ধতিগুলি ব্যবহার করেছেন তাতে সমস্যাটি হ'ল যদি বস্তুটি শুরু করার অন্তর্ভুক্ত থাকে তবে এটি গাছ থেকে সরিয়ে ফেলবে না এবং এখনও অনেকগুলি কল ইনস্ট্যান্ট করে এগুলি তৈরি করা যেতে পারে যা জিনিসগুলিকে সত্যই বিভ্রান্ত করতে পারে।

public class SomeClass : MonoBehaviour {
    private static SomeClass _instance;

    public static SomeClass Instance { get { return _instance; } }


    private void Awake()
    {
        if (_instance != null && _instance != this)
        {
            Destroy(this.gameObject);
        } else {
            _instance = this;
        }
    }
}

আপনার উভয় বাস্তবায়নের ক্ষেত্রে সমস্যাটি হ'ল তারা পরে তৈরি করা কোনও বস্তু ধ্বংস করে না। এটি কাজ করতে পারে, তবে যে কেউ কাজটির মধ্যে একটি বানর রেঞ্চ ফেলে দিতে পারে যার ফলে লাইনটি নীচে ত্রুটি ডিবাগ করা খুব কঠিন হয়ে পড়ে। ইতিমধ্যে কোনও উদাহরণ রয়েছে কিনা জাগতে চেক করে তা নিশ্চিত করুন এবং যদি তাই হয় তবে নতুন উদাহরণটি ধ্বংস করে দিচ্ছেন।


2
আপনি OnDestroy() { if (this == _instance) { _instance = null; } }প্রতিটি দৃশ্যে আলাদা উদাহরণ থাকতে চাইলে আপনিও চাইবেন ।
ডায়েটারিচ এপ্পি

গেমওজেক্টটিকে ধ্বংস () যুক্ত করার পরিবর্তে আপনার একটি ত্রুটি বাড়ানো উচিত।
ডুডলমেট

2
সম্ভবত। আপনি এটি লগ করতে চাইতে পারেন, তবে আপনি যদি খুব নির্দিষ্ট কিছু করার চেষ্টা না করেন তবে আপনার কোনও ত্রুটি বাড়ানো উচিত বলে আমি মনে করি না। এমন অনেকগুলি উদাহরণ রয়েছে যা আমি কল্পনা করতে পারি যে কোনও ত্রুটি বাড়ানো আসলে আরও সমস্যার সৃষ্টি করে তবে তা ঠিক হয়ে যায়।
পিয়ারসন আর্টফোটো

আপনি লক্ষ করতে চাইতে পারেন যে ইউনিটি দ্বারা ব্রিটিশ বানানটির সাথে মনো মনোহ্যাভির বানান করা হয়েছে ("মনোোহেভিয়ার" সংকলন করবে না - আমি এটি সর্বদা করি); অন্যথায়, এটি কিছু শালীন কোড।
মাইকেল এরিক ওবারলিন

আমি জানি আমি দেরি করে আসছি, তবে কেবল উল্লেখ করতে চেয়েছিলাম যে এই উত্তরটির Instanceসিঙ্গলটন কোনও সম্পাদক পুনরায় লোড থেকে বেঁচে থাকতে পারে না, কারণ স্থির সম্পত্তিটি মুছে যায় A নীচের উত্তরের একটিতে উদাহরণ পাওয়া যায় না এমন একটির উদাহরণে , বা উইকিউইউটিউটি3 ডটকম / ইনডেক্স.এফপি / সিঙ্গেলটন (যা যদিও এটি পুরানো হতে পারে তবে এটির সাথে আমার গবেষণা থেকে কাজ করে বলে মনে হচ্ছে)
জাকুব আর্নল্ড ২

24

এখানে একটি দ্রুত সংক্ষিপ্তসার:

                 Create object   Removes scene   Global    Keep across
               if not in scene?   duplicates?    access?   Scene loads?

Method 1              No              No           Yes        Yes

Method 2              Yes             No           Yes        No

PearsonArtPhoto       No              Yes          Yes        No
Method 3

সুতরাং আপনার যদি যত্ন করা সমস্ত কিছু বিশ্বব্যাপী অ্যাক্সেস হয় তবে তিনটিই আপনার প্রয়োজনীয় যা আপনাকে পেয়ে যায়। আমরা অলস তাত্ক্ষণিকতা, প্রয়োগকৃত স্বতন্ত্রতা বা বিশ্বব্যাপী অ্যাক্সেস চাই কিনা সে সম্পর্কে সিঙ্গেলন প্যাটার্নের ব্যবহারটি কিছুটা অস্পষ্ট হতে পারে about হতে পারে তাই আপনি কেন পৌঁছে যাচ্ছেন সে সম্পর্কে সাবধানতার সাথে ভাবতে ভুলবেন না, এবং এমন বৈশিষ্ট্যগুলি সঠিকভাবে প্রাপ্ত করার মতো একটি প্রয়োগ চয়ন করুন rather যখন আপনার কেবল একটি প্রয়োজন তখন তিনটির জন্যই কোনও মানক ব্যবহার না করে।

(উদাহরণস্বরূপ, যদি আমার গেমটিতে সর্বদা গেমম্যানেজার থাকে, সম্ভবত আমি অলস তাত্ক্ষণিকতা সম্পর্কে চিন্তা করি না - সম্ভবত এটির গ্যারান্টিযুক্ত অস্তিত্ব এবং স্বতন্ত্রতা সহ আমি কেবল বিশ্বব্যাপী অ্যাক্সেস করি - সেক্ষেত্রে কোনও স্ট্যাটিক শ্রেণি আমাকে ঠিক সেই বৈশিষ্ট্যগুলি খুব সংক্ষিপ্তভাবে পেয়ে যায়, কোনও দৃশ্য লোড বিবেচনার সাথে)

... তবে অবশ্যই লিখিতভাবে পদ্ধতি 1 ব্যবহার করবেন না। মেথড 2/3 এর জাগ্রত () পদ্ধতির সাহায্যে ফাইন্ডটি আরও সহজেই এড়ানো যায় এবং যদি আমরা পরিচালককে দৃশ্যপট জুড়ে রাখি তবে আমরা সম্ভবত নকল-হত্যার বিষয়টি চাই, যদি আমরা তাদের মধ্যে ইতিমধ্যে কোনও ম্যানেজারের সাথে দু'টি দৃশ্যের মাঝে লোড করি তবে।


1
দ্রষ্টব্য: চারটি বৈশিষ্ট্যযুক্ত একটি চতুর্থ পদ্ধতি তৈরি করতে সমস্ত তিনটি পদ্ধতির একত্রিত করা সম্ভব উচিত।
ড্রাকো 18

3
এই উত্তরের জোড় "আপনি সিঙ্গলটন প্রয়োগের সন্ধান করা উচিত যা এটি সব কিছু করে না" বরং "আপনার এই সিঙ্গলটনের কাছ থেকে আসলে কোন বৈশিষ্ট্যগুলি চান তা চিহ্নিত করা উচিত এবং সেই বৈশিষ্ট্যগুলি সরবরাহ করে এমন একটি বাস্তবায়ন বেছে নেওয়া উচিত - এমনকি যদি বাস্তবায়ন হয় মোটেও
সিঙ্গলটন

এটি একটি ভাল পয়েন্ট ডিএমগ্রিগরি। "এগুলি একসাথে ধ্বংস করার" পরামর্শ দেওয়ার আসলেই আমার উদ্দেশ্য ছিল না তবে "এই বৈশিষ্ট্যগুলি সম্পর্কে কিছুই যা তাদের একক শ্রেণিতে একসাথে কাজ করতে বাধা দেয়।" মানে ওই "এই উত্তর খোঁচা সুপারিশ নয় একটি চয়ন। "
Draco18s

17

জেনেরিকের সেরা বাস্তবায়ন Singletonআমি জানি যে ক্যের জন্য প্যাটার্নটির আমার নিজের (অবশ্যই) এটি।

এটি সবকিছু করতে পারে , এবং এটি খুব পরিষ্কার এবং দক্ষতার সাথে করে :

Create object        Removes scene        Global access?               Keep across
if not in scene?     duplicates?                                       Scene loads?

     Yes                  Yes                  Yes                     Yes (optional)

অন্যান্য সুবিধা:

  • এটি থ্রেড-নিরাপদ
  • অ্যাপ্লিকেশনটি সিলেটটনের পরে তৈরি করা যাবে না তা নিশ্চিত করে প্রস্থান করার সময় সিঙ্গলটন উদাহরণগুলি অর্জন (সম্পর্কিত) সম্পর্কিত ত্রুটিগুলি এড়িয়ে চলে OnApplicationQuit()। (এবং এটি প্রতিটি একক নিজস্ব ধরণের একক পরিবর্তনের পরিবর্তে একটি একক গ্লোবাল পতাকা ব্যবহার করে)
  • এটি ইউনিটি 2017 এর মনো আপডেট (সি # 6 এর সমান সমতুল্য) ব্যবহার করে। (তবে এটি সহজেই প্রাচীন সংস্করণের জন্য মানিয়ে নেওয়া যায়)
  • এটি কিছু বিনামূল্যে ক্যান্ডি সঙ্গে আসে !

এবং ভাগ করে নেওয়া যত্নশীল হওয়ার কারণে এটি এখানে রয়েছে:

public abstract class Singleton<T> : Singleton where T : MonoBehaviour
{
    #region  Fields
    [CanBeNull]
    private static T _instance;

    [NotNull]
    // ReSharper disable once StaticMemberInGenericType
    private static readonly object Lock = new object();

    [SerializeField]
    private bool _persistent = true;
    #endregion

    #region  Properties
    [NotNull]
    public static T Instance
    {
        get
        {
            if (Quitting)
            {
                Debug.LogWarning($"[{nameof(Singleton)}<{typeof(T)}>] Instance will not be returned because the application is quitting.");
                // ReSharper disable once AssignNullToNotNullAttribute
                return null;
            }
            lock (Lock)
            {
                if (_instance != null)
                    return _instance;
                var instances = FindObjectsOfType<T>();
                var count = instances.Length;
                if (count > 0)
                {
                    if (count == 1)
                        return _instance = instances[0];
                    Debug.LogWarning($"[{nameof(Singleton)}<{typeof(T)}>] There should never be more than one {nameof(Singleton)} of type {typeof(T)} in the scene, but {count} were found. The first instance found will be used, and all others will be destroyed.");
                    for (var i = 1; i < instances.Length; i++)
                        Destroy(instances[i]);
                    return _instance = instances[0];
                }

                Debug.Log($"[{nameof(Singleton)}<{typeof(T)}>] An instance is needed in the scene and no existing instances were found, so a new instance will be created.");
                return _instance = new GameObject($"({nameof(Singleton)}){typeof(T)}")
                           .AddComponent<T>();
            }
        }
    }
    #endregion

    #region  Methods
    private void Awake()
    {
        if (_persistent)
            DontDestroyOnLoad(gameObject);
        OnAwake();
    }

    protected virtual void OnAwake() { }
    #endregion
}

public abstract class Singleton : MonoBehaviour
{
    #region  Properties
    public static bool Quitting { get; private set; }
    #endregion

    #region  Methods
    private void OnApplicationQuit()
    {
        Quitting = true;
    }
    #endregion
}
//Free candy!

এটি বেশ শক্ত। প্রোগ্রামিং ব্যাকগ্রাউন্ড এবং নন-ইউনিটি ব্যাকগ্রাউন্ড থেকে আসা, আপনি কী ব্যাখ্যা করতে পারেন যে কেন সিঙ্গলটন সচেতনতামূলক পদ্ধতির চেয়ে কনস্ট্রাক্টরে পরিচালিত হয় না? আপনি যে কোনও বিকাশকারীকে সম্ভবত এটি কল্পনা করতেই পারেন, কোনও কনস্ট্রাক্টরের বাইরে
জোর করা সিঙ্গেলটন দেখে

1
পছন্দ করুন Ityক্য নির্মাণকারীদের সমর্থন করে না। এ কারণেই আপনি কোনও শ্রেণীর উত্তরাধিকার সূত্রে কনস্ট্রাক্টরগুলি ব্যবহার করা দেখছেন না MonoBehaviourএবং আমি বিশ্বাস করি যে ইউনিট দ্বারা ব্যবহৃত সাধারণ কোনও শ্রেণি সরাসরি সাধারণভাবে ব্যবহৃত হয়।
XenoRo

আমি কীভাবে এটি ব্যবহার করব তা আমি নিশ্চিত নই। এটি কি কেবল প্রশ্নে ক্লাসের পিতামাতাকে বোঝানো উচিত? ঘোষণা করার পরে SampleSingletonClass : Singleton, SampleSingletonClass.Instanceসাথে ফিরে আসে SampleSingletonClass does not contain a definition for Instance
বেন আই।

@BenI। আপনাকে জেনেরিক Singleton<>ক্লাসটি ব্যবহার করতে হবে । এজন্য জেনেরিক বেস Singletonক্লাসের শিশু ।
জেনোরো

ওহ অবশ্যই! এটা বেশ সুস্পষ্ট। আমি কেন জানি না তা নিশ্চিত নই। = /
বেন আই।

6

আমি কেবল যুক্ত করতে চাই যে DontDestroyOnLoadআপনি চাইলে আপনার সিঙ্গলটন দৃশ্যাবলী ধরে রাখতে চাইলে কল করা দরকারী ।

public class Singleton : MonoBehaviour
{ 
    private static Singleton _instance;

    public static Singleton Instance 
    { 
        get { return _instance; } 
    } 

    private void Awake() 
    { 
        if (_instance != null && _instance != this) 
        { 
            Destroy(this.gameObject);
            return;
        }

        _instance = this;
        DontDestroyOnLoad(this.gameObject);
    } 
}

এটা খুব সহজ। আমি ঠিক এই প্রশ্নটি জিজ্ঞাসার জন্য @ পিয়ারসন আর্টফোটোর প্রতিক্রিয়া সম্পর্কে একটি মন্তব্য পোস্ট করতে যাচ্ছিলাম:]
ক্যাপ্টেনরেডমফ

5

ক্লাসটি দুটি ভাগে বিভক্ত করার জন্য আরেকটি বিকল্প হতে পারে: সিঙ্গেলটন উপাদানগুলির জন্য নিয়মিত স্ট্যাটিক ক্লাস, এবং একক বিভাজন যা সিঙ্গলটন উদাহরণের জন্য নিয়ামক হিসাবে কাজ করে। এইভাবে সিঙ্গলটনের নির্মাণের উপরে আপনার সম্পূর্ণ নিয়ন্ত্রণ রয়েছে এবং এটি দৃশ্যে জুড়ে থাকবে। এটি আপনাকে কোনও নির্দিষ্ট উপাদানের সন্ধানের জন্য দৃশ্যের মাধ্যমে খনন না করে যে কোনও বস্তুর জন্য সিঙ্গলটনের ডেটার প্রয়োজন হতে পারে এমন কোনও সামগ্রীতে কন্ট্রোলার যুক্ত করতে দেয়।

public class Singleton{
    private Singleton(){
        //Class initialization goes here.
    }

    public void someSingletonMethod(){
        //Some method that acts on the Singleton.
    }

    private static Singleton _instance;
    public static Singleton Instance 
    { 
        get { 
            if (_instance == null)
                _instance = new Singleton();
            return _instance; 
        }
    } 
}

public class SingletonController: MonoBehaviour{
   //Create a local reference so that the editor can read it.
   public Singleton instance;
   void Awake(){
       instance = Singleton.Instance;
   }
   //You can reference the singleton instance directly, but it might be better to just reflect its methods in the controller.
   public void someMethod(){
       instance.someSingletonMethod();
   }
} 

এই খুব সুন্দর!
ক্যাপ্টেনরেডমফ

1
এই পদ্ধতিটি বুঝতে আমার সমস্যা হচ্ছে, আপনি কি এই বিষয়টিতে আরও কিছুটা প্রসারিত করতে পারেন। ধন্যবাদ.
হেক্স

3

নীচে আমার একটি সিঙ্গলটন বিমূর্ত শ্রেণির বাস্তবায়ন এখানে। এটি কীভাবে 4 টি মানদণ্ডের বিপরীতে দাঁড়িয়ে আছে

             Create object   Removes scene   Global    Keep across
           if not in scene?   duplicates?    access?   Scene loads?

             No (but why         Yes           Yes        Yes
             should it?)

এখানে অন্যান্য কয়েকটি পদ্ধতির তুলনায় এর কয়েকটি সুবিধা রয়েছে:

  • এটি কোনও FindObjectsOfTypeপারফরম্যান্স কিলার ব্যবহার করে না
  • এটি নমনীয় যে গেম চলাকালীন এটি একটি নতুন খালি গেমোবজেক্ট তৈরি করার দরকার নেই। আপনি কেবল এটিকে সম্পাদক (বা গেমের সময়) আপনার পছন্দসই একটি গেমোবজেক্টে যুক্ত করুন।
  • এটি থ্রেড নিরাপদ

    using System.Collections.Generic;
    using System.Linq;
    using UnityEngine;
    
    public abstract class Singleton<T> : MonoBehaviour where T : Singleton<T>
    {
        #region  Variables
        protected static bool Quitting { get; private set; }
    
        private static readonly object Lock = new object();
        private static Dictionary<System.Type, Singleton<T>> _instances;
    
        public static T Instance
        {
            get
            {
                if (Quitting)
                {
                    return null;
                }
                lock (Lock)
                {
                    if (_instances == null)
                        _instances = new Dictionary<System.Type, Singleton<T>>();
    
                    if (_instances.ContainsKey(typeof(T)))
                        return (T)_instances[typeof(T)];
                    else
                        return null;
                }
            }
        }
    
        #endregion
    
        #region  Methods
        private void OnEnable()
        {
            if (!Quitting)
            {
                bool iAmSingleton = false;
    
                lock (Lock)
                {
                    if (_instances == null)
                        _instances = new Dictionary<System.Type, Singleton<T>>();
    
                    if (_instances.ContainsKey(this.GetType()))
                        Destroy(this.gameObject);
                    else
                    {
                        iAmSingleton = true;
    
                        _instances.Add(this.GetType(), this);
    
                        DontDestroyOnLoad(gameObject);
                    }
                }
    
                if(iAmSingleton)
                    OnEnableCallback();
            }
        }
    
        private void OnApplicationQuit()
        {
            Quitting = true;
    
            OnApplicationQuitCallback();
        }
    
        protected abstract void OnApplicationQuitCallback();
    
        protected abstract void OnEnableCallback();
        #endregion
    }

একটি নিরীহ প্রশ্ন হতে পারে, কিন্তু আপনি কেন করেছিলেন OnApplicationQuitCallbackএবং OnEnableCallbackযেমন abstractপরিবর্তে শুধু খালি virtualপদ্ধতি? কমপক্ষে আমার ক্ষেত্রে আমার কোনও প্রস্থান / সক্ষম যুক্তি নেই এবং খালি ওভাররাইড করা নোংরা অনুভব করে। তবে আমি কিছু মিস করছি।
জাকুব আর্নল্ড

@ জাকুব আর্নল্ড আমি কিছুক্ষণ এই দিকে তাকিয়ে দেখিনি তবে প্রথম নজরে দেখে মনে হচ্ছে আপনি ঠিক বলেছেন, ভার্চুয়াল পদ্ধতি হিসাবে আরও ভাল হবে
এবার্ট্রান্ড

@ জাকুব আর্নল্ড আসলে আমার মনে হয় আমি তখন থেকেই আমার চিন্তাভাবনাটি স্মরণ করছি: যারা এই ব্যবহার করেছেন এমন উপাদান হিসাবে তাদের সচেতন করতে চেয়েছিলেন OnApplicationQuitCallbackএবং OnEnableCallback: ভার্চুয়াল পদ্ধতিতে এটিকে কম স্পষ্ট করে তোলে। হয়তো কিছুটা অদ্ভুত একটা চিন্তাভাবনা কিন্তু যতদূর মনে পড়ছে এটি আমার যুক্তিযুক্ত।
এবার্ট্র্যান্ড

2

ইউনিটিতে সিঙ্গলটন ব্যবহার করার জন্য একটি ছদ্ম অফিশিয়াল উপায় রয়েছে। এখানে ব্যাখ্যাটি দেওয়া হয়েছে, মূলত একটি সিঙ্গলটন ক্লাস তৈরি করুন এবং আপনার স্ক্রিপ্টগুলি সেই শ্রেণি থেকে উত্তরাধিকারী করুন।


আপনার উত্তরটিতে অন্তত এমন তথ্যের সংক্ষিপ্তসার অন্তর্ভুক্ত করে লিংক-কেবল উত্তরগুলি এড়িয়ে চলুন আশা করি পাঠকরা লিঙ্কটি থেকে সংগ্রহ করবেন will এইভাবে যদি লিঙ্কটি অনুপলব্ধ হয়ে যায় তবে উত্তরটি কার্যকর থাকবে।
ডিএমগ্রিগরি

2

আমি আমার বাস্তবায়ন ভবিষ্যতের প্রজন্মের জন্যও চালিত করব।

void Awake()
    {
        if (instance == null)
            instance = this;
        else if (instance != this)
            Destroy(gameObject.GetComponent(instance.GetType()));
        DontDestroyOnLoad(gameObject);
    }

আমার জন্য এই লাইনটি Destroy(gameObject.GetComponent(instance.GetType()));অত্যন্ত গুরুত্বপূর্ণ কারণ একবার আমি একটি দৃশ্যে অন্য গেমওজেক্টে একটি সিঙ্গলটন স্ক্রিপ্ট রেখে দিয়েছিলাম এবং পুরো গেমের অবজেক্ট মুছে ফেলা হয়েছিল। এটি কেবলমাত্র উপাদানটি ইতিমধ্যে উপস্থিত থাকলে ধ্বংস করবে Dest


1

আমি একটি সিঙ্গলটন ক্লাস লিখেছি যা সিঙ্গলটন অবজেক্ট তৈরি করা সহজ করে তোলে। এটি একটি মনোবিহাভিউর স্ক্রিপ্ট, যাতে আপনি কর্টিনগুলি ব্যবহার করতে পারেন। এটি এর উপর ভিত্তি করে ইউনিটি উইকি নিবন্ধের , এবং আমি এটি পরে প্রেফাব থেকে তৈরি করার বিকল্প যুক্ত করব।

সুতরাং আপনাকে সিঙ্গলটন কোডগুলি লেখার দরকার নেই। কেবলমাত্র এই সিঙ্গলটন সিএস বেস ক্লাসটি ডাউনলোড করুন, এটি আপনার প্রকল্পে যুক্ত করুন এবং আপনার সিঙ্গলটন এটি প্রসারিত তৈরি করুন:

public class MySingleton : Singleton<MySingleton> {
  protected MySingleton () {} // Protect the constructor!

  public string globalVar;

  void Awake () {
      Debug.Log("Awoke Singleton Instance: " + gameObject.GetInstanceID());
  }
}

এখন আপনার মাইসিংটন ক্লাসটি একটি সিঙ্গলটন, এবং আপনি এটি ইনস্ট্যান্স দ্বারা কল করতে পারেন:

MySingleton.Instance.globalVar = "A";
Debug.Log ("globalVar: " + MySingleton.Instance.globalVar);

এখানে একটি সম্পূর্ণ টিউটোরিয়াল: http://www.bivis.com.br/2016/05/04/unity-reusable-singleton-tutorial/

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.