درود مهمان گرامی! ثبت نام

امتیاز موضوع:
  • 0 رأی - میانگین امتیازات: 0
  • 1
  • 2
  • 3
  • 4
  • 5
کد های سی شارپ درست عمل نمیکنند .
#1
Question 
سلام 
مشکل من اینه که بعضی وقتها کد های سی شارپ درست کار نمیکنند . مثلا کد های مربوط به تاچ شدن گیم آبجکت . مسئله اینه که من این کد ها رو از یک صحنه دیگه و اسکریپت دیگه کپی میکنم و فقط اسم گیم آبجکت رو تغییر میدم اما باز کار نمیکنند . گاهی دوباره کپی پیست میکنم یا جای کد رو تغییر میدم و درست میشن و گاهی هم نه . آیا قلق خاصی داره  ؟
با تشکر
پاسخ
#2
سلام،
آبجکت ها کامپوننت هاشون مثل همن؟ مثلا آبجکت دومی colider داره؟
کیــــــــــ qwerty13 ـــــــوورتی13
پاسخ
 سپاس شده توسط start777
#3
[quote pid='143427' dateline='1556554378']
qwerty13 نوشته است:سلام،
آبجکت ها کامپوننت هاشون مثل همن؟ مثلا آبجکت دومی colider داره؟

[/quote]

کد:
void bb () {

if (score02 == 3) {

a.SetActive (false);
b.SetActive (true);
totalscored03 += 10;    
levelscored03 += 1;
getpoint.Play ();
}
if (score02 == 6) {

a.SetActive (false);
b.SetActive (true);
totalscored03 += 10;    
levelscored03 += 1;
getpoint.Play ();
}

نقل قول: بله کلایدر دارند . مثلا یک مورد عجیبش مورد بالاست که گیم آبجکت سر یک زمان مشخص روی صفحه ظاهر میشه و اگر بازیکن سه بار روش کلیک کنه اتفاقات بالا میوفته و همین گیم آبجکت چند ثانیه بعد دوباره روی صفحه ظاهر میشه و اگر بازیکن سه بار دیگه روش کلیک کنه باز همون اتفاقات باید بیوفته . برای بار اول مشکلی نیست اما بار دوم یعنی وقتی score02 == 6 میشه هیچ اتفاقی نمیوفته و کد عمل نمیکنه !
درصورتی که همین کد در یک اسکریپت دیگه در همین بازی ( در واقع در یک مرحله قبل ) داره کار میکنه !
با تشکر
پاسخ
#4
به نظرم اول با Debug.log مقدار متغیرتون رو در جاهای مختلف اندازه گیری کنید. معمولا خیلی کارسازه.
کیــــــــــ qwerty13 ـــــــوورتی13
پاسخ
 سپاس شده توسط start777
#5
فکر کنم فهمیدم مشکل چیه . یک متد هست که وقتی اجرا میشه اجازه نمیده متد های بعدی اجرا بشن . و این ارور رو میده 

type 'GameObject' has been destroyed but you are still trying to access it.

Your script should either check if it is null or you should not destroy the object.

 من وقتی میخوام در درون یک متد ، متد دیگه ای صدا بزنم از کد زیر استفاده میکنم .

کد:
void Update ()
    {
        
        if (starta == 1) {
            act02 ();
        }

حالا اگر بخوام . از درون یک متد ، یک متد دیگر رو غیر فعال کنم باید چکار کنم . فرض کنید میخوام بعد از اینکه starta == 1  شد  act02 غیر فعال بشه .
با تشکر
پاسخ
#6
منظورتون از غیر فعال شدن چیه؟
اگه منظرتون رو درست متوجه شده باشم(تاکید میکنم اگه) شما یسری مفاهیم پایه ای رو توی برنامه نویسی اشتباه متوجه شدین
پس اگه مشکل همین باشه یه توضیح کوچیکی میدم ولی بهش بسنده نکنین و اگه دیدین مشکل از همینه خودتون برای درک کامل ترش پیگیرش باشین
کدهایی که داخل سی شارپ و اکثر زبان های برنامه نویسی(یسری استثنا وجود داره) مینویسین در حالت عادی(فعلا با برنامه نویسی موازی و multi thread و اینا حرف نمیزنم)
بصورت sequential اجرا میشن به این معنی که خط به خط و پشت سر هم کدها اجرا میشن
برای درک فراخوانی تابع ها فرض کنین یک stack داریم
stack مثل آجرهایی میمونه که روی هم دیگه قرار دارن هر آجر که آخر سر بالاتر از همه قرار میدین اولین آجریه که بهش دسترسی دارین
برای دسترسی به آجرهای پایین تر باید آجرهای بالاترش برداشته شه
اینجا هم توابع داخل یک stack قرار می گیرن
به این صورت که فرض کنین func1 در حال اجراست تا خط 15 بصورت پشت سر هم اجرا میشه و func2 رو در خط 15 صدا میزنه func2 در stack روی func1 قرار می گیره و از خط اولش شروع به اجرا میشه تا به اتمام برسه سپس از stack خارج میشه و پردازشگر به ادامه ی کار fucn1 می پردازه از خط 16 می پردازه
خب حالا اینجا توی این کیس چه اتفاقی میفته شما یه تابع رو صدا میزنین که یه مشکلی داره و باعث میشه خطای 
type 'GameObject' has been destroyed but you are still trying to access it.

Your script should either check if it is null or you should not destroy the object.
رو دریافت کنین بعد از اینکه با این خطا برخورد کرد چون exception handling انجام نشده کل stack رو خالی میکنه و دیگه به ادامه ی اجرا نمیپردازه
برای حل کردنش یا باید به سراغ اون تابع برین و مشکلش رو حل کنین
و اگه مشکلش جوریه که به هردلیلی براحتی حل نمیشه و پیش اومدنش از نظر شما توی ادامه ی کار توابع و دستورات دیگه تاثیری نداره میتونین با exception handling کاری کنین که بعد از برخورد به این مشکل ادامه ی دستورات اجرا شه
هفت شهر عشق را عطار گشت / ما هنوز اندر خم یک کوچه ایم
پاسخ
 سپاس شده توسط start777
#7
سلام و بسیار ممنون از وقتی که گذاشتید و توضیحات عالی که دادید .
راستش من خطا رو رفع کردم و مشکل حل شد ولی باز هم میخوام این موضوع رو یاد بگیرم که چطور func2 رو که صدا کردم تا اجرا بشه ، متوقفش کنم ؟
من با این دستور اجراش کردم یعنی بقول شما هنگام اجرای خط 2 صداش کردم تا اجرا بشه : 
کد:
void Update ()
   {
       
       if (starta == 1) {
           act02 ();
       }

حالا این دستور در void update داره در هر فریم اجرا میشه . حالا چطور میتونم در خط 3 کاری کنم که همون func2  که در اسکریپت من act02  نامگذاری شده متوقف بشه ؟

با تشکر
پاسخ
#8
(13/2/1398، 01:56 عصر)start777 نوشته است: سلام و بسیار ممنون از وقتی که گذاشتید و توضیحات عالی که دادید .
راستش من خطا رو رفع کردم و مشکل حل شد ولی باز هم میخوام این موضوع رو یاد بگیرم که چطور func2 رو که صدا کردم تا اجرا بشه ، متوقفش کنم ؟
من با این دستور اجراش کردم یعنی بقول شما هنگام اجرای خط 2 صداش کردم تا اجرا بشه : 
کد:
void Update ()
   {
       
       if (starta == 1) {
           act02 ();
       }

حالا این دستور در void update داره در هر فریم اجرا میشه . حالا چطور میتونم در خط 3 کاری کنم که همون func2  که در اسکریپت من act02  نامگذاری شده متوقف بشه ؟

با تشکر

شما وقتی داخل اسکوپ update چیزی مینویسین توی یک ثانیه بارها اون دستور اجرا میشه
همینطور وقتی این تابع act02 رو فراخوانی میکنین این تابع توی ثانیه با توجه به رفرش ریت بازی بارها اجرا میشه
اگه میخواین از یک جایی به بعد اجرا نشه میتونین برای اجراش شرط خاصی بذارین
مثلا یک boolean تعریف کنین که در صورتی که مقدارش true بود این تابع فراخوانی شه
حالا هر موقع که خواستین میتونین با false کردن مقدار این متغییر از فراخوانی این تابع جلوگیری کنین

اگر هم منظورتون از توقف اینه که فراخوانیش کنین ولی اگه اجرای تابع خطا داشت و به مشکل خورد متوقف بشه و برای ادامه ی دستورات هم مشکلی ایجاد نکنه میتونین از روش زیر استفاده کنین
کد:
void Update()
   {
       try
       {
           if (starta == 1)
           {
               act02();
           }
       }
       catch (System.Exception _exception)
       {
           print(_exception.Message);
       }
   }

حالا در صورت پیش اومدن خطا تنها اتفاقی که میفته اینه خطا تو کنسول برات چاپ میشه
هفت شهر عشق را عطار گشت / ما هنوز اندر خم یک کوچه ایم
پاسخ
 سپاس شده توسط start777


موضوعات مرتبط با این موضوع...
موضوع نویسنده پاسخ بازدید آخرین ارسال
Question چجوری کد دشمن یا دوست رو تو یه سی شارپ بنویسم؟ A Person 2 47 9/6/1398، 02:12 صبح
آخرین ارسال: aminblog76
Sad یونیتی 2018 ..مشکل سی شارپ single-boy 2 877 12/3/1397، 10:08 عصر
آخرین ارسال: aminblog76
Question سی شارپ یا جاوا sorenatechco 5 1,549 11/10/1394، 08:22 صبح
آخرین ارسال: sajjad3011
  WaitForSeconds در سی شارپ The Path 2 1,072 9/4/1393، 11:53 عصر
آخرین ارسال: محمدمهدی علیجانی
  سی شارپ در یونیتی armangamer 4 1,481 9/2/1393، 11:36 عصر
آخرین ارسال: sajjad3011



کاربرانِ درحال بازدید از این موضوع: 1 مهمان