دوره زبان تخصصی برای برنامه‌نویسان (هدیه ویژه ثبت‌نام در دوره‌های متخصص) (فرصت محدود ⏰)
۰ ثانیه
۰ دقیقه
۰ ساعت
۱ راضیه کارگر
نکته آموزشی در unity 2022 برای دسترسی به Text
محسن موحد حل شده توسط محسن موحد

در یونیتی ورژه 2022 با توجه به اینکه برای اضافه کردن متن از Text-Text Mesh Pro استفاده می‌کنید برای دسترسی به این متن در کد نویسی #C باید کامپونتت را به جای تبدیل به Text به TextMeshProUGUI  تبدیل کنید تا کد خطای Null Reference ندهد.

public void SetKeyWord()
   {             
        GameObject.Find("GC").GetComponent<GC> ().SetKeyWords
        (
        		transform.GetChild(0).GetComponent<TextMeshProUGUI>().text
        );
   }

سلام،

بله نکته خوبی رو فرمودید که به شکل زیر میشه نوشت:

public void SetKeyWord()
{             
    GameObject.Find("GC").GetComponent().SetKeyWords
    (
        transform.GetChild(0).GetComponent().text
    );
}

 

چند نکته دیگه هم من اضافه میکنم:

اطمینان از وجود Object: همیشه مطمئن شو که Objectهایی که می‌خوای بهشون دسترسی پیدا کنی، در صحنه وجود دارن و به درستی نامگذاری شدن. استفاده از GameObject.Find ممکنه مشکلاتی ایجاد کنه، چون اگه اسم Object اشتباه باشه یا Object وجود نداشته باشه، کدت کار نمیکنه.

به جای GameObject.Find میتونی از یک Reference مستقیم استفاده کنی که در Inspector ست شده:

public TextMeshProUGUI myText;
void Start()
{
    myText = GameObject.Find("YourTextObjectName").GetComponent();
}
public void SetKeyWord()
{             
    GameObject.Find("GC").GetComponent().SetKeyWords(myText.text);
}

استفاده از Cached References: بهتره که به جای استفاده مکرر از GameObject.Find، یک Reference به Object یا Component مورد نظر رو Cache کنی. این کار باعث افزایش عملکرد و جلوگیری از خطاهای احتمالی میشه.

public class YourClass : MonoBehaviour
{
    private TextMeshProUGUI myText;
    private YourComponent gcComponent;
    void Start()
    {
        myText = transform.GetChild(0).GetComponent();
        gcComponent = GameObject.Find("GC").GetComponent();
    }
    public void SetKeyWord()
    {             
        gcComponent.SetKeyWords(myText.text);
    }
}

بررسی Null بودن: همیشه قبل از استفاده از Componentها، بررسی کن که Null نباشن تا از بروز خطاهای ناخواسته جلوگیری کنی.

if (myText != null && gcComponent != null)
{
    gcComponent.SetKeyWords(myText.text);
}
else
{
    Debug.LogError("Reference is missing!");
}

استفاده از [SerializeField]: اگر بخوای متغیری رو در Inspector مشاهده و تنظیم کنی، اما private نگهش داری، میتونی از این ویژگی استفاده کنی:

[SerializeField] private TextMeshProUGUI myText;

استفاده از GetComponent() در Start(): اگر از یک کامپوننت در طول عمر اسکریپت بارها استفاده میکنی، بهتره تو Start() ذخیره بشه:

private Rigidbody rb;
void Start()
{
    rb = GetComponent();
}

استفاده از ترای-کچ برای خطایابی: در جاهایی که احتمال بروز خطا وجود دارد، از بلوک try-catch استفاده کن:

try
{
    gcComponent.SetKeyWords(myText.text);
}
catch (System.Exception e)
{
    Debug.LogError($"An error occurred: {e.Message}");
}

 

برآیند نکات بالا، کد زیر خواهد بود:

using UnityEngine;
using TMPro;
public class YourClass : MonoBehaviour
{
    [SerializeField] private TextMeshProUGUI myText;
    private YourComponent gcComponent;
    void Start()
    {
        if (myText == null)
        {
            Debug.LogError("Reference to TextMeshProUGUI is missing!");
            return;
        }
        gcComponent = GameObject.Find("GC")?.GetComponent();
        if (gcComponent == null)
        {
            Debug.LogError("Reference to YourComponent is missing or not found!");
        }
    }
    public void SetKeyWord()
    {
        if (myText != null && gcComponent != null)
        {
            try
            {
                gcComponent.SetKeyWords(myText.text);
            }
            catch (System.Exception e)
            {
                Debug.LogError($"An error occurred: {e.Message}");
            }
        }
        else
        {
            Debug.LogError("References are missing!");
        }
    }
}
بهترین پاسخ
محسن موحد ۲۳ تیر ۱۴۰۳، ۱۶:۵۸