আমি কিছুটা অভিজ্ঞতা থেকে কথা বলতে যাচ্ছি, কঠোর OO- নকশা থেকে কোনও সত্তা-উপাদান-সিস্টেম (ইসিএস) ডিজাইনে যাচ্ছি।
কিছুক্ষণ আগে আমি ঠিক আপনার মতোই ছিলাম, আমার বিভিন্ন ধরণের জিনিসগুলির একটি গুচ্ছ ছিল যা একই ধরণের বৈশিষ্ট্যযুক্ত ছিল এবং আমি বিভিন্ন বস্তু তৈরি করেছি এবং উত্তরাধিকারটি সমাধান করার জন্য ব্যবহার করার চেষ্টা করেছি। খুব স্মার্ট ব্যক্তি আমাকে বলেছিলেন যে এটি করবেন না এবং পরিবর্তে সত্তা-উপাদান-সিস্টেমটি ব্যবহার করুন।
এখন, ইসিএস একটি বড় ধারণা, এবং এটি সঠিকভাবে পাওয়া শক্ত। এর মধ্যে প্রচুর কাজ রয়েছে যা সঠিকভাবে সত্তা, উপাদান এবং সিস্টেমগুলি তৈরি করছে। যদিও আমরা এটি করতে পারার আগে আমাদের শর্তাদি সংজ্ঞায়িত করতে হবে।
- সত্তা : এই জিনিস , প্লেয়ার, প্রাণী, এনপিসি, যাই হোক না কেন । এটি এমন একটি জিনিস যা এর সাথে সংযুক্ত উপাদানগুলির প্রয়োজন।
- উপাদান : এটি আপনার ক্ষেত্রে "নাম" বা "বয়স" বা "পিতামাতা" এর মতো বৈশিষ্ট্য বা সম্পত্তি is
- সিস্টেম : এটি কোনও উপাদান বা আচরণের পিছনে যুক্তি । সাধারণত, আপনি প্রতিটি উপাদান প্রতি একটি সিস্টেম তৈরি, কিন্তু এটি সবসময় সম্ভব হয় না। তদাতিরিক্ত, কখনও কখনও সিস্টেমগুলি অন্যান্য সিস্টেমে প্রভাবিত করে ।
সুতরাং, আমি এখানে এটি যেখানে যাব:
প্রথম এবং সর্বাগ্রে, ID
আপনার অক্ষরের জন্য একটি তৈরি করুন । একটি int
, Guid
আপনি যা খুশি। এটি হ'ল "সত্তা"।
দ্বিতীয়ত, আপনি যে বিভিন্ন আচরণ করছেন তা নিয়ে ভাবনা শুরু করুন। "পারিবারিক গাছ" এর মতো জিনিস - এটি একটি আচরণ। সত্তার বৈশিষ্ট্য হিসাবে মডেলিংয়ের পরিবর্তে, এমন একটি সিস্টেম তৈরি করুন যা সমস্ত তথ্য ধারণ করে । সিস্টেমটি তার পরে কী করবে তা সিদ্ধান্ত নিতে পারে।
একইভাবে, আমরা "চরিত্রটি জীবিত বা মৃত?" এর জন্য একটি সিস্টেম তৈরি করতে চাই? এটি আপনার ডিজাইনের একটি গুরুত্বপূর্ণ সিস্টেম, কারণ এটি অন্য সমস্তকে প্রভাবিত করে। কিছু সিস্টেম "মৃত" অক্ষরগুলি মুছে ফেলতে পারে (যেমন "স্প্রাইট" সিস্টেম), অন্যান্য সিস্টেমগুলি অভ্যন্তরীণভাবে নতুন স্থিতিকে আরও ভালভাবে সমর্থন করার জন্য জিনিসগুলি পুনরায় সাজিয়ে তুলতে পারে।
উদাহরণস্বরূপ আপনি একটি "স্প্রাইট" বা "অঙ্কন" বা "রেন্ডারিং" সিস্টেম তৈরি করবেন। এই সিস্টেমে কোন চরিত্রটি প্রদর্শিত হবে এবং কীভাবে এটি প্রদর্শিত হবে তা নির্ধারণ করার দায়িত্ব থাকবে। তারপরে, যখন কোনও চরিত্র মারা যায়, তাদের সরান।
অতিরিক্তভাবে, একটি "এআই" সিস্টেম যা কোনও চরিত্রকে কী করতে হবে, কোথায় যেতে হবে ইত্যাদি বলতে পারে This এটি অন্যান্য সিস্টেমের সাথে অনেকের সাথে ইন্টারঅ্যাক্ট করা উচিত এবং সেগুলির ভিত্তিতে সিদ্ধান্ত নেওয়া উচিত। আবার, মৃত চরিত্রগুলি সম্ভবত এই সিস্টেম থেকে সরানো যেতে পারে, যেহেতু তারা সত্যিই আর কিছু করছে না।
আপনার "নাম" সিস্টেম এবং "পারিবারিক বৃক্ষ" সিস্টেমটি সম্ভবত চরিত্রটিকে (জীবিত বা মৃত) স্মৃতিতে রাখা উচিত। এই সিস্টেমে চরিত্রের অবস্থা কী তা বিবেচনা না করেই সেই তথ্যটি পুনরায় স্মরণ করা দরকার। (জিম এখনও জিম, এমনকি আমরা তাকে কবর দেওয়ার পরেও))
সিস্টেমটি আরও দক্ষতার সাথে প্রতিক্রিয়া জানালে এটি পরিবর্তনের সুবিধাও দেয় : সিস্টেমটির নিজস্ব টাইমার থাকে। কিছু সিস্টেমে দ্রুত গুলি চালানো দরকার, কিছু কিছু নয়। এটিই আমরা গেমকে দক্ষতার সাথে চালিত করতে শুরু করি। আমাদের প্রতি মিলিসেকেন্ড আবহাওয়ার পুনঃ গণন করার দরকার নেই, আমরা সম্ভবত প্রতি 5 বা তত করে এটি করতে পারি।
এটি আপনাকে আরও সৃজনশীল লিভারেজ দেয়: আপনি এমন একটি "প্যাথফাইন্ডার" সিস্টেম তৈরি করতে পারেন যা এ-টু-বি থেকে কোনও পাথের গণনা পরিচালনা করতে পারে এবং প্রয়োজনীয়ভাবে আপডেট করতে পারে, আন্দোলন ব্যবস্থাটিকে "যেখানে আমার দরকার আছে" বলতে দেয় পরের দিকে যেতে হবে? " আমরা এখন এই উদ্বেগগুলি এবং তাদের সম্পর্কে আরও কার্যকরভাবে যুক্ত করতে পুরোপুরি আলাদা করতে পারি। চলাফেরার পথটি খুঁজে পাওয়ার দরকার নেই, আপনাকে কেবল সেখানে পৌঁছানো দরকার।
আপনি কোনও সিস্টেমের কিছু অংশ বাইরের দিকে প্রকাশ করতে চাইবেন। আপনার Pathfinder
সিস্টেমে আপনি সম্ভবত একটি চাইবেন Vector2 NextPosition(int entity)
। এইভাবে, আপনি সেই উপাদানগুলিকে শক্তভাবে নিয়ন্ত্রিত অ্যারে বা তালিকায় রাখতে পারেন। আপনি আরও ছোট, struct
প্রকারের ব্যবহার করতে পারেন যা আপনাকে ছোট, স্বচ্ছ মেমরি ব্লকগুলিতে উপাদান রাখতে সহায়তা করতে পারে যা সিস্টেম আপডেটগুলি আরও দ্রুত তৈরি করতে পারে । (বিশেষত যদি কোনও সিস্টেমে বাহ্যিক প্রভাবগুলি ন্যূনতম হয় তবে এখন কেবল এটির অভ্যন্তরীণ অবস্থা যেমন যত্ন নেওয়া দরকার Name
))
তবে, এবং আমি এটির পক্ষে যথেষ্ট চাপ দিতে পারি না, এখন Entity
এটি কেবলমাত্র একটি ID
, টাইলস, অবজেক্টস ইত্যাদিসহ যদি কোনও সত্তা কোনও সিস্টেমের অন্তর্ভুক্ত না হয় তবে সিস্টেমটি এটি ট্র্যাক করবে না। এর অর্থ আমরা আমাদের "ট্রি" অবজেক্টগুলি তৈরি করতে পারি, সেগুলি সিস্টেমে Sprite
এবং Movement
সিস্টেমে সংরক্ষণ করতে পারি (গাছগুলি সরবে না, তবে তাদের "অবস্থান" উপাদান রয়েছে) এবং এগুলি অন্যান্য সিস্টেমের বাইরে রাখতে পারি। আমাদের আর গাছের জন্য বিশেষ তালিকার দরকার নেই, যেহেতু পেপারডলিং বাদে গাছের রেন্ডারিং চরিত্রের চেয়ে আলাদা নয়। (যা Sprite
সিস্টেম নিয়ন্ত্রণ করতে পারে, বা Paperdoll
সিস্টেম নিয়ন্ত্রণ NextPosition
করতে পারে )) এখন আমাদের সামান্যই আবার লেখা যেতে পারে: Vector2? NextPosition(int entity)
এবং null
এটি এমন সত্তাগুলিগুলির জন্য অবস্থানের পক্ষে ফিরে আসে যেখানে এটি যত্ন নেয় না। আমরা এটি আমাদের ক্ষেত্রেও প্রয়োগ করি NameSystem.GetName(int entity)
, এটি null
গাছ এবং শিলার জন্য ফিরে আসে ।
আমি এটি খুব কাছাকাছি এঁকে যাব, তবে এখানে ধারণাটি হ'ল ইসিএসের বিষয়ে আপনাকে কিছু পটভূমি দেওয়া এবং আপনি আপনার গেমটির আরও ভাল ডিজাইন দেওয়ার জন্য আপনি কীভাবে সত্যিকার অর্থে এটি ব্যবহার করতে পারেন । আপনি কর্মক্ষমতা বাড়াতে পারেন, সম্পর্কহীন উপাদানগুলি ডিকুয়াল করতে পারেন এবং জিনিসগুলিকে আরও সংগঠিত ফ্যাশনে রাখতে পারেন। (এটি এফ # এবং লিনকিউ এর মতো ক্রিয়ামূলক ভাষা / সেটআপগুলির সাথেও খুব ভাল জুড়েছে, যা আমি ইতিমধ্যে এফ # পরীক্ষা করার পরামর্শ দিচ্ছি যদি আপনি ইতিমধ্যে সেগুলিকে ব্যবহার করেন তবে এটি সি # এর সাথে খুব ভাল যুক্ত হয়))