গতকাল, আমি অ্যাট্রিবিউট / আচরণ সত্তা সিস্টেম সম্পর্কে জিডিসি কানাডার একটি উপস্থাপনা পড়েছি এবং আমি মনে করি এটি দুর্দান্ত। যাইহোক, আমি নিশ্চিত না যে কীভাবে এটি ব্যবহার করবেন তাত্ত্বিকভাবে, কেবল তাত্ত্বিকভাবে নয়। প্রথমত, আমি দ্রুত আপনাকে ব্যাখ্যা করব যে এই সিস্টেমটি কীভাবে কাজ করে।
প্রতিটি গেম সত্তা (খেলা বস্তু) গঠিত হয় বৈশিষ্ট্যাবলী এবং (, কিন্তু 'বহিরাগত কোড' দ্বারা = ডেটা, যা আচরণে দ্বারা ব্যবহার করা যেতে পারে) আচরণে (= যুক্তি, যা ধারণ করে OnUpdate()
এবং OnMessage()
)। সুতরাং, উদাহরণস্বরূপ, একটি ব্রেকআউট ক্লোন, প্রত্যেক ইট গঠিত করা হবে (উদাহরণস্বরূপ!): PositionAttribute , ColorAttribute , HealthAttribute , RenderableBehaviour , HitBehaviour । শেষটি এর মতো দেখতে পেল (এটি কেবল সি # তে লেখা একটি অ-কর্ম উদাহরণ):
void OnMessage(Message m)
{
if (m is CollisionMessage) // CollisionMessage is inherited from Message
{
Entity otherEntity = m.CollidedWith; // Entity CollisionMessage.CollidedWith
if (otherEntity.Type = EntityType.Ball) // Collided with ball
{
int brickHealth = GetAttribute<int>(Attribute.Health); // owner's attribute
brickHealth -= otherEntity.GetAttribute<int>(Attribute.DamageImpact);
SetAttribute<int>(Attribute.Health, brickHealth); // owner's attribute
// If health is <= 0, "destroy" the brick
if (brickHealth <= 0)
SetAttribute<bool>(Attribute.Alive, false);
}
}
else if (m is AttributeChangedMessage) // Some attribute has been changed 'externally'
{
if (m.Attribute == Attribute.Health)
{
// If health is <= 0, "destroy" the brick
if (brickHealth <= 0)
SetAttribute<bool>(Attribute.Alive, false);
}
}
}
আপনি যদি এই সিস্টেমে আগ্রহী হন তবে আপনি এখানে (.ppt) আরও পড়তে পারেন ।
আমার প্রশ্ন এই সিস্টেমের সাথে সম্পর্কিত তবে সাধারণত প্রতিটি উপাদান ভিত্তিক সত্তা সিস্টেম। আমি কখনই সত্যিকারের কম্পিউটার গেমগুলিতে কীভাবে কাজ করে তা দেখিনি, কারণ আমি কোনও ভাল উদাহরণ খুঁজে পাচ্ছি না এবং যদি আমি এটি পাই তবে এটি নথিভুক্ত নয়, কোনও মন্তব্য নেই এবং তাই আমি এটি বুঝতে পারি না।
তো, আমি কী জিজ্ঞাসা করতে চাই? আচরণগুলি (উপাদানগুলি) কীভাবে ডিজাইন করবেন। গেমডেভ এসই-তে আমি এখানে পড়েছি যে সর্বাধিক সাধারণ ভুলটি অনেকগুলি উপাদান তৈরি করা এবং সহজভাবে "সবকিছুকে একটি উপাদান তৈরি করা" component আমি পড়েছি যে এটি একটি উপাদানের রেন্ডারিংয়ের না প্রস্তাব দেওয়া হচ্ছে, কিন্তু এটা (তাই পরিবর্তে বাইরে এটা করতে RenderableBehaviour , এটা হয়তো হওয়া উচিত RenderableAttribute , এবং যদি কোনো সত্তার করেছে RenderableAttribute সত্যতে সেট, তারপর Renderer
(ক্লাস এর সাথে সম্পর্কিত নয় উপাদানগুলি, তবে ইঞ্জিনে নিজেই) এটি স্ক্রিনে আঁকতে হবে?)।
তবে, আচরণ / উপাদানগুলি সম্পর্কে কীভাবে? ধরুন যে, আমি একটি স্তর পেয়েছেন, এবং স্তরের, একটি যাক Entity button
, Entity doors
এবং Entity player
। যখন প্লেয়ার বোতামটির সাথে সংঘর্ষ হয় (এটি একটি ফ্লোর বোতাম, যা চাপ দ্বারা টগলড হয়), এটি টিপুন। বোতাম টিপলে, এটি দরজা খুলবে। আচ্ছা, এখন কীভাবে করব?
আমি ভালো কিছু সঙ্গে আসা পর্যন্ত করেছি: খেলোয়াড় পেয়েছে CollisionBehaviour , যা পরীক্ষা যদি খেলোয়াড় কিছু ধাক্কা দিতে যাচ্ছিল। যদি সে একটি বোতামের সাথে সংঘর্ষ CollisionMessage
হয় তবে এটি button
সত্তাকে একটি প্রেরণ করে । বার্তায় সমস্ত প্রয়োজনীয় তথ্য থাকবে: বোতামটির সাথে সংঘর্ষে কে। বোতামটি টগলযোগ্য বেহাইভ্যুর পেয়েছে , যা গ্রহণ করবে CollisionMessage
। এটি পরীক্ষা করবে এটি কার সাথে সংঘর্ষ করেছিল এবং যদি সেই সত্তার ওজন বাটনটি টগল করার পক্ষে যথেষ্ট পরিমাণে হয় তবে বোতামটি টগল হয়ে যায়। এখন, এটি বোতামটির টগলডঅ্যাট্রিবিউট সেট করে । ঠিক আছে, তবে এখন কি?
বোতামটি অন্য সমস্ত অবজেক্টকে তাগল করা হয়েছে তা জানাতে কি অন্য বার্তা পাঠাতে হবে? আমি মনে করি যে আমি যদি এটির মতো করে করি তবে আমার হাজার হাজার বার্তা ছিল এবং এটি খুব অগোছালো হয়ে উঠবে। সুতরাং সম্ভবত এটি আরও ভাল: দরজাগুলি নিয়মিত যাচাই করে যেগুলির সাথে লিঙ্কযুক্ত বোতামটি টিপে আছে কিনা এবং ততক্ষণে এটির খোলারঅ্যাট্রিবিউট পরিবর্তন করে । তবে তার অর্থ এই যে দরজার OnUpdate()
পদ্ধতিটি নিয়মিত কিছু করে চলেছে (এটি কি আসলেই সমস্যা?)
এবং দ্বিতীয় সমস্যা: যদি আমার আরও ধরণের বোতাম থাকে। একটিকে চাপ দিয়ে চাপানো হয়, দ্বিতীয়টি গুলি করে তাগল করা হয়, তৃতীয়টি টগল করা হয় যদি এটির উপরে জল isেলে দেওয়া হয়, ইত্যাদি This
Behaviour -> ToggleableBehaviour -> ToggleOnPressureBehaviour
-> ToggleOnShotBehaviour
-> ToggleOnWaterBehaviour
বাস্তব গেমগুলি কী এভাবে কাজ করে বা আমি কি নির্বোধ? সম্ভবত আমার কাছে কেবল একটি টোগলযোগ্য বেহাইভোর থাকতে পারে এবং এটি বাটনটাইপঅ্যাট্রিবিউট অনুসারে আচরণ করবে । সুতরাং এটি যদি একটি হয় ButtonType.Pressure
, এটি এটি করে, যদি এটি হয় তবে এটি ButtonType.Shot
অন্য কিছু করে ...
তাহলে আমি কী চাই? আমি আপনাকে জিজ্ঞাসা করতে চাই যে আমি এটি সঠিকভাবে করছি কিনা, অথবা আমি কেবল বোকা এবং আমি উপাদানগুলির বিন্দুটি বুঝতে পারি না। গেমগুলিতে উপাদানগুলি কীভাবে কার্যকরভাবে কাজ করে তার কোনও ভাল উদাহরণ আমি খুঁজে পাইনি, আমি কীভাবে উপাদানটি তৈরি করব তা বর্ণনা করার জন্য কিছু টিউটোরিয়াল পেয়েছি, তবে কীভাবে এটি ব্যবহার করবেন তা নয়।