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

امتیاز موضوع:
  • 0 رأی - میانگین امتیازات: 0
  • 1
  • 2
  • 3
  • 4
  • 5
تشخیص کلیک شدن یک گیم آبجکت در 2d و 3d
#1
سه بعدی : 

کد:
if (Input.GetMouseButtonDown (0))
       {
           Ray haftom = Camera.main.ScreenPointToRay (Input.mousePosition);
           RaycastHit hithaftom;

           if (Physics.Raycast(haftom, out hithaftom))
           {
               if (hithaftom.transform.name == "GameObject") {
                   GameObject.SetActive (false);
               }
           }
       }
دو بعدی : 
کد:
 void Update () {
       if (Input.GetMouseButtonDown(0)) {
           Vector3 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
           Vector2 mousePos2D = new Vector2(mousePos.x, mousePos.y);
           
           RaycastHit2D hit = Physics2D.Raycast(mousePos2D, Vector2.zero);
           if (hit.collider != null) {
               Debug.Log(hit.collider.gameObject.name);
               hit.collider.attachedRigidbody.AddForce(Vector2.up);
           }
       }
   }

}
پاسخ
 سپاس شده توسط aminblog76 ، qwerty13
#2
سلام ممنون
همچنین میتونید از تابع زیر هم استفاده کنید البته یادتون نره که ابجکتتون حتما باید حداقل یک کلایدر داشته باشه :
کد:
//لحظه کلیک کردن
void OnMouseDown(){
//دستورات مرتبط با کلیک کردن
}

//لحظه برداشتن انگشت از روی کلید موس (بعد از کلیک کردن)
void OnMouseUp(){
//دستورات مرتبط با کلیک کردن
}

//لحظه ای که موس روی ابجکت قرار میگیرد
void OnMouseOver(){
//دستورات مرتبط با کلیک کردن
}

//لحظه ای که موس از روی ابجکت برداشته میشود
void OnMouseExit(){
//دستورات مرتبط با کلیک کردن
}

کد بررسی لمس کردن ( تاچ ) در دو بعدی که داخل توابع update یا fixedUpdate و یا lateUpdate باید بنویسید:
*نکته: موقعی که با raycast کار میکنیم در واقع با سیستم فیزیک کار میکنیم پس باید به ابجکتمون حداقل یک کلایدر متصل باشه. اگر از raycast2d استفاده میکنیم کلایدر های 2d (مثل boxCollider2D) و اگر از raycast استفاده میکنیم از کلایدر های معمولی استفاده میکنیم (مثل boxCollider).
کد:
//بررسی اینکه لمس اتفاق افتاده است یا خیر؟
if (Input.touchCount > 0)
{
//تعریف متغیر تاچ از جنس ابجکت تاچ
Touch touch = Input.GetTouch(0);

//شروع لمس
if (touch.phase == TouchPhase.Began)
{
//انجام ری کست
RaycastHit2D hit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint((touch.position)), Vector2.zero);
//بررسی اینکه لمس بر روی ابجکت مد نظر انجام شده یا خیر؟
if (hit.collider != null && hit.collider.gameObject.tag == "felan")
{
//دستورات مرتبط با شروع لمس
}
}

//پایان لمس
if (touch.phase == TouchPhase.Ended)
{
//دستورات مرتبط با اتمام لمس
}
}
//پایان دستورات
پاسخ
 سپاس شده توسط qwerty13 ، start777
#3
دستور بالا ( در خصوص دو بعدی ) باعث تشخیص کلیک روی هر گیم آبجکت دوبعدی میشه که کلایدر داشته باشه . اما من میخوام دستور طوری باشه که فقط برای یک گیم آبجکت خاص عمل کنه . مثلا بنویسم اگر روی گیم ابجکت یک کلیک شد آنگاه ...
راهش چی هست ؟
پاسخ
 سپاس شده توسط aminblog76
#4
میتونی از UI استفاده کنی.ولی بهترین راه همون OnMouseDown و OnMouseUp هست من بازیامو با اونا میسازم
پاسخ
 سپاس شده توسط aminblog76
#5
(12/6/1397، 08:03 عصر)start777 نوشته است: دستور بالا ( در خصوص دو بعدی ) باعث تشخیص کلیک روی هر گیم آبجکت دوبعدی میشه که کلایدر داشته باشه . اما من میخوام دستور طوری باشه که فقط برای یک گیم آبجکت خاص عمل کنه . مثلا بنویسم اگر روی گیم ابجکت یک کلیک شد آنگاه ...
راهش چی هست ؟

ببینید اینجای کد:
hit.collider.gameObject.tag == "felan"
شرط بررسی کردن یه ابجکت خاصه. در واقع میگه اگر ابجکت مرتبط با کلایدر شناسایی شده ای که در متغیر hit ریختی ، تگی برابر با felan داشت شرط اجرا بشه
حالا شما میتونید بجای tag از name استفاده کنید و اسم رو مقایسه کنید
پاسخ
 سپاس شده توسط start777
#6
(12/6/1397، 08:09 عصر)Shine Studio نوشته است: میتونی از UI استفاده کنی.ولی بهترین راه همون OnMouseDown و OnMouseUp هست من بازیامو با اونا میسازم

برای موس ایده خوبیه ولی توی تاچ بدلیل سیستم مولتی تاچ و این حرفا ممکنه براشون خیلی کاربردی نباشه البته یادم نیست که این دو دستوری که گفتید روی تک لمسی کار میکنن یا نه اما کد مرتبط با تاچ که گذاشتم همه تعداد تاچ رو پشتیبانی میتونه بکنه
پاسخ
 سپاس شده توسط start777
#7
خب Input.touchCount
Input.touch
و...
اینا مخصوص تاچ هستن
پاسخ
 سپاس شده توسط aminblog76
#8
ممنون جناب aminblog76
تغییری که گفتید روی همون کد بالا انجام دادم و عمل کرد . حالا راهی سراغ داری دارید که همین کد 3 بار تاچ رو تشخیص بده ؟ 

کد:
void Update () {
      if (Input.GetMouseButtonDown(0)) {
          Vector3 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
          Vector2 mousePos2D = new Vector2(mousePos.x, mousePos.y);
         
          RaycastHit2D hit = Physics2D.Raycast(mousePos2D, Vector2.zero);
  if (hit.collider,.gameobject.name== "one") {
              Debug.Log(hit.collider.gameObject.name);
              hit.collider.attachedRigidbody.AddForce(Vector2.up);
          }
      }
  }

}
پاسخ
 سپاس شده توسط aminblog76
#9
(15/6/1397، 11:36 صبح)start777 نوشته است: ممنون جناب aminblog76
تغییری که گفتید روی همون کد بالا انجام دادم و عمل کرد . حالا راهی سراغ داری دارید که همین کد 3 بار تاچ رو تشخیص بده ؟ 

کد:
void Update () {
      if (Input.GetMouseButtonDown(0)) {
          Vector3 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
          Vector2 mousePos2D = new Vector2(mousePos.x, mousePos.y);
         
          RaycastHit2D hit = Physics2D.Raycast(mousePos2D, Vector2.zero);
  if (hit.collider,.gameobject.name== "one") {
              Debug.Log(hit.collider.gameObject.name);
              hit.collider.attachedRigidbody.AddForce(Vector2.up);
          }
      }
  }

}
خواهش میکنم
متوجه منظورتون از 3 بار تاچ نشدم ، لطفا بیشتر توضیح بدید
پاسخ
 سپاس شده توسط start777
#10
در کد بالا ما میگیم اگر گیم آبجکت الف لمس شد آنوقت اتفاق ب بیفتد . حالا من میخوام کد به اینصورت باشه که اگر گیم آبجکت الف سه بار لمس شد آنوقت اتفاق ب بیفتد .
البته میتونم یک متغییر از نوع int تعریف کنم و در قسمت  نتیجه ی کد بالا قرار بدم تا با هر بار لمس گیم آبجکت یکی اضافه بشه و وقتی سه شد اتفاق ب بیفته . اما اگر بشه میخوام تو همین کد انجام بشه تا حجم کدهام بالا تر نره .
پاسخ
 سپاس شده توسط aminblog76


موضوعات مرتبط با این موضوع...
موضوع نویسنده پاسخ بازدید آخرین ارسال
  افزودن کامپوننت به یک گیم آبجکت از طریق اسکریپت sajjad3011 1 1,429 10/4/1393، 09:59 صبح
آخرین ارسال: mzr



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