কোন গেমবজেক্টের সংঘর্ষটি পরিচালনা করা উচিত তা কীভাবে সিদ্ধান্ত নেওয়া যায়?


28

যে কোনও সংঘর্ষে, দুটি গেম অবজেক্টস এখনই জড়িত? আমি যা জানতে চাই তা হল, আমি কীভাবে সিদ্ধান্ত নেব যে কোন বস্তুতে আমার থাকা উচিত OnCollision*?

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

OnCollisionEnter(Collision coll) {
    if (coll.gameObject.compareTag("Spike")) {
        Destroy(gameObject);
    }
}

অবশ্যই স্পাইক অবজেক্টে স্ক্রিপ্ট থাকার পরিবর্তে ঠিক একই কার্যকারিতা অর্জন করা যেতে পারে যার মধ্যে এই জাতীয় কোড রয়েছে:

OnCollisionEnter(Collision coll) {
    if (coll.gameObject.compareTag("Player")) {
        Destroy(coll.gameObject);
    }
}

উভয়ই বৈধ হলেও, প্লেয়ারটিতে আমার কাছে স্ক্রিপ্টটি থাকা আমার কাছে আরও বেশি বোঝা যায় কারণ এই ক্ষেত্রে যখন সংঘর্ষ হয় তখন প্লেয়ারটিতে একটি ক্রিয়া সম্পাদন করা হয় ।

যাইহোক, যা আমাকে সন্দেহ করে তোলে তা হ'ল ভবিষ্যতে আপনি প্লেয়ারকে সংঘর্ষের সময় মেরে ফেলবেন এমন আরও কিছু বস্তু যুক্ত করতে চাইতে পারেন, যেমন একটি শত্রু, লাভা, লেজার বিম ইত্যাদি These সুতরাং প্লেয়ারের স্ক্রিপ্টটি হয়ে উঠবে:

OnCollisionEnter(Collision coll) {
    GameObject other = coll.gameObject;
    if (other.compareTag("Spike") || other.compareTag("Lava") || other.compareTag("Enemy")) {
        Destroy(gameObject);
    }
}

স্ক্রিপ্টটি স্পাইকে ছিল এমন ক্ষেত্রে, আপনাকে যা করতে হবে তা হ'ল অন্যান্য স্ক্রিনে একই স্ক্রিপ্টটি যুক্ত করা যা প্লেয়ারকে মেরে ফেলতে পারে এবং স্ক্রিপ্টটির নামকরণের মতো কিছু করতে পারে KillPlayerOnContact

এছাড়াও, যদি আপনার প্লেয়ার এবং শত্রুদের মধ্যে সংঘর্ষ হয় তবে আপনি সম্ভবত উভয়কেই একটি ক্রিয়া করতে চান । সুতরাং যে ক্ষেত্রে, কোন বস্তুর সংঘর্ষ পরিচালনা করা উচিত? অথবা উভয়কেই সংঘর্ষ পরিচালনা করতে হবে এবং বিভিন্ন ক্রিয়া করা উচিত?

আমি এর আগে কখনও কোনও যুক্তিসঙ্গত আকারের গেমটি তৈরি করিনি এবং আমি ভাবছি যে কোডটি যদি অদৃশ্য হয়ে যায় এবং এটি শুরুতে আপনি যদি এই ধরণের জিনিস ভুল পেয়ে যান তবে এটি বজায় রাখা শক্ত হয়ে যেতে পারে কিনা wond বা সম্ভবত সমস্ত উপায় বৈধ এবং এটি আসলেই কিছু যায় আসে না?


কোন অন্তর্দৃষ্টি অনেক প্রশংসা করা হয়! সময় দেয়ার জন্য ধন্যবাদ :)


প্রথম কেন স্ট্রিং ট্যাগগুলির জন্য? একটি এনাম আরও ভাল কারণ একটি টাইপো ত্রুটি নিরীক্ষণের জন্য শক্ত করার পরিবর্তে একটি সংকলন ত্রুটিতে পরিণত হবে (কেন আমার স্পাইক আমাকে হত্যা করছে না?)।
রাচেট ফ্রিক

কারণ আমি ইউনিটির টিউটোরিয়াল অনুসরণ করেছি এবং তারা এগুলি করেছে। তাহলে, আপনি কি ট্যাগ নামে একটি সর্বজনীন এনাম পাবেন যাতে আপনার সমস্ত ট্যাগ মান রয়েছে? সুতরাং এটি Tag.SPIKEপরিবর্তে হবে?
রেড্টামা

উভয় পৃথিবীর সেরাটি পেতে, একটি স্ট্রাক ব্যবহার করে বিবেচনা করুন ভিতরে একটি এনাম, পাশাপাশি স্ট্যাটিক টোস্ট্রিং এবং ফরো স্ট্রিং পদ্ধতিগুলি
zcabjro

খুব সম্পর্কিত: ওওপিতে শূন্য আচরণের বিষয়গুলি - আমার নকশা দ্বিধা এবং এরিক লিপার্টের উইজার্ডস এবং ওয়ারিয়র্স সিরিজ: ericlippert.com/2015/04/27/wizards-and-warriors-part-one

উত্তর:


48

আমি ব্যক্তিগতভাবে যেমন যে স্থপতি সিস্টেম পছন্দ তন্ন তন্ন বস্তু একটি সংঘর্ষের হ্যান্ডলগুলি জড়িত এটা এবং এর পরিবর্তে কিছু সংঘর্ষের-হ্যান্ডলিং প্রক্সি মত একটি কলব্যাক সঙ্গে এটি পরিচালনা পায় HandleCollisionBetween(GameObject A, GameObject B)। কোন যুক্তিতে কোথায় থাকতে হবে সে সম্পর্কে আমাকে ভাবতে হবে না।

যদি এটি কোনও বিকল্প না হয়, যেমন আপনি যখন সংঘর্ষ-প্রতিক্রিয়া আর্কিটেকচারের নিয়ন্ত্রণে নন, জিনিসগুলি কিছুটা अस्पष्ट হয়ে যায়। সাধারণত উত্তরটি "এটি নির্ভর করে"।

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

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

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


1
আমি প্রত্যেকের উত্তরগুলি সত্যই সহায়ক বলে খুঁজে পেয়েছি তবে তার স্পষ্টতার জন্য আপনার গ্রহণ করতে হবে। আপনার শেষ অনুচ্ছেদটি সত্যিই আমার জন্য এটির যোগস্বরূপ :) অত্যন্ত সহায়ক! তোমাকে অনেক ধন্যবাদ!
রেডটমা

12

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

বিস্তারিত :

দেখা যাক ...

গেম ইঞ্জিন নির্বিশেষে আমার যখন একই সন্দেহ হয় তখন আমার দৃষ্টিভঙ্গিটি নির্ধারণ করা হয় যে আমি কোন ক্রিয়াকলাপটি সংগ্রহ করতে চাই এবং যে আচরণটি সক্রিয় করতে চাই সে সম্পর্কে কোন আচরণটি সক্রিয় এবং কোন আচরণটি প্যাসিভ

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

এটি কেবল আমার মতামত: ট্যাগের উপর নির্ভর করে যুক্তি সম্পাদন করা এড়িয়ে চলুন, তবে এর পরিবর্তে এনামগুলির মতো বিভিন্ন আচরণ এবং মান ব্যবহার করুন

এই আচরণগুলি কল্পনা করুন:

  1. মাটিতে স্ট্যাক হিসাবে কোনও বস্তু নির্দিষ্ট করার আচরণ। আরপিজি গেমগুলি গ্রাউন্ডে থাকা আইটেমগুলির জন্য এটি ব্যবহার করতে সক্ষম।

    public class Treasure : MonoBehaviour {
        public InventoryObject inventoryObject = null;
        public uint amount = 1;
    }
  2. ক্ষতি উত্পাদন করতে সক্ষম কোনও বস্তু নির্দিষ্ট করার আচরণ। এটি লাভা, অ্যাসিড, কোনও বিষাক্ত পদার্থ বা একটি উড়ন্ত অনুমান হতে পারে।

    public class DamageDealer : MonoBehaviour {
        public Faction facton; //let's use it as well..
        public DamageType damageType = DamageType.BLUNT;
        public uint damage = 1;
    }

এই পরিমাণে, enums হিসাবে বিবেচনা করুন DamageTypeএবং InventoryObject

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

তার জন্য আমাদের সক্রিয় আচরণ প্রয়োজন । অংশগুলি হ'ল:

  1. ক্ষতি গ্রহণের জন্য একটি আচরণ (এটি জীবন ও মৃত্যু সামলানোর জন্য একটি আচরণের প্রয়োজন, যেহেতু জীবন হ্রাস করা এবং ক্ষতি প্রাপ্তি সাধারণত পৃথক আচরণ এবং কারণ আমি এই উদাহরণগুলিকে যথাসম্ভব সহজ রাখতে চাই) এবং সম্ভবত ক্ষতি প্রতিরোধ করতে চাই

    public class DamageReceiver : MonoBehaviour {
        public DamageType[] weakness;
        public DamageType[] halfResistance;
        public DamageType[] fullResistance;
        public Faction facton; //let's use it as well..
    
        private List<DamageDealer> dealers = new List<DamageDealer>(); 
    
        public void OnCollisionEnter(Collision col) {
            DamageDealer dealer = col.gameObject.GetComponent<DamageDealer>();
            if (dealer != null && !this.dealers.Contains(dealer)) {
                this.dealers.Add(dealer);
            }
        }
    
        public void OnCollisionLeave(Collision col) {
            DamageDealer dealer = col.gameObject.GetComponent<DamageDealer>();
            if (dealer != null && this.dealers.Contains(dealer)) {
                this.dealers.Remove(dealer);
            }
        }
    
        public void Update() {
            // actually, this should not run on EVERY iteration, but this is just an example
            foreach (DamageDealer element in this.dealers)
            {
                if (this.faction != element.faction) {
                    if (this.weakness.Contains(element)) {
                        this.SubtractLives(2 * element.damage);
                    } else if (this.halfResistance.Contains(element)) {
                        this.SubtractLives(0.5 * element.damage);
                    } else if (!this.fullResistance.Contains(element)) {
                        this.SubtractLives(element.damage);
                    }
                }
            }
        }
    
        private void SubtractLives(uint lives) {
            // implement it later
        }
    }

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

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

    public class Inventory : MonoBehaviour {
        private Dictionary<InventoryObject, uint> = new Dictionary<InventoryObject, uint>();
        private List<Treasure> pickables = new List<Treasure>();
    
        public void OnCollisionEnter(Collision col) {
            Treasure treasure = col.gameObject.GetComponent<Treasure>();
            if (treasure != null && !this.pickables.Contains(treasure)) {
                this.pickables.Add(treasure);
            }
        }
    
        public void OnCollisionLeave(Collision col) {
            DamageDealer treasure = col.gameObject.GetComponent<DamageDealer>();
            if (treasure != null && this.pickables.Contains(treasure)) {
                this.pickables.Remove(treasure);
            }
        }
    
        public void Update() {
            // when certain key is pressed, pick all the objects and add them to the inventory if you have a free slot for them. also remove them from the ground.
        }
    }

7

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

আমার প্রস্তাবনাটি হ'ল আপনার গেমটি বাড়ানোর সাথে সাথে বৈশিষ্ট্যগুলিতে যুক্ত হওয়া এবং পুনরাবৃত্ত হওয়ার সাথে সাথে আপনার দৃষ্টিভঙ্গিটি কীভাবে স্কেল হবে তা বিবেচনা করে। সংঘর্ষের হ্যান্ডলিংয়ের যুক্তিটিকে এক জায়গায় রাখলে কি আরও জটিল কোড পরে যাবে? বা এটি আরও মডুলার আচরণ সমর্থন করে?

সুতরাং, আপনার কাছে এমন স্পাইক রয়েছে যা প্লেয়ারকে ক্ষতি করে। নিজেকে জিজ্ঞাসা করুন:

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

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

এই উদাহরণস্বরূপ, ইউনিটি বিশেষভাবে, আমার নির্বাণ দিকে চর্বিহীন চাই ক্ষতি-আচরণ যুক্তিবিজ্ঞান স্পাইক মধ্যে একটি ভালো কিছু আকারে, CollisionHazardকম্পোনেন্ট, যা সংঘর্ষের উপর একটি কল ক্ষতি-গ্রহণের একটি পদ্ধতি Damageableঅংশটি। কারণটা এখানে:

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

আইটিএস এর মতো এড়াতে সত্তা-উপাদান উপাদান উপস্থিত থাকে। এই আইএফগুলি সর্বদা ভুল (কেবল সেই আইএফএস)। অতিরিক্তভাবে যদি স্পাইকটি চলমান হয় (বা একটি প্রক্ষিপ্ত), সংঘর্ষক হ্যান্ডলারটি প্লেয়ারের সাথে সংঘর্ষক হওয়া বা না থাকা সত্ত্বেও সংঘর্ষ হ্যান্ডলারটি ট্রিগার হবে।
লুইস মাসুয়েলি

2

এই সংঘর্ষটি কে পরিচালনা করে তা আসলেই গুরুত্বপূর্ণ নয়, তবে এটি কার কাজের সাথে সামঞ্জস্য বজায় রাখে।

আমার গেমগুলিতে, আমি GameObjectসংঘর্ষটি নিয়ন্ত্রণকারী হিসাবে অন্য বিষয়টিকে "কাজ" করার চেষ্টা করি । আইই স্পাইক প্লেয়ারকে ক্ষতি করে তাই এটি সংঘর্ষটি পরিচালনা করে। যখন উভয় বস্তু একে অপরের সাথে "কিছু" করে, তাদের প্রতিটিকে অন্য বস্তুর উপর তাদের ক্রিয়া পরিচালনা করতে দিন।

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

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

public abstract class DamageController
{
    public Faction faction; //GOOD or BAD
    public abstract void ApplyDamage(float damage);
}

DamageControllerক্ষতিটিকে সামলানোর জন্য আপনি আপনার প্লেয়ার গেম অবজেক্টে সাবক্লাস করতে পারেন , তারপরে Spikeসংঘর্ষের কোডে

OnCollisionEnter(Collision coll) {
    DamageController controller = coll.gameObject.GetComponent<DamageController>();
    if(controller){
        if(controller.faction == Faction.GOOD){
          controller.ApplyDamage(spikeDamage);
        }
    }
}

2

আমি যখন শুরু করেছি তখন আমার একই সমস্যা ছিল তাই এখানে চলে যায়: এই বিশেষ ক্ষেত্রে শত্রুটি ব্যবহার করুন। আপনি সাধারণত সংঘর্ষটি ऑब्जेक्ट দ্বারা পরিচালিত যে ক্রিয়াটি সম্পাদন করে তা চান (এই ক্ষেত্রে - শত্রু, তবে যদি আপনার খেলোয়াড়ের কাছে একটি অস্ত্র থাকে তবে অস্ত্রটি সংঘর্ষটি সামলানো উচিত), কারণ আপনি যদি বৈশিষ্ট্যগুলিকে টুইঙ্ক করতে চান (উদাহরণস্বরূপ ক্ষতি শত্রুর) আপনি অবশ্যই এনিমিস্ক্রিপ্টে এটি পরিবর্তন করতে চান এবং প্লেস্ক্রিপ্টে নয় (বিশেষত আপনার যদি একাধিক খেলোয়াড় থাকে)। একইভাবে আপনি যদি প্লেয়ারটি ব্যবহার করেন এমন কোনও অস্ত্রের ক্ষতি পরিবর্তন করতে চান তবে আপনি অবশ্যই এটি আপনার গেমের প্রতিটি শত্রুতে পরিবর্তন করতে চান না।


2

উভয় বস্তু সংঘর্ষ পরিচালনা করবে।

কিছু বস্তু সংঘর্ষের সাথে সাথে অবিলম্বে বিকৃত, ভাঙ্গা বা ধ্বংস হয়ে যাবে। (বুলেট, তীর, জলের বেলুন)

অন্যরা কেবল বাউন্স করে পাশের দিকে ঘুরত। (শিলা) তারা আঘাত করা জিনিসটি যথেষ্ট শক্ত হলে এগুলি এখনও ক্ষতি করতে পারে। রকগুলি তাদের আঘাত করার কোনও ক্ষতি থেকে ক্ষতি করে না, তবে তারা একটি স্লেজ হাতুড়ি থেকে হতে পারে।

মানুষের মতো কিছু স্কুইশি অবজেক্ট ক্ষতিগ্রস্ত করবে।

অন্যরা একে অপরের সাথে আবদ্ধ থাকতেন। (চুম্বক)

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

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

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

আপনার গেম ইঞ্জিনটি তখন ইন্টারফেসের বিরুদ্ধে কোড দেয়, নির্দিষ্ট বস্তুর ধরণের নয়।

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