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