Ityক্য: প্যারেন্ট স্ক্রিপ্ট থেকে শিশু অবজেক্টে সংঘর্ষের ঘটনা কীভাবে সনাক্ত করা যায়?


12

আমি এই কাঠামো সহ একটি শত্রু

  • শত্রু
    • শরীর
      • মাথা
      • বাহু বাম
      • বাহু ঠিক আছে

ইত্যাদি।

আমার শরীরের প্রতিটি অংশের জন্য একটি সংঘর্ষকারীও রয়েছে। আমার "শত্রু" অবজেক্টে আমি একটি স্ক্রিপ্ট সংযুক্ত করেছি এবং সেই স্ক্রিপ্টে আমি শরীর, মাথা, বাহু, বাম ইত্যাদির জন্য সম্ভাব্য সংঘর্ষ (বুলেট) বাধা দিতে চাই would

এই কাজ করতে একটি উপায় আছে কি?

উত্তর:


16

আপনি যদি কোনও চরিত্রের সাথে কোনও রিজিডবডি ব্যবহার করেন তবে আপনি এটিকে বাক্স থেকে বের করতে পারেন। :)

সুতরাং আপনার শ্রেণিবিন্যাসটি দেখতে দেখতে পারে:

  • চরিত্রের (রিজিডবডি এবং নিয়ন্ত্রণ স্ক্রিপ্ট রয়েছে)
    • শিশু (সম্ভবত সংঘর্ষকারীদের থাকতে পারে)
      • নাতি (সম্ভবত সংঘর্ষকারীদের থাকতে পারে)

অনকোলিজইন্টর বার্তাগুলি রিগিডোডিযুক্ত গেমঅবজেক্টটিতে আগমন করবে এবং প্রতিটি সংঘর্ষককে আটকে রাখতে অতিরিক্ত রিলে স্ক্রিপ্ট লেখার প্রয়োজন ছাড়াই আপনার প্যারেন্ট কন্ট্রোল স্ক্রিপ্টে পৌঁছে যাবে।

আপনার যদি কোন সন্তানের সংঘর্ষের সাথে জড়িতদের খুঁজে বের করতে হয় তবে আপনি এটি এর মতো করতে পারেন:

void OnCollisionEnter(Collision collision) {
    Collider myCollider = collision.contacts[0].thisCollider;
    // Now do whatever you need with myCollider.
    // (If multiple colliders were involved in the collision, 
    // you can find them all by iterating through the contacts)
}

5

এর সমাধানের একটি উপায় দুটি স্ক্রিপ্ট হতে হবে: একটি শত্রু অবজেক্টের জন্য এবং অন্যটি সন্তানের জন্য (যে আপনাকে শত্রু অবজেক্টের বাচ্চাদের অর্পণ করতে হবে)

মূল স্ক্রিপ্ট

using UnityEngine;

 public class ParentScript : MonoBehaviour 
 {
     public void CollisionDetected(ChildScript childScript)
     {
         Debug.Log("child collided");
     } 
 }

চাইল্ড স্ক্রিপ্ট

using UnityEngine;

public class ChildScript : MonoBehaviour 
{
     void OnCollisionEnter(Collision collision)
     {
         transform.parent.GetComponent<ParentScript>().CollisionDetected(this);
     }
 }

যখনই কোনও সন্তানের সংঘর্ষ হয় তখন আপনাকে এইভাবে অবহিত করা উচিত


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

2

আপনি কেবল বাচ্চাদের উপরে শীর্ষ বস্তুটি পাস করতে পারেন এবং এটিতে সরাসরি কোনও ফাংশন কল করতে পারেন। এটি গ্যারান্টি দেয় যে আপনাকে পিতামাতার প্রচারের উপর নির্ভর করতে হবে না। সুতরাং আপনি মূর্খ জিনিস যেমন শেষ নাtransform.parent.parent

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

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


1

Ityক্য উত্তরগুলির প্রত্যক্ষ উক্তি ( আশীষ দ্বিবেদী লিখেছেন ):

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


1

আপনি সংঘর্ষের উপর একটি চেক সম্পাদন করতে পারেন এবং দেখুন যেটি হিট বক্সটি আঘাত পেয়েছিল এবং প্রয়োজনে প্রভাবের দিকটিও পেতে পারে।

দ্রষ্টব্য: অনমনীয় ব্যক্তিকে একই বস্তুর উপরে স্থাপন করা হয়েছে যা সংঘর্ষের চেক স্ক্রিপ্ট রয়েছে।

এই উদাহরণটি কোন টার্গেটে 'প্রক্ষিপ্ত' হিটবক্সটি হিট করছে তা পরীক্ষা করে দেখছে।

private void OnCollisionEnter(Collision collision)
{                 
    if (collision.contacts[0].otherCollider.transform.gameObject.name == "HeadShot")                
       //DO STUFF            

    if (collision.contacts[0].otherCollider.transform.gameObject.name == "BodyShot")
       //DO STUFF    
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.