কোনও উপাদান-ভিত্তিক সত্তা সিস্টেমে স্ক্রিপ্টযুক্ত এবং "নেটিভ" উপাদানগুলি পরিচালনা করা


11

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

  1. উপাদানগুলির মধ্যে কেবলমাত্র রাষ্ট্র থাকে (যেমন অবস্থান, স্বাস্থ্য, গোলাগুলি গণনা) => যুক্তিগুলি "সিস্টেমে" যায় যা এই উপাদানগুলি এবং তাদের রাজ্যগুলিকে প্রক্রিয়াজাত করে (যেমন ফিজিক্স সিস্টেম, রেন্ডার সিস্টেম ইত্যাদি))
  2. আমি খাঁটি সি # এবং স্ক্রিপ্টিং (লুয়া) এর মাধ্যমে উভয়ই উপাদান এবং সিস্টেমগুলি প্রয়োগ করতে চাই। মূলত আমি আমার সি # উত্সটি পুনরায় সংকলন না করে সরাসরি লুয়ায় সম্পূর্ণ নতুন উপাদান এবং সিস্টেমগুলি সংজ্ঞায়িত করতে সক্ষম হতে চাই।

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

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

public ScriptComponent : IComponent
{
    public T GetProperty<T>(string propertyName) {..}
    public void SetProperty<T>(string propertyName, T value) {..}
}

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

তবে লুয়া দিক থেকে উপাদানগুলি অ্যাক্সেস করবেন কীভাবে? যদি আমি এমন কিছুতে কল করি তবে আমি getComponentsFromEntity(ENTITY_ID)সম্ভবত ইউজারডেটা হিসাবে "স্ক্রিপ্টকম্পোনেন্ট" সহ নেটিভ সি # উপাদানগুলির একটি গুচ্ছ পাব। মোড়ানো লুয়া টেবিল থেকে মানগুলি অ্যাক্সেস করার ফলে GetProperty<T>(..)অন্যান্য সি # উপাদানগুলির মতো, সরাসরি বৈশিষ্ট্যগুলিতে অ্যাক্সেস না করে পদ্ধতিটি কল করার ফলে ।

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

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

entity = getEntity(1);
nativeComponent = getComponent(entity, "SomeNativeComponent")
scriptComponent = getComponent(entity, "SomeScriptComponent")

nativeComponent.NativeProperty = 5
scriptComponent.ScriptedProperty = 3

স্ক্রিপ্টটি আসলে কী ধরণের উপাদান পেল সে সম্পর্কে চিন্তা করা উচিত নয় এবং আমি উপাদানগুলি পুনরুদ্ধার, যোগ করতে বা অপসারণ করতে সি # দিক থেকে যে একই পদ্ধতি ব্যবহার করেছি তা ব্যবহার করতে চাই।

হতে পারে যে সত্তা সিস্টেমের সাথে স্ক্রিপ্টিং একীকরণের কিছু নমুনা বাস্তবায়ন আছে?


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

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

আমি জিজ্ঞাসা করতে পারি যে আপনি কেন সি # এবং আপনার স্ক্রিপ্টের পরিবেশের মধ্যে সমান সংজ্ঞা ক্ষমতা রাখার ইচ্ছা করছেন? সাধারণ নকশা সি # তে উপাদান সংজ্ঞা এবং তারপরে স্ক্রিপ্টিং ভাষায় 'অবজেক্ট অ্যাসেমব্লি' ' আমি ভাবছি কোন সমস্যাটি উত্থিত হয়েছে যে এটিই এর সমাধান?
জেমস

1
লক্ষ্যটি হ'ল সি # সোর্স কোডের বাইরে থেকে উপাদানটিকে এক্সটেনসিবল করা make এক্সএমএল বা স্ক্রিপ্ট ফাইলগুলিতে কেবল সম্পত্তি মান নির্ধারণের মাধ্যমে নয়, সম্পূর্ণ নতুন বৈশিষ্ট্য এবং সেগুলি প্রসেসিং করে নতুন নতুন উপাদানগুলি সংজ্ঞায়িত করে। এটি স্কটি বিলাসের ডানজিওন সিজে অবজেক্ট সিস্টেম সম্পর্কিত বিবরণ দ্বারা অনুপ্রাণিত হয়েছে যেখানে তাদের "নেটিভ" সি ++ উপাদান পাশাপাশি একটি "গসক্রিটকম্পোনেন্ট" ছিল, যা নিজেই একটি স্ক্রিপ্টের জন্য কেবল একটি মোড়ক: স্কটবিলাস.com
মারিও

এত জটিল যে কোনও স্ক্রিপ্টিং বা প্লাগইন ইন্টারফেস তৈরির ফাঁদে পড়ার বিষয়ে সতর্ক থাকুন যাতে এটি আসল সরঞ্জামটির পুনর্লিখনের কাছে যায় (এই ক্ষেত্রে সি # বা ভিজ্যুয়াল স্টুডিও)।
ডিভে

উত্তর:


6

একটি সম্পুরক FxIII এর উত্তর যে আপনি সবকিছু (যে moddable হবে) স্ক্রিপ্টিং ভাষায় ডিজাইন উচিত প্রথম (বা অন্তত এটি একটি খুব শালীন অংশ) তা নিশ্চিত করার জন্য আপনার ইন্টিগ্রেশন যুক্তিবিজ্ঞান আসলে মডিং জন্য বিধান। আপনি যখন নিশ্চিত হন যে আপনার স্ক্রিপ্টিং ইন্টিগ্রেশনটি বহুমুখী যথেষ্ট পরিমাণে সি # তে প্রয়োজনীয় বিটগুলি পুনরায় লিখন করে।

আমি ব্যক্তিগতভাবে সি # 4.0 এ dynamicবৈশিষ্ট্যটি ঘৃণা করি (আমি একটি স্থির ভাষার জাঙ্কি) - তবে এটি সন্দেহজনক যে এটি একটি দৃশ্য যেখানে এটি ব্যবহার করা উচিত এবং যেখানে এটি সত্যই আলোকিত হয় doubt আপনার সি # উপাদানগুলি কেবল শক্তিশালী / প্রসারিত আচরণমূলক বস্তু হবে

public class Villian : ExpandoComponent
{
    public void Sound() { Console.WriteLine("Cackle!"); }
}

//...

dynamic villian = new Villian();
villian.Position = new Vector2(10, 10); // Add a property.
villian.Sound(); // Use a method that was defined in a strong context.

আপনার লুয়া উপাদানগুলি সম্পূর্ণ গতিশীল হবে (উপরের একই একই নিবন্ধটি আপনাকে কীভাবে এটি বাস্তবায়ন করতে পারে সে সম্পর্কে একটি ধারণা দেওয়া উচিত)। উদাহরণ স্বরূপ:

// LuaSharp is my weapon of choice.
public class LuaObject : DynamicObject
{
    private LuaTable _table;

    public LuaObject(LuaTable table)
    {
        _table = table;
    }

    public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
    {
        var methodName = binder.Name;
        var function = (LuaFunction)_table[methodName];
        if (function == null)
        {
            return base.TryInvokeMember(binder, args, out result);
        }
        else
        {
            var resultArray = function.Call(args);
            if (resultArray == null)
                result = null;
            else if (resultArray.Length == 1)
                result = resultArray[0];
            else
                result = resultArray;
            return true;
        }
    }

    // Other methods for properties etc.
}

এখন আপনি ব্যবহার করছেন বলে আপনি dynamicলুয়া অবজেক্টগুলি ব্যবহার করতে পারেন যেমন তারা সি # তে আসল ক্লাস ছিল।

dynamic cSharpVillian = new Villian();
dynamic luaVillian = new LuaObject(_script["teh", "villian"]);
cSharpVillian.Sound();
luaVillian.Sound(); // This will call into the Lua function.

আমি প্রথম অনুচ্ছেদে সম্পূর্ণরূপে একমত, আমি প্রায়শই এইভাবে আমার কাজটি করি। আপনি জানেন যে লিখিত কোডটি আপনাকে নিম্ন স্তরের ভাষায় পুনর্নির্মাণ করতে হতে পারে, aণ গ্রহণ করার মতো যা আপনাকে আগ্রহের জন্য প্রদান করতে হবে N আইটি ডিজাইনাররা প্রায়শই loansণ নেন: যখন তারা জানেন যে তারা এটি করেছেন এবং তারা তাদের debtsণ নিয়ন্ত্রণে রাখেন তখন এটি ভাল।
এফএক্সআইআইআই

2

আমি বরং বিপরীতে করব: একটি ডায়নামিক ভাষা ব্যবহার করে সমস্ত লিখুন এবং তারপরে বোতলকে (যদি কোনও হয়) সন্ধান করুন। একবার আপনি যদি কোনওটি খুঁজে পান তবে আপনি সি # বা (বরং) সি / সি ++ ব্যবহার করে জড়িত ক্রিয়াকলাপগুলিকে বাছাই করে পুনরায় প্রতিস্থাপন করতে পারেন।

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

আপনার টার্গেট যদি দ্বিতীয়টি হয়, যেমনটি আমি বিশ্বাস করি, আপনি সম্ভবত আপনার সময়টি গেম মেকানিক্সের প্রতি সবচেয়ে ভাল মনোযোগ কেন্দ্রীভূত করতে চান, একটি seasonতুযুক্ত দোভাষীকে গতিশীল কোড চালানোর জন্য।


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

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

4
+1 যদিও আমি অন্য কারণের সাথে একমত হয়েছি - আপনি যদি নিজের খেলাটি বর্ধনযোগ্য হতে চান তবে আপনার নিজের কুকুরের খাবার খাওয়া উচিত: আপনি কেবল নিজের সম্ভাব্য মোডিং সম্প্রদায়কে খুঁজে পেতে কোনও স্ক্রিপ্ট ইঞ্জিনকে একীভূত করতে পারেন তবে বাস্তবে এটি কোনও কিছুই তৈরি করতে পারে না find এটা।
জোনাথন ডিকিনসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.