কমান্ড হিসাবে চরিত্রের দক্ষতা এবং দক্ষতা তৈরি, ভাল অনুশীলন?


11

আমি এমন একটি গেমের জন্য নকশা করছি যা এমন চরিত্রগুলি নিয়ে গঠিত যার অনন্য আপত্তিজনক দক্ষতা এবং বিল্ডিং, মেরামত ইত্যাদির মতো অন্যান্য দক্ষতা রয়েছে Play খেলোয়াড়রা এই জাতীয় একাধিক অক্ষর নিয়ন্ত্রণ করতে পারে।

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

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

আমি যে গেমটি ডিজাইন করছি তার জন্য আরও ভাল নকশা এবং অনুশীলন কী হতে পারে?


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

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

1
@ এক্সেনন আপনি কোডের এই অংশে পারফরম্যান্স সংক্রান্ত সমস্যাগুলি দেখতে খুব কমই চান। যতক্ষণ না ব্যবহারকারী ইন্টারঅ্যাকশন প্রতি কেবল একবারই কিছু ঘটতে পারে পারফরম্যান্সে একটি লক্ষণীয় দাঁত তৈরি করার জন্য এটি খুব নিবিড় গণনা করতে হবে।
আআআআআআআআআআআআআআআআআআআআআআআআআআআআআরআইআর

উত্তর:


17

টি এল; ডিআর

এই উত্তরটি একটু পাগল হয়ে যায়। তবে এটি কারণ আমি দেখতে পেয়েছি যে আপনি "কমান্ডগুলি" হিসাবে আপনার ক্ষমতা প্রয়োগের কথা বলছেন যা C ++ / জাভা / .NET নকশার ধরণগুলি বোঝায় যা একটি কোড-ভারী পদ্ধতির বোঝায়। এই পদ্ধতিটি বৈধ, তবে এর চেয়ে আরও ভাল উপায় আছে। হতে পারে আপনি ইতিমধ্যে অন্য উপায়ে করছেন। যদি তাই হয়, ওহ ভাল। আশা করি অন্যরা যদি এটির ক্ষেত্রে উপযুক্ত হয় তবে।

তাড়া কাটাতে নীচের ডেটা-চালিত পদ্ধতির দিকে নজর দিন। জ্যাকব পেনকের কাস্টমসেটসুবিলিটিটি এখানে পান এবং তার পোস্টটি পড়ুন ।

Withক্যের সাথে কাজ করা

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

ইউনিটির মধ্যে এই কাজটি ভাল করে তোলার ক্ষেত্রে, আমার অন্ত্রটি আমাকে বলেছে যে সামর্থ্য অনুসারে একটি মনোবিহাইওয়ের হ'ল বিপজ্জনক পথ। যদি আপনার কোনও দক্ষতা যদি তারা সম্পাদন করে সময়ের সাথে সাথে রাষ্ট্র বজায় রাখে তবে আপনাকে সেই ব্যবস্থাটি পুনরায় সেট করার একটি উপায় সরবরাহ করতে হবে। কর্টাইনগুলি এই সমস্যাটিকে প্রশমিত করে, তবে আপনি এখনও সেই স্ক্রিপ্টের প্রতিটি আপডেট ফ্রেমে আইনিউমরেটর রেফারেন্স পরিচালনা করছেন এবং আপনার অসম্পূর্ণতা এবং আটকে থাকা-অবস্থায়-রাষ্ট্রীয় লুপটি যাতে সক্ষমতার পুনরায় সেট করার জন্য আপনার কাছে একটি নিশ্চিত-আগুনের উপায় রয়েছে তা নিশ্চিত করতে হবে st ক্ষমতাগুলি নজরে না পড়লে নিঃশব্দে আপনার গেমটির স্থিতিশীলতা আঁকতে শুরু করে। "অবশ্যই আমি তা করবো!" আপনি বলেছেন, "আমি একজন 'ভালো প্রোগ্রামার'!"। তবে সত্যিই, আপনি জানেন, আমরা সবাই বস্তুনিষ্ঠভাবে ভয়ানক প্রোগ্রামার এবং এমনকি সর্বশ্রেষ্ঠ এআই গবেষক এবং সংকলক লেখকরা সর্বদা স্টাফ আপ করি।

আপনি ইউনিটিতে কমান্ড ইনস্ট্যান্টেশন এবং পুনরুদ্ধার বাস্তবায়নের যেভাবেই করতে পারেন তার মধ্যে আমি দুটি সম্পর্কে ভাবতে পারি: একটি ভাল এবং আপনাকে একটি অ্যানিউরিজম দেয় না এবং অন্যটি অসমাপ্ত যাদুবিদ্যার সৃজনশীলতার জন্য অনুমতি দেয় । প্রকার, রকম.

কোড কেন্দ্রিক পদ্ধতির

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

আপনি যদি বিমূর্ত বেস ক্লাস ব্যবহার করেন তবে বিষয়গুলি সহজ, তবে আমার সংস্করণটি ইন্টারফেস ব্যবহার করে।

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

// ICommand.cs
public interface ICommand
{
    public void Execute(AbilityActivator originator, TargetingInfo targets);
    public void Update();
    public bool IsActive { get; }
}


// CommandList.cs
// Attach this to a game object in your loading screen
public static class CommandList
{
    public static ICommand GetInstance(string key)
    {
        return commandDict[key].GetRef();
    }


    static CommandListInitializerScript()
    {
        commandDict = new Dictionary<string, ICommand>() {

            { "SwordSpin", new CommandRef<SwordSpin>() },

            { "BellyRub", new CommandRef<BellyRub>() },

            { "StickyShield", new CommandRef<StickyShield>() },

            // Add more commands here
        };
    }


    private class CommandRef<T> where T : ICommand, new()
    {
        public ICommand GetNew()
        {
            return new T();
        }
    }

    private static Dictionary<string, ICommand> commandDict;
}


// AbilityActivator.cs
// Attach this to your character objects
public class AbilityActivator : MonoBehaviour
{
    List<ICommand> activeAbilities = new List<ICommand>();

    void Update()
    {
        string activatedAbility = GetActivatedAbilityThisFrame();
        if (!string.IsNullOrEmpty(acitvatedAbility))
            ICommand command = CommandList.Get(activatedAbility).GetRef();
            command.Execute(this, this.GetTargets());
            activeAbilities.Add(command);
        }

        foreach (var ability in activeAbilities) {
            ability.Update();
        }

        activeAbilities.RemoveAll(a => !a.IsActive);
    }
}

এটি পুরোপুরি সূক্ষ্মভাবে কাজ করে তবে আপনি আরও ভাল করতে পারবেন (এছাড়াও, List<T>সময়োচিত ক্ষমতাগুলি সংরক্ষণের জন্য অনুকূল ডেটা স্ট্রাকচার নয়, আপনি সম্ভবত একটি LinkedList<T>বা একটি চান SortedDictionary<float, T>)।

ডেটা-চালিত পদ্ধতির

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

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

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

// CommandAbilityDescription.cs
public class CommandAbilityDecription : ScriptableObject
{

    // Identification and information
    public string displayName; // Name used for display purposes for the GUI
    // We don't need an identifier field, because this will actually be stored
    // as a file on disk and thus implicitly have its own identifier string.

    // Description of damage to targets

    // I put this enum inside the class for answer readability, but it really belongs outside, inside a namespace rather than nested inside a class
    public enum DamageType
    {
        None,
        SingleTarget,
        SingleTargetOverTime,
        Area,
        AreaOverTime,
    }

    public DamageType damageType;
    public float damage; // Can represent either insta-hit damage, or damage rate over time (depend)
    public float duration; // Used for over-time type damages, or as a delay for insta-hit damage

    // Visual FX
    public enum EffectPlacement
    {
        CenteredOnTargets,
        CenteredOnFirstTarget,
        CenteredOnCharacter,
    }

    [Serializable]
    public class AbilityVisualEffect
    {
        public EffectPlacement placement;
        public VisualEffectBehavior visualEffect;
    }

    public AbilityVisualEffect[] visualEffects;
}

// VisualEffectBehavior.cs
public abtract class VisualEffectBehavior : MonoBehaviour
{
    // When an artist makes a visual effect, they generally make a GameObject Prefab.
    // You can extend this base class to support different kinds of visual effects
    // such as particle systems, post-processing screen effects, etc.
    public virtual void PlayEffect(); 
}

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

আপনার এখনও অ্যাবিলিটিএকটিভেটর মনো বিহ্যাভির প্রয়োজন, তবে এখন তিনি আরও কিছুটা কাজ করেন।

// AbilityActivator.cs
public class AbilityActivator : MonoBehaviour
{
    public void ActivateAbility(string abilityName)
    {
        var command = (CommandAbilityDescription) Resources.Load(string.Format("Abilities/{0}", abilityName));
        ProcessCommand(command);
    }

    private void ProcessCommand(CommandAbilityDescription command)
    {

        foreach (var fx in command.visualEffects) {
            fx.PlayEffect();
        }

        switch(command.damageType) {
            // yatta yatta yatta
        }

        // and so forth, whatever your needs require

        // You could even make a copy of the CommandAbilityDescription
        var myCopy = Object.Instantiate(command);

        // So you can keep track of state changes (ie: damage duration)
    }
}

সম্পূর্ণ অংশ

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

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

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


3

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

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

ঠিক এই কারণেই @eBusiness আপনাকে পরামর্শ দিচ্ছে যে ইভেন্ট-প্রেরণের সময় আপনি পারফরম্যান্সের সমস্যাগুলি দেখতে পাচ্ছেন না, কারণ আপনি যদি সত্যিই এটির জন্য কঠোর চেষ্টা না করেন তবে 3- এর অবস্থার পরিবর্তনের তুলনায় এখানে প্রচুর পরিমাণে কাজ করার দরকার নেই- স্ক্রিনে মিলিয়ন ভার্টিক্স, ইত্যাদি ...

এছাড়াও, এটি সমাধান নয় , বরং অনুরূপ সমস্যার বৃহত্তর সেট পরিচালনার জন্য একটি সমাধান ...

কিন্তু ...

এগুলি সমস্ত আপনি নেমে এসেছেন যে আপনি কত বড় গেমটি তৈরি করছেন, কতগুলি অক্ষর একই দক্ষতা ভাগ করে নিয়েছে, কতগুলি ভিন্ন চরিত্র / বিভিন্ন দক্ষতা আছে, তাই না?

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

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

// Command interface wraps this
var registered_abilities = {},

    register = function (name, callback) {
        registered_abilities[name] = callback;
    },
    unregister = function (name) {
        registered_abilities[name] = null;
    },

    call = function (name,/*arr/undef*/params) {
        var callback = registered_abilities[name];
        if (callback) { callback(params); }
    },

    public_interface = {
        register : register,
        unregister : unregister,
        call : call
    };

return public_interface;

এবং এটি ব্যবহার করা হতে পারে:

var command_card = new CommandInterface();

// one-time setup
system.listen("register-ability",   command_card.register  );
system.listen("unregister-ability", command_card.unregister);
system.listen("use-action",         command_card.call      );

// init characters
var dave = new PlayerCharacter("Dave"); // Character Factory pulls out Dave + dependencies
dave.init();

যেখানে ডেভ ()। DI ফাংশনটি দেখতে পারে:

// Inside of Dave class
init = function () {
    // other instance-level stuff ...

    system.notify("register-ability", "repair",  this.Repair );
    system.notify("register-ability", "science", this.Science);
},

die = function () {
    // other clean-up stuff ...

    system.notify("unregister-ability", "repair" );
    system.notify("unregister-ability", "science");
},

resurrect = function () { /* same idea as init */ };

যদি কেবল ডেভের চেয়ে আরও বেশি লোক থাকে .Repair()তবে আপনি গ্যারান্টি দিতে পারেন যে কেবল একটি ডেভ হতে চলেছে, তবে কেবল এটিকে এটিকে পরিবর্তন করুনsystem.notify("register-ability", "dave:repair", this.Repair);

এবং ব্যবহার করে দক্ষতা কল করুন system.notify("use-action", "dave:repair");

আপনি যে তালিকাটি ব্যবহার করছেন সেগুলি কেমন তা আমি নিশ্চিত নই। (ইউনিটিস্ক্রিপ্ট টাইপ-সিস্টেমের নিরিখে, এবং পোস্ট-সংকলন কী চলছে তার নিরিখে)।

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

যদি আরও অনুকূলিত কাঠামো থাকে তবে তারা এর থেকে আরও পারফরম্যান্স হতে চলেছে।

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

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