একটি সত্তা সিস্টেমে আন্দোলনের অনেক উত্স


9

আমি সত্তা সিস্টেমগুলির ধারণাটিতে মোটামুটি নতুন, প্রচুর স্টাফ পড়ে (সবচেয়ে কার্যকরভাবে, এই দুর্দান্ত ব্লগ এবং এই উত্তর )।

যদিও আমি বুঝতে অসুবিধে হচ্ছি যে কত সহজ সরল কোনও অপরিবর্তিত সংখ্যক উত্স দ্বারা কোনও অবজেক্টের অবস্থানকে সামাল দিতে সক্ষম।

এটি হ'ল আমার সত্তা রয়েছে, যার একটি অবস্থান উপাদান রয়েছে। আমার তখন গেমের কিছু ইভেন্ট রয়েছে যা এই সত্তাকে একটি নির্দিষ্ট সময়ে, একটি নির্দিষ্ট দূরত্ব সরিয়ে নিতে বলে।

এই ইভেন্টগুলি যে কোনও সময় ঘটতে পারে এবং অবস্থান এবং সময়ের জন্য পৃথক মান থাকবে। ফলাফলটি হল যে তারা একসাথে মিশ্রিত হবে।

একটি traditionalতিহ্যবাহী ওও সমাধানে, আমার কিছু MoveByশ্রেণি থাকতে হবে, এতে আমার দূরত্ব / সময় এবং আমার গেম অবজেক্ট ক্লাসের ভিতরে থাকা একটি অ্যারে থাকে। প্রতিটি ফ্রেম, আমি সমস্তটি দিয়ে পুনরাবৃত্তি করতাম MoveByএবং এটি অবস্থানটিতে প্রয়োগ করতাম। যদি MoveByএটির সমাপ্তির সময়টি পৌঁছে যায় তবে এটিকে অ্যারে থেকে সরান।

সত্তা সিস্টেমের সাথে আমি কীভাবে এই ধরণের আচরণের প্রতিলিপি তৈরি করব সে সম্পর্কে আমি কিছুটা বিভ্রান্ত।

যদি এগুলির মধ্যে কেবলমাত্র একটি ছিল, তাদের একসাথে মিশ্রিত করার পরিবর্তে, এটি মোটামুটি সোজা হবে (আমি বিশ্বাস করি) এবং এর মতো কিছু দেখতে চাই:

PositionComponent ধারণকারী x, y

MoveByComponent ধারণকারী x, y, time

Entityযার দুটি PositionComponentএবং কMoveByComponent

MoveBySystemযা এই উভয় উপাদান সহ সত্তার সন্ধান করে এবং এর মান যুক্ত MoveByComponentকরে PositionComponent। যখন timeপৌঁছে যায়, এটি সেই সত্তা থেকে উপাদানটিকে সরিয়ে দেয়।

আমি কীভাবে অনেকগুলি সরানো দিয়ে একই জিনিস করব তা নিয়ে আমি কিছুটা বিভ্রান্ত।

আমার প্রাথমিক চিন্তাভাবনাগুলি হ'ল:

PositionComponent, MoveByComponentউপরের মত একই

MoveByCollectionComponentযা MoveByComponentএস এর অ্যারে ধারণ করে

MoveByCollectionSystemযেটি একটি PositionComponentএবং একটি সহ সত্তার সন্ধান করে, এটির অভ্যন্তরে MoveByCollectionComponentএসটি দিয়ে পুনরাবৃত্তি MoveByComponentকরে, প্রয়োজনীয়ভাবে প্রয়োগ / অপসারণ করে।

আমি অনুমান করি যে এটি একই সাধারণ উপাদানগুলির অনেকগুলি থাকা এবং প্রতিটিটির সাথে কাজ করার জন্য সংশ্লিষ্ট সিস্টেম চাই। আমার সত্তা উপাদান উপাদানগুলির একটি হ্যাশের ভিতরে তাদের উপাদানগুলি অন্তর্ভুক্ত করে -> উপাদান, তাই প্রতি সত্তা নির্দিষ্টভাবে নির্দিষ্ট ধরণের মাত্র 1 উপাদান রয়েছে।

  1. এটি তাকানোর সঠিক উপায় কি?

  2. কোনও সত্তার কি সর্বদা সর্বদা প্রদত্ত ধরণের একটি উপাদান থাকা উচিত?


1
MoveByকার্যকারিতার মতো শব্দগুলি কি কেবল একটি বেগ হয়? মনে হচ্ছে আপনি সঠিক পথে আছেন। আপনার দ্বিতীয় প্রশ্নের জন্য, সত্তা / উপাদান সিস্টেমের প্রচুর বিভিন্ন বাস্তবায়ন রয়েছে। আপনি যে উত্তরটি যুক্ত করেছেন তার মধ্যে বর্ণিত একটির মধ্যে একটি প্রদত্ত প্রকারের কেবল একটি উপাদান থাকবে।
MichaelHouse

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

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

এই নির্দিষ্ট মুভবি উদাহরণটি একটি উদাহরণ ছিল। আপনি কীভাবে এই জাতীয় জিনিসগুলিকে একসাথে মিশ্রিত করবেন সে সম্পর্কে প্রশ্নটি আরও ছিল। যদি আমার বিশেষভাবে '5 সেকেন্ডে x = 5 এবং y = 6' মুভিটি '10 x সেকেন্ডে x = 10 y = 2 দ্বারা সরানো' বলতে হয় তবে আমি কীভাবে এটি করব?
স্টিকি 18

"একত্রে মিশ্র" বলতে কী বোঝ? বেগ যোগ করার মতো? সুতরাং আপনি যদি মিশ্রিত হন move x by 10 in 2 secondsএবং move x by -10 in 2 secondsসত্তা পুরোপুরি স্থির হয়?
টম ডালিং

উত্তর:


6

আপনার দৃশ্যের জন্য, আমরা সাধারণত একটি গেম অবজেক্টে তিনটি উপাদান যুক্ত করি:

  1. ট্রান্সফর্ম কম্পোনেন্ট (অবস্থান, ওরিয়েন্টেশন, স্কেল)
  2. ভেলোসিটি কম্পোনেন্ট (গতি, দিকনির্দেশ)
  3. ControllerComponent

যখন গেমের অবজেক্টগুলিকে কিছু ধরণের এআই কার্যকারিতা যেমন আপনার বর্ণিত পথ ধরে চলার দরকার হয়, তখন আমরা এটির উপাদানগুলির তালিকায় একটি আইসিসিন্ট্রোলার নিয়োগ করি। AIControllers আসলে একটি আচরণের গাছের ধাপে মোড়কের বাইরে আর কিছুই নয়। আচরণ গাছটি হ'ল যেখানে আমরা আসল কার্যকারিতাটি ডিজাইন করি যা আমরা গেম অবজেক্ট যেমন সম্পাদন করতে চাই:

BehaviorTree* tree(new SequentialNode());
tree->addChild(new MoveToNode(x,y,z));
tree->addChild(new WaitNode(30));
tree->addChild(new MoveToNode(a,b,c));
tree->addChild(new WaitNode(30));
gameObject->addComponent(new AIController(tree));

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

উপরের কোডটি কেবল স্পেনের অবস্থান থেকে গ্লোবাল অবজেক্টটিকে বিশ্ব স্থানের মধ্যে এক্স, ওয়াই, জেডে সরিয়ে দেয়, তারপরে সর্বনিম্ন 30 সেকেন্ড অপেক্ষা করে, তারপরে গেমের অবজেক্টটি স্থান a, b, c এ স্থানান্তরিত করে এবং আরও 30 সেকেন্ড অপেক্ষা করে। একবার অপেক্ষা শেষ হওয়ার পরে, আচরণের ক্রম শেষ হয়ে গেছে, তাই এটি শুরু থেকেই পুনরাবৃত্তি করে।

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


1

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

উদাহরণস্বরূপ: একটি রান () পদ্ধতিতে একটি বেস কন্ট্রোলার ক্লাস তৈরি করুন, বা আপনি যদি নামটি পছন্দ না করেন তবে এটি কল করুন (), আপডেট করুন () বা টিক ()। তারপরে আপনি এটির উত্তরাধিকারী হয়ে একটি মুভকন্ট্রোলার, এনপিসিসি নিয়ন্ত্রণকারী, প্লেয়ার ইনপুটকন্ট্রোলার (প্লেয়ার সত্তার জন্য), ফিজিককন্ট্রোলার তৈরি করুন; তারপরে আপনি রান () পদ্ধতিটি প্রয়োগ করেন। আমি আপনার মুভবিকম্পোনমেন্টটি মুভকন্ট্রোলারে রেখে দেব সত্তায় নেই।

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

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

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

একটি কন্ট্রোলার প্যাটার্ন রয়েছে যা আমি শুনেছি। হতে পারে আপনার এটি অনুসন্ধান করা উচিত এবং এটি সম্ভবত আমি এখানে যা বলছি ঠিক তা নয় তবে এটি খুব ভাল সমাধানের মতো বলে মনে হচ্ছে।


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

@ স্টিকি আমাকে স্বীকার করতে হবে যে নোড সিস্টেম প্লাস উপাদানগুলির তৈরি সত্তা হ'ল আমার প্রস্তাবিত নিয়ন্ত্রকদের পদ্ধতির চেয়ে কম বিবর্তিত সংস্করণের মতো বিভিন্ন প্রয়োজনীয় সিস্টেমের প্রতিনিধিত্ব করার একটি চতুর উপায়। আপনার আসলে আমার উত্তর দরকার নেই।
হেটোরু হ্যানসু

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