কীভাবে পরিদর্শককে ক্ষেত্রটি দৃশ্যমান (সংযুক্তযোগ্য) তবে কোডের মাধ্যমে অ্যাক্সেসযোগ্য নয় (প্রাইভেট-লাইক)?


9

ধরা যাক আমার কাছে buttonটাইপের একটি ভেরিয়েবল রয়েছে Buttonযা অবশ্যই আছে System.Serializable

আমি চাই যে পরিদর্শকটি পরিদর্শকের মাধ্যমে নির্ধারিত হয়ে উঠুক, তাই আমি এটি তৈরি করেছি public:

public class SomeScript : MonoBehaviour{
    public Button button;
}

যা আমাকে দেয়:

এখানে চিত্র বর্ণনা লিখুন

এখন, আমি কোডটি পরিষ্কার ও সুরক্ষিত রাখতে চাই (সংগঠিত) এবং আমার এনক্যাপসুলেশন সংরক্ষণ করার প্রয়োজনের আসল কারণ রয়েছে।

আমি জানি যে রানটাইমের সময় উপাদান পুনরুদ্ধারের একাধিক উপায় রয়েছে transform.Find("Some/Genius/TypeUnsafe/Path")বা GameObject.Find("3 seconds scene iteration").GetComponent(...).আমি এড়াতে চাই।

আমি কীভাবে private accessএর সাথে public accessপরিদর্শকের সাথে কোনও ভেরিয়েবলের মিশ্রণ করব ?


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

হ্যাঁ, আমি জানি কী encapsulation জন্য! : ডিআই একটি বিশাল অ্যাপ্লিকেশন (আসলে একটি গেম ক্লায়েন্ট) এর জন্য এক ধরণের UI/ API MVC/ MVVMপ্যাটার্ন তৈরি করে এবং আমাকে এর থেকে আলাদা করতে UIহয়েছিল API। আমাকে সহজ পরিদর্শকের কারণে মান নির্ধারণ করা দরকার - অন্য কোনও উপায় নেই। Find()পদ্ধতিগুলি অনিরাপদ প্রকারের, এবং টেনে এনে ফেলে দিয়ে জিনিসগুলি একসাথে রাখা আরও সহজ। এটি সত্যই, একটি ক্লাসিক, ওওপি কাঠামো তৈরি করা সত্যিই শক্ত Unityএবং আপনাকে এই জাতীয় হ্যাকি জিনিসগুলির সন্ধান করতে হবে।
ইয়াকুব

মনে রাখবেন যে ব্যক্তিগত অন্য স্ক্রিপ্টগুলি থেকে ভেরিয়েবলকে সুরক্ষিত রাখে না। আপনি ক্যাব অ্যাকওয়েস প্রতিচ্ছবি বা কিছু পয়েন্টার ট্রিক্রি দিয়ে এটি পৌঁছেছেন
বিলিন্ট

উত্তর:


19

আপনি সিরিয়ালাইজফিল্ড অ্যাট্রিবিউট সন্ধান করছেন

ডক্স থেকে:

একটি fieldক্যকে একটি ব্যক্তিগত ক্ষেত্রকে সিরিয়াল করতে বাধ্য করুন।

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

আপনার কোডটি এর পরে দেখতে হবে:

public class SomeScript : MonoBehaviour{
    [SerializeField]
    private Button button;
}

6
পঠনযোগ্যতার জন্য আমি সাধারণত এটি সমস্ত এক লাইনে লিখি: [SerializeField] private Button button; যখন এক সারিতে একাধিক ক্ষেত্র থাকে তখন স্ক্যান করা আমার পক্ষে সহজ। এছাড়াও, "আপনার প্রায় কোনও প্রয়োজন হবে না" এর জন্য ডকগুলি স্ক্রু করুন; আমি পুরোপুরি এই সব সময় না।
ঝকঝকে

1

ভেরিয়েবলের আগে সিরিয়ালাইজফিল্ড বৈশিষ্ট্য যুক্ত করে আপনি আপনার ব্যক্তিগত ভেরিয়েবলটি প্রদর্শন করতে পারেন । এটার মতো কিছু

[SerializeField]
private Button button;

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

[HideInInspector]
public Button button;

আপনার উপরের পরিবর্তনশীলটি আপনার অন্যান্য স্ক্রিপ্টের মাধ্যমে অ্যাক্সেসযোগ্য হবে তবে এটি পরিদর্শকের কাছে প্রদর্শিত হবে না।

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