2015-12-14 50 views
2

我正在開發一個帶觸摸控制的手機遊戲。我可以非常容易地選擇一個非移動的遊戲對象,並且它會作出響應,但是由於它很小(例如,它基於物理),因此在移動時選擇它非常困難。有沒有辦法增加遊戲對象的觸摸半徑以便更容易按下,或者有其他解決方案嗎?選擇移動遊戲物體的困難

private void Update() { 
    //User input (touches) will select cubes 
    if(Input.touchCount > 0) { 
     Touch touch = Input.GetTouch(0); 
    } 
    Touch[] touches = Input.touches; 

    foreach(var touchInput in touches) { 
     RaycastHit2D hit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint((Input.GetTouch(0).position)), Vector2.zero); 

     if (hit.collider != null) { 
      selectedCube = hit.collider.gameObject; 
      selectedCube.GetComponent<SpriteRenderer>().color = Color32.Lerp(defaultColor, darkerColor, 1); 
     } 

    } 
} 
+0

嗯,我不知道有多少GameObject是在場景中的一次,但增加對撞機的大小呢? – AmRzA

+0

@AmRzA如果我增加對撞機的大小,這個對象上面的對象會漂浮在空中 – Milen

+0

以及在協程內部使用一段時間(真)的情況如何? – AmRzA

回答

2

而不是增加對象的collider大小(你在評論中討論過),那麼如何以相反的方式來處理?檢查周圍的觸感,爲碰撞的區域,而不是隻單點,使用Physics2D.CircleCast

private void Update() { 
    //User input (touches) will select cubes 
    if(Input.touchCount > 0) { 
     Touch touch = Input.GetTouch(0); 
    } 
    Touch[] touches = Input.touches; 

    foreach(var touchInput in touches) { 
     float radius = 1.0f; // Change as needed based on testing 
     RaycastHit2D hit = Physics2D.CircleCast(Camera.main.ScreenToWorldPoint((Input.GetTouch(0).position)), radius, Vector2.zero); 

     if (hit.collider != null) { 
      selectedCube = hit.collider.gameObject; 
      selectedCube.GetComponent<SpriteRenderer>().color = Color32.Lerp(defaultColor, darkerColor, 1); 
     } 

    } 
} 

請注意,這不會是巨大的,如果你已經有了噸互相平齊可選對象。 ..但是,再次,在這種情況下增加對撞機的大小也無濟於事。 (我只是說增加對象大小,沒辦法提高用戶的準確性,或者允許多選,並使用Physics2D.CircleCastAll)。

希望這會有所幫助!如果您有任何問題,請告訴我。

編輯:爲了獲得更好的精度,由於Physics2D.CircleCast返回的「第一」的結果可以任意選擇,你可以改用Physics2D.CircleCastAll獲得觸摸半徑內的所有對象,只能選擇一個最接近的原來的觸摸點:

private void Update() { 
    //User input (touches) will select cubes 
    if(Input.touchCount > 0) { 
     Touch touch = Input.GetTouch(0); 
    } 
    Touch[] touches = Input.touches; 

    foreach(var touchInput in touches) { 
     float radius = 1.0f; // Change as needed based on testing 
     Vector2 worldTouchPoint = Camera.main.ScreenToWorldPoint(Input.GetTouch(0).position); 
     RaycastHit2D[] allHits = Physics2D.CircleCastAll(worldTouchPoint, radius, Vector2.zero); 

     // Find closest collider that was hit 
     float closestDist = Mathf.Infinity; 
     GameObject closestObject = null; 
     foreach (RaycastHit2D hit in allHits){ 

      // Record the object if it's the first one we check, 
      // or is closer to the touch point than the previous 
      if (closestObject == null || 
       Vector2.Distance(closestObject.transform.position, worldTouchPoint) < closestDist){ 
       closestObject = hit.collider.gameObject; 
       closestDist = Vector2.Distance(closestObject.transform.position, worldTouchPoint); 
      } 
     } 

     // Finally, select the object we chose based on the criteria 
     if (closestObject != null) { 
      selectedCube = closestObject; 
      selectedCube.GetComponent<SpriteRenderer>().color = Color32.Lerp(defaultColor, darkerColor, 1); 
     } 
    } 
} 
+0

我試過這個,但是當附近有一個物體時,它會選擇它。如果我降低半徑,它不會經常發生,但發生的並非毫無意義,這是不好的。有一款名爲QuadRush的Android遊戲,它也具有相同類型的下降遊戲對象(2d格),並且尺寸與我的幾乎相同,但選擇它們非常容易。你可以看看它嗎? – Milen

+0

我懷疑QuadRush受益於它涉及匹配共享一個屬性(用它們的顏色表示)的形狀。也許它會記錄所選第一個形狀的顏色 - 這樣,如果後續輕拍或輕掃技術上選擇多個形狀,則只能選擇共享原始顏色的那個。 (另請注意,QuadRush視頻中演示的大多數動作都是靜止的,快速移動的小形狀總是很難用指尖等不準確的方式進行拍攝。) – Serlite

+0

一種可能(可能)提高準確性的方法圓圈觸摸的方法是使用'Physics2D.CircleCastAll'代替,遍歷每個命中對象,並且只選擇最接近原始觸點的那個。讓我知道你是否需要我將它編輯成答案。 – Serlite