একটি শক্তিশালী আইটেম সিস্টেম তৈরি করা হচ্ছে


12

আমার লক্ষ্য হ'ল একটি মডুলার / যতটা জেনেরিক সম্ভব আইটেম সিস্টেম তৈরি করা যা এই জাতীয় জিনিসগুলি পরিচালনা করতে পারে:

  • আপগ্রেডযোগ্য আইটেম (+6 কাতানা)
  • স্ট্যাট মোডিফায়ার (+15 দক্ষতা)
  • আইটেম সংশোধক (ওয়াই ড্যামেজ করার% এক্স সুযোগ, জমাট বাঁধার সুযোগ)
  • রিচার্জেবল আইটেম (30 টি ব্যবহারের সাথে ম্যাজিক স্টাফ)
  • আইটেম সেট করুন (ওয় বৈশিষ্ট্য সক্রিয় করতে 4 টি এক্স সেট সজ্জিত করুন)
  • বিরলতা (সাধারণ, অনন্য, কিংবদন্তি)
  • অন্বেষণযোগ্য (কিছু কারুকাজের উপকরণগুলির মধ্যে বিরতি)
  • কারুকাজযোগ্য (নির্দিষ্ট উপকরণ দিয়ে তৈরি করা যেতে পারে)
  • গ্রহণযোগ্য (5 মিনিট% এক্স আক্রমণ শক্তি, নিরাময় +15 এইচপি)

* আমি এমন বৈশিষ্ট্যগুলি সমাধান করতে সক্ষম হয়েছি যা নিম্নলিখিত সেটআপের ক্ষেত্রে সাহসী।

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

আমি উত্তরাধিকার মোটেও ব্যবহার না করে বরং সত্তা-উপাদান / ডেটা চালিত পদ্ধতির পরিকল্পনা করছি। প্রথমদিকে আমি এমন একটি সিস্টেমের কথা ভেবেছিলাম যা রয়েছে:

  • বেসস্ট্যাট: জেনেরিক ক্লাস যা চলতি পরিসংখ্যান রাখে (আইটেম এবং চরিত্রের পরিসংখ্যানের জন্যও এটি ব্যবহার করা যেতে পারে)
  • আইটেম: এমন একটি শ্রেণি যা ডেটা ধারণ করে যেমন তালিকা, নাম, আইটেম টাইপ এবং ইউআই, অ্যাকশননাম, বিবরণ ইত্যাদির সাথে সম্পর্কিত জিনিসগুলির তালিকা data
  • আইওয়াওপন: অস্ত্রের জন্য ইন্টারফেস। আইওয়াইপন বাস্তবায়িত করে প্রতিটি অস্ত্রের নিজস্ব শ্রেণি থাকবে This এতে অ্যাটাক এবং চরিত্রের পরিসংখ্যানগুলির একটি রেফারেন্স থাকবে। যখন অস্ত্র সজ্জিত করা হয়, তখন এটির ডেটা (আইটেম ক্লাস 'স্টেট) অক্ষর স্ট্যাটে ইনজেকশনের ব্যবস্থা করা হবে (বেসস্ট্যাট যা কিছু থাকুক না কেন এটি স্ট্যাট বোনাস হিসাবে অক্ষর শ্রেণিতে যুক্ত করা হবে) সুতরাং উদাহরণস্বরূপ, আমরা একটি তরোয়াল তৈরি করতে চাই (ভাবতে ভাবতে জসন দিয়ে আইটেম ক্লাস উত্পাদন করুন) তাই তরোয়াল চরিত্রের পরিসংখ্যানগুলিতে 5 টি আক্রমণ যুক্ত করবে । সুতরাং আমাদের কাছে একটি বেসস্ট্যাট রয়েছে ("আক্রমণ", 5) (আমরা এনামও ব্যবহার করতে পারি)। এই স্টেটটি চরিত্রের "আক্রমণ" স্ট্যাটকে সজ্জিত করার পরে এটি একটি বোনাসস্ট্যাট হিসাবে যুক্ত করা হবে (যা একটি ভিন্ন শ্রেণি হবে)। সুতরাং তরোয়াল নামক একটি শ্রেণি আইওয়াইপন প্রয়োগ করে যখন এটি তৈরি করা হবে 'আইটেম ক্লাস তৈরি হয়। সুতরাং আমরা এই তরোয়ালটিতে চরিত্রের পরিসংখ্যানগুলি ইনজেক্ট করতে পারি এবং আক্রমণ করার সময় এটি অক্ষর স্ট্যাট থেকে সম্পূর্ণ অ্যাটাক স্ট্যাটটি পুনরুদ্ধার করতে পারে এবং আক্রমণ পদ্ধতিতে ক্ষতি ক্ষতিগ্রস্থ করে।
  • বোনাসস্ট্যাট: বেসস্ট্যাটকে স্পর্শ না করে বোনাস হিসাবে পরিসংখ্যান যুক্ত করার একটি উপায়।
  • আইকনসামেবল: আইওয়েপনের মতো একই যুক্তি। ডাইরেক্ট স্ট্যাট যুক্ত করা মোটামুটি সহজ (+15 এইচপি) তবে আমি এই সেটআপটি দিয়ে অস্থায়ী অস্ত্র যোগ করার বিষয়ে নিশ্চিত নই (5 মিনিটের জন্য আক্রমণে% x)।
  • আইউগ্রেডেবল: এটি এই সেটআপ দিয়ে প্রয়োগ করা যেতে পারে। আমি আপগ্রেড লেভেলকে বেস স্ট্যাটাস হিসাবে ভাবছি যা আপগ্রেড করার অস্ত্র বাড়ানো হয়েছে। আপগ্রেড করা হলে, আমরা অস্ত্রের বেসস্ট্যাট এর আপগ্রেড স্তরের সাথে মেলে পুনরায় গণনা করতে পারি ।

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

আপনার এটির অবদান সহজ করার জন্য, এখানে কিছু প্রশ্ন রয়েছে যা আপনি সহায়তা করতে পারেন:

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

আমি একক প্রশ্নের উত্তর দিতে দ্বিধা বোধ করি কারণ আমি প্রশ্নগুলি খুব বিস্তৃত করে রেখেছি যাতে আমি বিভিন্ন দিক / লোকদের কাছ থেকে জ্ঞান পেতে পারি।


সম্পাদনা


@ Jjimenezg93 এর উত্তর অনুসরণ করে, আমি পরীক্ষার জন্য সি # তে একটি খুব বেসিক সিস্টেম তৈরি করেছি, এটি কার্যকর! আপনি এতে কিছু যোগ করতে পারেন কিনা তা দেখুন:

public interface IItem
{
    List<IAttribute> Components { get; set; }

    void ReceiveMessage<T>(T message);
}

public interface IAttribute
{
    IItem source { get; set; }
    void ReceiveMessage<T>(T message);
}

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


public class TestItem : IItem
{
    private List<IAttribute> _components = new List<IAttribute>();
    public List<IAttribute> Components
    {
        get
        {
            return _components;
        }

        set
        {
            _components = value;
        }
    }

    public void ReceiveMessage<T>(T message)
    {
        foreach (IAttribute attribute in Components)
        {
            attribute.ReceiveMessage(message);
        }
    }
}

public class TestAttribute : IAttribute
{
    string _infoRequiredFromMessage;

    public TestAttribute(IItem source)
    {
        _source = source;
    }

    private IItem _source;
    public IItem source
    {
        get
        {
            return _source;
        }

        set
        {
            _source = value;
        }
    }

    public void ReceiveMessage<T>(T message)
    {
        TestMessage convertedMessage = message as TestMessage;
        if (convertedMessage != null)
        {
            convertedMessage.Execute();
            _infoRequiredFromMessage = convertedMessage._particularInformationThatNeedsToBePassed;
            Debug.Log("Message passed : " + _infoRequiredFromMessage);

        }
    }
} 

public class TestMessage
{
    private string _messageString;
    private int _messageInt;
    public string _particularInformationThatNeedsToBePassed;
    public TestMessage(string messageString, int messageInt, string particularInformationThatNeedsToBePassed)
    {
        _messageString = messageString;
        _messageInt = messageInt;
        _particularInformationThatNeedsToBePassed = particularInformationThatNeedsToBePassed;
    }
    //messages should not have methods, so this is here for fun and testing.
    public void Execute()
    {
        Debug.Log("Desired Execution Method: \nThis is test message : " + _messageString + "\nThis is test int : " + _messageInt);
    }
} 

এগুলি প্রয়োজন সেটআপ। এখন আমরা সিস্টেমটি ব্যবহার করতে পারি (Followingক্যের জন্য অনুসরণ করা হয়)।

public class TestManager : MonoBehaviour
{

    // Use this for initialization
    void Start()
    {
        TestItem testItem = new TestItem();
        TestAttribute testAttribute = new TestAttribute(testItem);
        testItem.Components.Add(testAttribute);
        TestMessage testMessage = new TestMessage("my test message", 1, "VERYIMPORTANTINFO");
        testItem.ReceiveMessage(testMessage);
    }

}

এই টেস্ট ম্যানেজার স্ক্রিপ্টটি দৃশ্যের কোনও উপাদানগুলিতে সংযুক্ত করুন এবং আপনি ডিবাগে দেখতে পারেন যে বার্তাটি সফলভাবে পাস হয়েছে।


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

  • উপাদানগুলির তালিকা তৈরি করুন (যখন আইটেমটি ছিন্ন করা হয়, খেলোয়াড়কে কী জিনিস দেওয়া উচিত) দ্রষ্টব্য: আইটেমটি আইটেম টাইপ, আইটেম আইডি ইত্যাদি বাড়ানো উচিত
  • ইন রেজাল্টমোডিফায়ার (আপনি যদি একরকম ছিন্নমূল বৈশিষ্ট্য বাড়ানোর জন্য প্রয়োগ করেন তবে ছিন্নমূল হওয়ার পরে প্রাপ্ত উপাদানগুলি বাড়ানোর জন্য আপনি এখানে একটি int পাস করতে পারেন)
  • int ব্যর্থতা পরিবর্তন (যদি বিচ্ছিন্ন প্রক্রিয়াটির ব্যর্থতার সুযোগ থাকে)

প্রভৃতি

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



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

কীভাবে, ঠিক আপনার "বেসস্ট্যাট" ধারণাটি ক্র্যাফটেবল অস্ত্রগুলিকে বাদ দিতে পারে?
অ্যাটাকফর্ম

এটি প্রকৃতপক্ষে সংক্ষেপে আসে না তবে আমার মনের প্রসঙ্গে এটি খাপ খায় না। একটি কাঠজাতীয় রেসিপিটিতে বেসস্ট্যাট হিসাবে "উড", 2 এবং "আয়রন" 5 যুক্ত করা যায় যা তরোয়াল দেয় yield আমি মনে করি বেসস্ট্যাটের নামটি বেসএট্রিবিউটে পরিবর্তন করা এই প্রসঙ্গে আরও ভাল পরিবেশন করতে পারে। কিন্তু তবুও, সিস্টেমটি তার উদ্দেশ্যটি পরিবেশন করতে সক্ষম হবে না। 5 মিনিট - 50% আক্রমণ শক্তি সহ উপভোগ্য আইটেমটি সম্পর্কে ভাবেন। বেসস্ট্যাট হিসাবে কীভাবে এটি পাস করব? "পার্ক_আটাকপাওয়ার", ৫০ "এটি যদি পার্ক হয়, পূর্ণসংখ্যাকে শতাংশ হিসাবে বিবেচনা করে" এবং কয়েক মিনিটের তথ্য হারিয়ে না যায় তবে এটি সমাধান করা দরকার। আশা করি আপনি যা বলতে চাইছেন তা পেয়ে যাবেন।
বান্দার্থুল

দ্বিতীয় চিন্তাভাবনা অনুসারে অ্যাটাকফর্ম, এই "বেসস্ট্যাট" ধারণাটি কেবলমাত্র একটি ইন্ট্রের পরিবর্তে ইনটসের তালিকা রেখে বাড়ানো যেতে পারে। সুতরাং, উপভোগযোগ্য বাফের জন্য, আমি "অ্যাটাক" সরবরাহ করতে পারি, 50, 5, 1 এবং আইকনসাম্যাবল 3 টি পূর্ণসংখ্যার জন্য সন্ধান করতে হবে, 1. - মান, 2. - মিনিট, 3. - যদি এটি শতাংশ হয় বা না হয়। তবে অন্যান্য সিস্টেমগুলি প্রবেশের কারণে এবং কেবলমাত্র তাদের অন্তর্নিহিত ব্যাখ্যা করতে বাধ্য হওয়ায় এটি ইমপ্লান্ট বোধ করে।
Vandarthul

উত্তর:


6

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

আমি আরও ব্যাখ্যা করব:

প্রথমত, আপনি একটি ইন্টারফেস IItemএবং একটি ইন্টারফেস তৈরি করেন IComponent। আপনি যে আইটেমটি সংরক্ষণ করতে চান তা অবশ্যই উত্তরাধিকার সূত্রে পাওয়া উচিত IItemএবং আপনি যে আইটেমগুলিকে প্রভাবিত করতে চান সেগুলি অবশ্যই উত্তরাধিকার সূত্রে উত্তরাধিকার সূত্রে প্রাপ্ত হতে হবে IComponent

IItemউপাদানগুলির একটি অ্যারে এবং পরিচালনা করার জন্য একটি পদ্ধতি থাকবে IMessage। এই হ্যান্ডলিং পদ্ধতিটি কেবল সমস্ত সঞ্চিত উপাদানগুলিতে কোনও প্রাপ্ত বার্তা প্রেরণ করে। তারপরে, সেই প্রদত্ত বার্তায় আগ্রহী উপাদানগুলি সেই অনুযায়ী কাজ করবে এবং অন্যরা এটিকে উপেক্ষা করবে।

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

আমার এখানে মেসেজিং সহ একটি ইসিএসের প্রয়োগ রয়েছে , তবে এটি আইটেমগুলির পরিবর্তে সত্তার জন্য ব্যবহৃত হয় এবং এটি সি ++ ব্যবহার করে। যাই হোক, আমার মনে হয় এটা সাহায্য করতে পারেন যদি আপনি কটাক্ষপাত করা component.h, entity.hএবং messages.h। উন্নত করার জন্য অনেক কিছুই আছে তবে সাধারণ বিশ্ববিদ্যালয়টির কাজটি আমার পক্ষে কাজ করেছিল।

আশা করি এটা সাহায্য করবে.


আরে @ jjimenezg93, আপনার উত্তরের জন্য আপনাকে ধন্যবাদ। সুতরাং আপনি কী ব্যাখ্যা করেছেন তার একটি সাধারণ উদাহরণ সহকারে বিস্তারিতভাবে বর্ণনা করতে: আমরা একটি তরোয়াল চাই যা হ'ল: - বিযুক্তকরণযোগ্য [উপাদান] - স্ট্যাট মোডিফায়ার [উপাদান] - আপগ্রেডেবল [উপাদান] আমার ক্রিয়াগুলির একটি তালিকা রয়েছে যাতে সমস্ত জিনিস রয়েছে - ডিসিশেন্ট - মোডিফাইপ্যাট - আপগ্রেড করুন যখনই আইটেমটি এই বার্তাটি গ্রহণ করে, তার সমস্ত উপাদানগুলির মধ্যে দিয়ে যায় এবং এই বার্তাটি প্রেরণ করে, প্রতিটি উপাদান প্রদত্ত বার্তার সাথে কী করবে তা জানতে পারবে। তত্ত্বগতভাবে, এটিকে দুর্দান্ত বলে মনে হচ্ছে! আমি আপনার উদাহরণটি যাচাই করিনি তবে আমি করব, অনেক অনেক ধন্যবাদ!
বান্দার্থুল

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