আমি কীভাবে ইউনিটিতে আঁটসাঁট স্ক্রিপ্ট সংযোজন এড়াতে পারি?


24

কিছু সময় আগে আমি ityক্যের সাথে কাজ শুরু করেছি এবং আমি এখনও শক্তভাবে মিলিত স্ক্রিপ্টগুলি নিয়ে লড়াই করছি। এই সমস্যাটি এড়াতে আমি কীভাবে আমার কোডটি গঠন করতে পারি?

উদাহরণ স্বরূপ:

আমি পৃথক স্ক্রিপ্টে স্বাস্থ্য এবং মৃত্যু ব্যবস্থা রাখতে চাই। আমি আলাদা আলাদা বিনিময়যোগ্য হাঁটার স্ক্রিপ্টগুলিও রাখতে চাই যা প্লেয়ারের চরিত্রটি স্থানান্তরিত করার পদ্ধতিটি আমাকে পরিবর্তিত করতে দেয় (পদার্থবিজ্ঞানভিত্তিক, মারিও বনাম টাইট, সুপার মিট বয়েয়ের মতো টুইটারি নিয়ন্ত্রণ) স্বাস্থ্য স্ক্রিপ্টে ডেথ স্ক্রিপ্টের একটি রেফারেন্স রাখা দরকার, যাতে খেলোয়াড়দের স্বাস্থ্য 0 এ পৌঁছানোর পরে এটি ডাই () পদ্ধতিটি ট্রিগার করতে পারে মৃত্যুর উপরে হাঁটা অক্ষম করার জন্য ডেথ স্ক্রিপ্টটিতে কিছুটা হাঁটা স্ক্রিপ্ট ব্যবহার করা উচিত (I আমি জম্বি ক্লান্ত)

আমি সাধারণত ইন্টারফেসগুলি তৈরি করতে চাই IWalking, IHealthএবং এর মতো , IDeathযাতে আমি আমার বাকী কোডটি না ভেঙে এই উপাদানগুলিকে ঝাঁকুনিতে পরিবর্তন করতে পারি। আমি তাদের প্লেয়ার অবজেক্টে একটি পৃথক স্ক্রিপ্ট দ্বারা সেট আপ করতে চাই, বলুন PlayerScriptDependancyInjector। হয়তো স্ক্রিপ্ট প্রকাশ্য হবে যে IWalking, IHealthএবং IDeathগুণাবলীর নির্ভরতা টেনে এবং উপযুক্ত স্ক্রিপ্ট ড্রপ দ্বারা পরিদর্শক থেকে স্তর ডিজাইনার দ্বারা নির্ধারণ করা যাবে, যাতে।

এটি আমাকে সহজেই গেমের বিষয়গুলিতে আচরণগুলি যুক্ত করতে এবং হার্ড-কোডেড নির্ভরতা সম্পর্কে চিন্তা না করার অনুমতি দেয়।

Ityক্যে সমস্যা

সমস্যাটি হ'ল the ক্যতে আমি পরিদর্শকের ইন্টারফেস প্রকাশ করতে পারি না এবং আমি যদি নিজের ইন্সপেক্টরকে লিখি তবে উল্লেখগুলি সিরিয়ালযুক্ত হবে না এবং এটি অনেক অপ্রয়োজনীয় কাজ। এই কারণেই আমি দৃly়-সংযুক্ত কোড লেখার সাথে বাকী আছি। আমার Deathস্ক্রিপ্ট কোনও InertiveWalkingস্ক্রিপ্টের রেফারেন্স প্রকাশ করে । তবে যদি আমি স্থির করি আমি প্লেয়ার চরিত্রটি শক্তভাবে নিয়ন্ত্রণ করতে চাই, তবে আমি TightWalkingস্ক্রিপ্টটি টেনে আনতে পারি না , আমার Deathস্ক্রিপ্টটি পরিবর্তন করা দরকার to যে স্তন্যপান। আমি এটির সাথে মোকাবিলা করতে পারি, তবে আমার আত্মা প্রতিবারই আমি এই জাতীয় কিছু করে কাঁদে।

ইউনিটিতে ইন্টারফেসের পছন্দের বিকল্পটি কী? আমি কীভাবে এই সমস্যাটি সমাধান করব? আমি দেখেছি এই , কিন্তু এটা আমাকে বলে কি আমি ইতিমধ্যে জানেন, এবং এটা আমাকে বলুন না কিভাবে করতে হবে যে ঐক্য মধ্যে নেই এই খুব আলোচনা কি করা উচিত, কিভাবে না হয়, তাহলে স্ক্রিপ্ট মধ্যে আঁট কাপলিং ইস্যু ধরে নি।

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


1
The problem is that in Unity I can't expose interfaces in the inspectorআমি মনে করি না যে "ইন্সপেক্টরের ইন্টারফেস এক্সপোজ" বলতে আপনি কী বোঝাতে চেয়েছিলেন কারণ আমার প্রথম চিন্তাটি "কেন নয়?"
315

@ জোকিং theক্য দেবকে জিজ্ঞাসা করুন। আপনি কেবল এটি পরিদর্শকের মধ্যে দেখতে পাবেন না। আপনি যদি এটি সর্বজনীন বৈশিষ্ট্য হিসাবে সেট করেন এবং অন্য সমস্ত বৈশিষ্ট্যগুলি করে তবে এটি সেখানে উপস্থিত হবে না।
কেএল

1
ওহ, আপনি ইন্টারফেসটি ভেরিয়েবলের ধরণ হিসাবে ব্যবহার করতে চাইছেন, কেবলমাত্র সেই ইন্টারফেসের সাথে কোনও বস্তুর উল্লেখ নেই।
12:54

1
আপনি কি মূল ইসিএস নিবন্ধটি পড়েছেন? কাউবাইপ্রগ্রামিং.com/2007/01/05/evolve-your-heirachy SOLID ডিজাইন সম্পর্কে কী? en.wikipedia.org/wiki/SOLID_%28object-oriented_design%29
jzx

1
@ জেডএক্সএক্স আমি সলিড ডিজাইনটি জানি এবং ব্যবহার করি এবং আমি রবার্ট সি মার্টিনসের বইগুলির একটি বড় অনুরাগী, তবে এই প্রশ্নটি ityক্যতে কীভাবে করা যায় তা নিয়েই প্রশ্ন। এবং না, আমি এখনই এই নিবন্ধটি পড়িনি, ধন্যবাদ :)
কেএল

উত্তর:


14

টাইট স্ক্রিপ্ট সংযোজন এড়াতে আপনি কয়েকটি উপায় নিয়ে কাজ করতে পারেন। ইন্টারনাল টু ইউনিটি একটি সেন্ডম্যাসেজ ফাংশন যা কোনও মনোবিহেভিওর গেমঅবজেক্টকে টার্গেট করা হলে গেম অবজেক্টের সমস্ত কিছুতে সেই বার্তাটি প্রেরণ করে। সুতরাং আপনার স্বাস্থ্য বিষয়টিতে আপনার এমন কিছু থাকতে পারে:

[SerializeField]
private int _currentHealth;
public int currentHealth
{
    get { return _currentHealth;}
    protected set
    {
        _currentHealth = value;
        gameObject.SendMessage("HealthChanged", value, SendMessageOptions.DontRequireReceiver);
    }
}

[SerializeField]
private int _maxHealth;
public int maxHealth
{
    get { return _maxHealth;}
    protected set
    {
        _maxHealth = value;
        if (currentHealth > _maxHealth)
        {
            currentHealth = _maxHealth;
        }
    }
}

public void ChangeHealth(int deltaChange)
{
    currentHealth += deltaChange;
}

এটি সত্যিই সরলীকৃত তবে আমি কী পাচ্ছি তা অবিকল দেখানো উচিত। আপনার মতো বার্তা ছুঁড়ে ফেলা সম্পত্তি event তারপরে আপনার ডেথ স্ক্রিপ্ট এই বার্তাটিকে বাধা দেবে (এবং যদি এটির বিরতি দেওয়ার মতো কিছু না থাকে তবে সেন্ডম্যাসেজঅপশনস ont তাই ভালো:

void HealthChanged(int newHealth)
{
    if (newHealth <= 0)
    {
        Die();
    }
}

void Die ()
{
    Debug.Log ("I am undone!");
    DestroyObject (gameObject);
}

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

এমন অন্যান্য সমাধান রয়েছে যা আপনি অনুসন্ধান করতে পারেন যা একটি কাস্টম গেমঅজেক্ট ফাংশন তৈরি করছে যা উপাদানগুলি পায় এবং কেবলমাত্র সেই উপাদানগুলিকেই প্রকারের পরিবর্তে নির্দিষ্ট ইন্টারফেস দেয়, এটি আরও বেশি সময় নেয় তবে আপনার উদ্দেশ্যগুলি ভালভাবে পরিবেশন করতে পারে।

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


5
সেন্ডম্যাসেজ () এই পরিস্থিতির সমাধান করে এবং আমি অনেক পরিস্থিতিতে এই আদেশটি ব্যবহার করি, তবে এটির মতো একটি অচিহ্নিত বার্তা ব্যবস্থা সরাসরি রিসিভারের সাথে উল্লেখ করার চেয়ে কম দক্ষ। অবজেক্টগুলির মধ্যে সমস্ত নিয়মিত যোগাযোগের জন্য আপনার এই আদেশের উপর নির্ভর করা উচিত।
12:01

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

1
আমি আরও বিশ্বাস করি যে theক্য সম্পদ স্টোরটিতে এমন কিছু প্লাগইন রয়েছে যা ইউনিটি ইন্সপেক্টর দ্বারা সমর্থিত নয় এমন ইন্টারফেস এবং অন্যান্য প্রোগ্রামিং কনস্ট্রাক্টগুলি প্রকাশ করতে পারে, এটি দ্রুত অনুসন্ধানের জন্য উপযুক্ত হতে পারে।
ম্যাথু পিগ্রাম

7

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

http://forum.unity3d.com/threads/free-vfw-full-set-of-drawers-savesystem-serialize-interfaces-generics-auto-props-delegates.266165/

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

যদি এটি কোনও বিকল্প না হয় তবে এর পরিবর্তে মনোবিহ্যাভের ক্লাসগুলি টেনে আনুন এবং গতিশীলভাবে প্রয়োজনীয় ইন্টারফেসে কাস্ট করুন। এটি বেশি কাজ, এবং মার্জিত কম, তবে এটি কাজটি করে।


2
ব্যক্তিগতভাবে আমি এই জাতীয় নিম্ন স্তরের সামগ্রীর জন্য প্লাগইন এবং লাইব্রেরিতে খুব বেশি নির্ভরশীল হয়ে উঠছি। আমি সম্ভবত কিছুটা ভৌতিক হয়ে আছি, তবে এটি আমার প্রকল্প বিরতিতে খুব বেশি ঝুঁকির মতো বোধ করে কারণ তাদের codeক্য আপডেটের পরে কোডটি ভেঙে যায়।
ধাক্কা মেরে

আমি সেই কাঠামোটি ব্যবহার করছিলাম এবং অবশেষে থেমে গেলাম যেহেতু আমার খুব কারণ ছিল কারণ @ ঝোকিং আমার মনের পেছন দিকে কাতরাচ্ছিল উল্লেখ করেছে (এবং এটি কোনও আপডেট থেকে অন্য আপডেটে সহায়তা করে নি, এটি সম্পাদক সহায়ক থেকে এমন একটি সিস্টেমে গিয়েছিল যা সবকিছু অন্তর্ভুক্ত করে পিছনে সামঞ্জস্যতা [এবং একটি বরং দরকারী বৈশিষ্ট্য অপসারণ] এবং রান্নাঘর ডুবে
Selali Adobor

6

আমার কাছে ঘটে যাওয়া Unক্য-নির্দিষ্ট পদ্ধতির হ'ল প্রথমে GetComponents<MonoBehaviour>()স্ক্রিপ্টগুলির একটি তালিকা পাওয়া যায় এবং তারপরে নির্দিষ্ট স্ক্রিপ্টগুলির জন্য সেই স্ক্রিপ্টগুলি ব্যক্তিগত ভেরিয়েবলগুলিতে ফেলে দেওয়া হয়। আপনি নির্ভরতা ইনজেক্টর স্ক্রিপ্টে স্টার্ট () এ এটি করতে চান। কিছুটা এইরকম:

MonoBehaviour[] list = GetComponents<MonoBehaviour>();
for (int i = 0; i < list.Length; i++) {
    if (list[i] is IHealth) {
        Debug.Log("Found it!");
    }
}

প্রকৃতপক্ষে, এই পদ্ধতির সাহায্যে আপনি এমনকি পৃথক উপাদানগুলি টাইপফ () কমান্ড এবং 'টাইপ' টাইপ ব্যবহার করে নির্ভরতা ইনজেকশন স্ক্রিপ্টটি তাদের নির্ভরতা কী তা বলতে পারবেন । অন্য কথায়, উপাদানগুলি নির্ভরতা ইনজেক্টরকে প্রকারের একটি তালিকা দেয় এবং তারপরে নির্ভরতা ইনজেক্টর সেই ধরণের বস্তুর একটি তালিকা প্রদান করে।


বিকল্পভাবে, আপনি কেবল ইন্টারফেসের পরিবর্তে বিমূর্ত ক্লাস ব্যবহার করতে পারেন। একটি বিমূর্ত শ্রেণি ইন্টারফেসের মতো একই উদ্দেশ্য অর্জন করতে পারে এবং আপনি এটি পরিদর্শকের মধ্যে উল্লেখ করতে পারেন।


আমি একাধিক ক্লাস থেকে উত্তরাধিকারী হয়ে উঠতে পারি না যখন আমি একাধিক ইন্টারফেস প্রয়োগ করতে পারি। এটি কোনও সমস্যা হতে পারে তবে আমি অনুমান করি এটি কিছুই না থেকে অনেক ভাল :) আপনার উত্তরের জন্য ধন্যবাদ!
কেএল

সম্পাদনা হিসাবে - একবার আমার কাছে স্ক্রিপ্টগুলির তালিকা থাকলে আমার কোডটি কীভাবে বুঝতে পারে যে কোন স্ক্রিপ্টটি কোন ইন্টারফেসে ক্যান্ট করতে হবে?
কেএল

1
এটিও ব্যাখ্যা করতে সম্পাদিত
21

1
ইউনিটি ৫-এ, আপনি ব্যবহার করতে পারেন GetComponent<IMyInterface>()এবং GetComponents<IMyInterface>()সরাসরি, হ'ল এটি প্রয়োগ করে এমন উপাদান (গুলি) প্রদান করে।
এস তারেক Ç

5

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

আমি আপনার উদ্বেগ পুরোপুরি বুঝতে পেরেছি, বিশেষত কারণ সাম্প্রতিক ডিভাইসগুলির সাথে পারফরম্যান্স উদ্বেগ কম সমালোচিত, তবে আমার অনুভূতি হ'ল আপনি যদি ইউনিটি গেম বিকাশে শিল্প ওওপি সেরা অনুশীলনগুলি প্রয়োগ করতে চান তবে আপনাকে নিজের সমাধান বিকাশ করতে হবে (যেমন নির্ভরতা ইনজেকশন, ইত্যাদি ...)।


2

আইউনাইফাইড ( http://u3d.as/content/wounded-wolf/iunified/5H1 ) দেখুন, যা আপনাকে যেমন উল্লেখ করেছেন ঠিক তেমন সম্পাদককে ইন্টারফেস প্রকাশ করতে দেয়। সাধারণ পরিবর্তনশীল ঘোষণার তুলনায় আরও কিছুটা ওয়্যারিং আপ করতে হবে, এগুলিই।

public interface IPinballValue{
   void Add(int value);
}

[System.Serializable]
public class IPinballValueContainer : IUnifiedContainer<IPinballValue> {}

public class MyClassThatExposesAnInterfaceProperty : MonoBehaviour {
   [SerializeField]
   IPinballValueContainer value;
}

এছাড়াও, অন্য উত্তরগুলির হিসাবে উল্লেখ করা হয়েছে, সেন্ডম্যাসেজ ব্যবহার করা কাপলিংটি সরিয়ে দেয় না। পরিবর্তে এটি সংকলনের সময় এটিকে ত্রুটিযুক্ত করে তোলে না। খুব খারাপ - আপনি আপনার প্রকল্পটি স্কেল করার সাথে সাথে এটি বজায় রাখা দুঃস্বপ্নে পরিণত হতে পারে।

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


1

সূত্র: http://www.udellgames.com/posts/ultra-useful-unity-snippet-developers-use-interfaces/

[SerializeField]
private GameObject privateGameObjectName;

public GameObject PublicGameObjectName
{
    get { return privateGameObjectName; }
    set
    {
        //Make sure changes to privateGameObjectName ripple to privateInterfaceName too
        if (privateGameObjectName != value)
        {
            privateInterfaceName = null;
            privateGameObjectName = value;
        }
    }
}

private InterfaceType privateInterfaceName;
public InterfaceType PublicInterfaceName
{
    get
    {
        if (privateInterfaceName == null)
        {
            privateInterfaceName = PublicGameObjectName.GetComponent(typeof(InterfaceType)) as InterfaceType;
        }
        return privateInterfaceName;
    }
    set
    {
        //Make sure changes to PublicInterfaceName ripple to PublicGameObjectName too
        if (privateInterfaceName != value)
        {
            privateGameObjectName = (privateInterfaceName as Component).gameObject;
            privateInterfaceName = value;
        }

    }
}

0

আপনার উল্লেখযোগ্য সীমাবদ্ধতাগুলি পেতে আমি কয়েকটি আলাদা কৌশল ব্যবহার করি।

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

public interface IRaycastStrategy 
{
    bool Cast(Ray ray, out RaycastHit raycastHit, float distance, LayerMask layerMask);
}

আমি তখন বিভিন্ন ক্লাসের তা বাস্তবায়ন শ্রেণীর মতো LinecastRaycastStrategyএবং SphereRaycastStrategyএকটি MonoBehavior বাস্তবায়ন RaycastStrategySelectorপ্রতিটি টাইপ একটি একক উদাহরণস্বরূপ অনাবৃত। এমন কিছু RaycastStrategySelectionBehaviorযা বাস্তবায়িত হয়:

public class RaycastStrategySelectionBehavior : MonoBehavior
{

    private readonly Dictionary<RaycastStrategyType, IRaycastStrategy> _raycastStrategies
        = new Dictionary<RaycastStrategyType, IRaycastStrategy>
        {
            { RaycastStrategyType.Line, new LineRaycastStrategy() },
            { RaycastStrategyType.Sphere, new SphereRaycastStrategy() }
        };

    public RaycastStrategyType StrategyType;


    public IRaycastStrategy RaycastStrategy
    {
        get
        {
            IRaycastStrategy raycastStrategy;
            if (!_raycastStrategies.TryGetValue(StrategyType, out raycastStrategy))
            {
                throw new InvalidOperationException("There is no registered implementation for the selected strategy");
            }
            return raycastStrategy;
        }
    }
}

যদি বাস্তবায়নগুলি তাদের নির্মাণগুলিতে ইউনিটির ফাংশনগুলি উল্লেখ করে (বা কেবল নিরাপদ দিকে থাকতে পারে তবে এই উদাহরণটি টাইপ করার সময় আমি কেবল এটি ভুলে গেছি) ব্যবহার করুন Awake কনস্ট্রাক্টরকে কল করতে বা সম্পাদক বা মূল বাহিরের বাইরে ইউনিটির ফাংশনগুলি উল্লেখ করার ক্ষেত্রে সমস্যাগুলি এড়াতে সুতা

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

আমি এই কৌশলটি নমনীয়তার কারণে ব্যবহার করি কারণ এটি মনো-বিহ্যাভিয়ার্সের উপর ভিত্তি করে মোওবিহাভিয়ার্স ব্যবহার করে ইন্টারফেসগুলি বাস্তবায়নের জন্য আপনাকে বাধ্য না করে you এটি আপনাকে "উভয় বিশ্বের সেরা" দেয় যেহেতু নির্বাচক ব্যবহার করে অ্যাক্সেস করা যায় GetComponent, সিরিয়ালাইজেশনটি সমস্ত Unক্য দ্বারা পরিচালিত হয় এবং নির্বাচক নির্দিষ্ট সময়ে নির্দিষ্ট কারণগুলির উপর ভিত্তি করে স্বয়ংক্রিয়ভাবে বাস্তবায়নগুলি পরিবর্তন করতে রান-টাইমে যুক্তি প্রয়োগ করতে পারে।

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