আমি কীভাবে দৈত্য প্লেয়ার ক্লাস এড়াতে পারি?


46

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


26
একাধিক ফাইল বা একটি ফাইল, কোডটি কোথাও যেতে হবে। গেমগুলি জটিল। আপনার যা প্রয়োজন তা জানতে, ভাল পদ্ধতির নাম এবং বর্ণনামূলক মন্তব্য লিখুন। পরিবর্তনগুলি করতে ভয় পাবেন না - কেবল পরীক্ষা করুন। এবং আপনার কাজের ব্যাকআপ করুন :)
ক্রিস ম্যাকফারল্যান্ড

7
আমি পেয়েছি এটি অন্য কোথাও যেতে হবে তবে নমনীয়তা এবং রক্ষণাবেক্ষণের ক্ষেত্রে কোড ডিজাইনের বিষয়। কয়েক হাজার লাইনের কোডের একটি শ্রেণি বা গোষ্ঠী থাকা কেবল আমার মতোই আঘাত করে না।
ব্যবহারকারী 441521

17
@ ক্রিসমিসফারল্যান্ড ব্যাকআপ নেওয়ার পরামর্শ দিচ্ছে না, এক্সডি সংস্করণ কোডের পরামর্শ দেয়।
গেম ডেভেলপার

1
@ ক্রিসমিসফারল্যান্ড আমি গেম ডেভেলপারের সাথে একমত। গিট, এসএনএন, টিএফএস, ... এর মতো সংস্করণ নিয়ন্ত্রণের ফলে বৃহত্তর পরিবর্তনগুলি আরও সহজেই পূর্বাবস্থায় ফেরাতে সক্ষম হওয়ার কারণে এবং দুর্ঘটনাক্রমে আপনার প্রকল্পটি মুছে ফেলা, হার্ডওয়্যার ব্যর্থতা বা ফাইল দুর্নীতির মতো বিষয়গুলি থেকে সহজেই পুনরুদ্ধার করতে সক্ষম হয়ে উন্নয়নকে এত সহজ করে তোলে।
Nzall

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

উত্তর:


67

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

এই পদ্ধতির অবজেক্ট ওরিয়েন্টেড অ্যাপ্রোচ হিসাবে সঠিক বিপরীত দিকে যায়। গেমের সমস্ত কিছুই একটি সত্তা। সত্তা এটির মধ্যে তৈরি কোনও গেম মেকানিক ছাড়া কেবল একটি মামলা। এটিতে উপাদানগুলির একটি তালিকা এবং সেগুলি হেরফের করার একটি উপায় রয়েছে।

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

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

এটি কোডটিকে ছোট, পুনরায় ব্যবহারযোগ্য মডিউলগুলিতে বিভক্ত করতে সহায়তা করে এবং এর ফলে আরও সংগঠিত প্রকল্প হতে পারে।


মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে ।
MichaelHouse

8
আমি মুভিং করা মন্তব্যগুলি বুঝতে পারি যেগুলি সরানো দরকার, উত্তরের যথার্থতার জন্য যেগুলি চ্যালেঞ্জ করে তাদের সরাবেন না। এটা সুস্পষ্ট হওয়া উচিত, না?
বাগ-এ-লট

20

গেমগুলি এতে অনন্য নয়; godশ্বর-শ্রেণি সর্বত্র একটি বিরোধী নিদর্শন।

একটি সাধারণ সমাধান হ'ল ছোট ক্লাসের গাছে বড় ক্লাসটি ভেঙে ফেলা। যদি প্লেয়ারের কোনও জায় থাকে, তবে তালিকা পরিচালনার অংশটি তৈরি করবেন না class Player। পরিবর্তে, একটি তৈরি করুন class Inventory। এটি এর জন্য একজন সদস্য class Player, তবে অভ্যন্তরীণভাবে class Inventoryপ্রচুর কোড মোড়ানো যায়।

আর একটি উদাহরণ: কোনও খেলোয়াড়ের চরিত্রের এনপিসির সাথে সম্পর্ক থাকতে পারে, সুতরাং আপনার class Relationকাছে Playerঅবজেক্ট এবং অবজেক্ট উভয়ই রেফারেন্সিং থাকতে পারে তবে এটি উভয়েরই NPCনয়।


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

1
লোকেরা সাধারণত কিছু বলে godশ্বর শ্রেণি বা godশ্বর বস্তু, যখন এটি খেলায় প্রতিটি অন্যান্য শ্রেণি / অবজেক্টকে ধারণ করে এবং পরিচালনা করে।
বিলিন্ট

11

1) প্লেয়ার: স্টেট-মেশিন + উপাদান ভিত্তিক আর্কিটেকচার।

প্লেয়ারের জন্য সাধারণ উপাদান: হেলথসিস্টেম, মুভমেন্ট সিস্টেম, ইনভেন্টরিসিস্টেম, অ্যাকশন সিস্টেম। এগুলি সব ক্লাসের মতো class HealthSystem

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

যুক্তরাষ্ট্র: লুটস্টেট, রানস্টেট, ওয়াকস্টেট, অ্যাটাকস্টেট, আইডিএলস্টেট।

প্রতিটি রাষ্ট্র থেকে উত্তরাধিকার সূত্রে প্রাপ্ত interface IStateIStateআমাদের ক্ষেত্রে রয়েছে একটি উদাহরণের জন্য 4 টি পদ্ধতি।Loot() Run() Walk() Attack()

এছাড়াও, আমরা class InputControllerযেখানে ব্যবহারকারীর প্রতিটি ইনপুট পরীক্ষা করি।

এখন বাস্তব উদাহরণ হিসাবে: InputControllerআমরা খেলোয়াড়ের যে কোনওটি প্রেস করে কিনা তা পরীক্ষা করে দেখি WASD or arrowsএবং তারপরে তিনি যদি চাপও দেন Shift। যদি সে কেবল চাপ দেয় WASDতবেই আমরা কল করি _currentPlayerState.Walk();যখন এই সুখী হয় এবং আমাদের তখন currentPlayerStateসমান হতে হয় WalkStateযখন WalkState.Walk() আমাদের এই রাজ্যের জন্য প্রয়োজনীয় সমস্ত উপাদান রয়েছে - এই ক্ষেত্রে MovementSystem, আমরা খেলোয়াড়কে সরানো করি public void Walk() { _playerMovementSystem.Walk(); }- আপনি দেখুন আমাদের এখানে কী আছে? আমাদের আচরণের দ্বিতীয় স্তর রয়েছে এবং কোড রক্ষণাবেক্ষণ এবং ডিবাগিংয়ের জন্য এটি খুব ভাল।

এখন দ্বিতীয় ক্ষেত্রে: আমরা যদি WASD+ Shiftটিপে থাকি তবে কী হবে ? তবে আমাদের আগের অবস্থা ছিল WalkState। এই ক্ষেত্রে Run()মধ্যে ডাকা হবে InputController(এই তালগোল না, Run()কারণ আমরা আছে বলা হয় WASD+ + Shiftচেক InputControllerকারণ না WalkState)। আমরা যখন কল _currentPlayerState.Run();মধ্যে WalkState- আমরা জানি আমরা সুইচ আছে _currentPlayerStateকরার RunStateএবং আমরা তা করতে Run()এর WalkStateএবং এই পদ্ধতি ভিতরে আবার সেটিতে কল কিন্তু এখন একটি ভিন্ন রাষ্ট্রের সাথে কারণ আমরা হারান কর্ম এই ফ্রেম চাই না। এবং এখন অবশ্যই আমরা কল _playerMovementSystem.Run();

কিন্তু LootStateযখন খেলোয়াড় হাঁটতে বা চালাতে না পারে ততক্ষণ সে কী বোতামটি ছেড়ে দেয়? ঠিক আছে এই ক্ষেত্রে যখন আমরা লুটপাট শুরু করি, উদাহরণস্বরূপ যখন বোতাম Eটিপানো হয়েছিল তখন আমরা কল _currentPlayerState.Loot();করি আমরা স্যুইচ করি LootStateএবং এখন সেখান থেকে কলটি কল করি। সেখানে আমরা উদাহরণস্বরূপ কল সংঘর্ষের পদ্ধতিটি পেয়েছি যদি এখানে সীমার মধ্যে লুটপাটের কিছু থাকে। এবং আমরা কর্টিনকে কল করি যেখানে আমাদের একটি অ্যানিমেশন রয়েছে বা যেখানে আমরা এটি শুরু করেছি এবং এটি পরীক্ষা করে দেখুন যে প্লেয়ারটি এখনও বোতামটি ধরে রেখেছে কিনা, যদি কর্টিন বিরতি না ঘটে, যদি হ্যাঁ আমরা তাকে কর্টিনের শেষে লুট দিই। তবে প্লেয়ার চাপলে WASDকী হবে? - _currentPlayerState.Walk();বলা হয়, কিন্তু এখানে রাষ্ট্র-মেশিন সম্পর্কে সুন্দর জিনিস thingLootState.Walk()আমাদের একটি শূন্য পদ্ধতি রয়েছে যা কিছুই করে না বা যেমন আমি বৈশিষ্ট্য হিসাবে করব - খেলোয়াড়রা বলেছেন: "আরে মানুষ, আমি এখনও এটিকে লুট করি নি, আপনি কি অপেক্ষা করতে পারেন?" সে যখন লুটপাট শেষ করে, তখন আমরা পরিবর্তন করি IDLEState

এছাড়াও, আপনি অন্য একটি স্ক্রিপ্ট করতে পারেন যা ডাকা হয় class BaseState : IStateযা এই সমস্ত ডিফল্ট পদ্ধতির আচরণ বাস্তবায়িত হয়েছে, তবে সেগুলি রয়েছে virtualযাতে আপনি overrideতাদের class LootState : BaseStateধরণের শ্রেণিতে করতে পারেন ।


উপাদান ভিত্তিক সিস্টেমটি দুর্দান্ত, কেবলমাত্র এটিই আমাকে বিরক্ত করে তা উদাহরণস্বরূপ, এর মধ্যে অনেকগুলি। এবং এটি মেমরির বেশি লাগে এবং আবর্জনা সংগ্রাহকের জন্য কাজ করে। উদাহরণস্বরূপ, আপনার কাছে শত্রুর 1000 টি উদাহরণ রয়েছে। তাদের সকলের 4 টি উপাদান রয়েছে। 1000 এর পরিবর্তে 4000 অবজেক্ট। এমবি এটি এত বড় ব্যাপার নয় (আমি পারফরম্যান্স টেস্টগুলি চালাইনি) যদি আমরা unityক্য গেমোবজেক্টের সমস্ত উপাদান বিবেচনা করি।


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

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

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

বিল্ডিং সহ আরও একটি উদাহরণ। প্লেয়ার এর মতো কিছু কল করতে পারে OpenBuildingWindow(), তবে Buildingসমস্ত অংশের যত্ন নেবে এবং ব্যবহারকারী যখন নির্দিষ্ট নির্দিষ্ট বিল্ডিং তৈরি করার সিদ্ধান্ত নেয়, তখন সে সমস্ত প্রয়োজনীয় তথ্য খেলোয়াড়ের কাছে পৌঁছে দেয় Build(BuildingInfo someBuildingInfo)এবং প্লেয়ার প্রয়োজনীয় সমস্ত অ্যানিমেশন দিয়ে এটি তৈরি করতে শুরু করে।

সলিড - ওওপি নীতিগুলি। এস - একক দায়িত্ব: আমরা আগের উদাহরণগুলিতে যা দেখেছি। হ্যাঁ ঠিক আছে, তবে উত্তরাধিকার কোথায়?

এখানে: খেলোয়াড়ের স্বাস্থ্য এবং অন্যান্য বৈশিষ্ট্যগুলি কি অন্য সত্তা দ্বারা পরিচালিত হওয়া উচিত? আমি মনে করি না. স্বাস্থ্য ছাড়া খেলোয়াড় থাকতে পারে না, যদি সেখানে থাকে তবে আমরা উত্তরাধিকার সূত্রে পাই না। উদাহরণস্বরূপ, আমরা আছে IDamagable, LivingEntity, IGameActor, GameActorIDamagableঅবশ্যই আছে TakeDamage()

class LivinEntity : IDamagable {

   private float _health; // For fields that are the same between Instances I would use Flyweight Pattern.

   public void TakeDamage() {
       ....
   }
}

class GameActor : LivingEntity, IGameActor {
    // Here goes state machine and other attached components needed.
}

class Player : GameActor {
   // Inventory, Building, Crafting.... components.
}

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

OrganicBuilding : Building, TechBuilding : Building। সাধারণ ক্রিয়াকলাপ বা বিল্ডিংয়ের বৈশিষ্ট্যগুলির জন্য আপনাকে 2 টি উপাদান তৈরি করতে এবং কোড লিখতে হবে না। এবং তারপরে এগুলিকে আলাদা করে যুক্ত করুন, আপনি উত্তরাধিকারের ক্ষমতা এবং পরে পলিমারফিজম এবং ইনকিপুলেশন ব্যবহার করতে পারেন।


আমি এর মধ্যে কিছু ব্যবহার করার পরামর্শ দেব। এবং অতিরিক্ত উপাদান ব্যবহার করে না।


আমি গেম প্রোগ্রামিং প্যাটার্নস সম্পর্কে এই বইটি পড়ার সর্বাধিক পরামর্শ দিই - এটি WEB এ বিনামূল্যে B


আমি আজ রাতের পরে খনন করব তবে এফওয়াইআই আমি unityক্য ব্যবহার করছি না তাই আমাকে কিছু ঠিক করতে হবে যা ভাল।
ব্যবহারকারী 441521

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

আমি ইউনিটি আগে ব্যবহার করেছি তাই আমি ধারণাটি বুঝতে পারি। আমি লুয়া ব্যবহার করছি যাতে কর্টাইন রয়েছে তাই জিনিসগুলি বেশ ভালভাবে অনুবাদ করা উচিত।
ব্যবহারকারী 441521

এই উত্তরটি tooক্য ট্যাগের অভাব বিবেচনা করে কিছুটা Unক্য-নির্দিষ্ট বলে মনে হচ্ছে। আপনি যদি এটিকে আরও জেনেরিক করে তোলেন এবং theক্যের বিষয়টিকে উদাহরণ হিসাবে আরও তৈরি করেন তবে এটি আরও উত্তম উত্তর হবে।
ফারাপ

ক্যান্ডিডমুন হ্যাঁ, এটি আরও ভাল।
ফারাপ

4

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

প্রথমত, একটি Playerশ্রেণীর ধারণাটি প্রথম স্থানে বিভ্রান্তিকর হয়। অনেক লোক খেলোয়াড়ের চরিত্র, এনপিসি চরিত্র এবং দানব / শত্রুদের বিভিন্ন শ্রেণি হিসাবে ভাবার প্রবণতা দেখায়, যখন বাস্তবে তাদের সকলের মধ্যে যথেষ্ট মিল থাকে: তারা সকলেই পর্দার উপর টানা হয়, তারা সকলেই ঘোরাফেরা করে, তারা সম্ভবত সকলের ইনভেন্টরি ইত্যাদি রয়েছে

এই চিন্তাভাবনাটি এমন পদ্ধতির দিকে নিয়ে যায় যেখানে প্লেয়ারের অক্ষর, খেলোয়াড়ের অক্ষর এবং দানব / শত্রুরা সবাই Entityআলাদা আচরণ করার পরিবর্তে ' এর' হিসাবে বিবেচিত হয় । স্বাভাবিকভাবে যদিও, তাদের আলাদাভাবে আচরণ করতে হবে - প্লেয়ারের চরিত্রটি ইনপুটটির মাধ্যমে নিয়ন্ত্রণ করতে হবে এবং এনপিসিএসের দরকার হয় আইআই।

এর সমাধানটি হল Controllerক্লাসগুলি যা নিয়ন্ত্রণ করতে ব্যবহৃত হয় Entity। এটি করে, সমস্ত ভারী যুক্তি কন্ট্রোলারে শেষ হয় এবং সমস্ত ডেটা এবং সাধারণতা সত্তায় সংরক্ষণ করা হয়।

তদ্ব্যতীত , এবং এর Controllerমধ্যে সাবক্লাসিং করে এটি প্লেয়ারকে ঘরের যে কোনওটিকে কার্যকরভাবে নিয়ন্ত্রণ করতে দেয় । এই পদ্ধতিটি এমন একটি বা ক্লাসের মাধ্যমে মাল্টিপ্লেয়ারকে সহায়তা করে যা কোনও নেটওয়ার্ক স্ট্রিমের কমান্ডের মাধ্যমে পরিচালিত হয়।InputControllerAIControllerEntityRemoteControllerNetworkController

Controllerআপনি যদি সাবধান না হন তবে এর ফলে প্রচুর যুক্তি এক হয়ে উঠতে পারে । এটি এড়ানোর উপায়টি হ'ল Controllerযেগুলি অন্যান্য Controllerএস দ্বারা গঠিত , বা Controllerকার্যকারিতাটি বিভিন্ন বৈশিষ্ট্যের উপর নির্ভর করে Controller। উদাহরণস্বরূপ, এর সাথে এটি সংযুক্ত AIControllerথাকবে DecisionTreeএবং এটি PlayerCharacterControllerবিভিন্ন , Controllerযেমন ক MovementController, ক JumpController( অনগ্রাউন্ড, অ্যাসেন্ডিং এবং অবরোহকারী রাজ্যগুলির সাথে একটি রাষ্ট্রীয় মেশিনযুক্ত) সমন্বিত হতে পারে, একটি InventoryUIController। এর একটি অতিরিক্ত সুবিধা হ'ল Controllerনতুন বৈশিষ্ট্য যুক্ত হওয়ার সাথে সাথে নতুন যুক্ত করা যেতে পারে - যদি কোনও ইনভেন্টরি সিস্টেম ছাড়াই কোনও গেম শুরু হয় এবং একটি যুক্ত করা হয়, তবে এর জন্য একটি নিয়ামক পরে নেওয়া যেতে পারে।


আমি এটির ধারণাটি পছন্দ করি তবে মনে হয় এটি একই কোডটি রেখে আমাকে সমস্ত কোড নিয়ামক শ্রেণিতে স্থানান্তরিত করেছে।
ব্যবহারকারী 441521

@ ব্যবহারকারী 441521 ঠিক বুঝতে পেরেছি আমি যুক্ত করতে যাচ্ছি এমন একটি অতিরিক্ত অনুচ্ছেদ রয়েছে তবে আমার ব্রাউজারটি ক্র্যাশ হয়ে গেলে আমি এটি হারিয়ে ফেলেছিলাম। আমি এখন এটি যুক্ত করব। মূলত, আপনার কাছে বিভিন্ন কন্ট্রোলার থাকতে পারে তাদের এগ্রিগেট কন্ট্রোলারে রচনা করতে পারে যাতে প্রতিটি নিয়ামক বিভিন্ন জিনিস পরিচালনা করে। উদাহরণস্বরূপ AggregateController.Controllers = {jumpController (কীবাইন্ডস), মুভকন্ট্রোলার (কীবাইন্ডস), ইনভেন্টরি ইউআইসি কন্ট্রোলার (কীবাইন্ডস, ইউসিস্টেম)}
ফারাপ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.