iT邦幫忙

0

手機觸控觸發碰撞箱OnTrigger

  • 分享至 

  • xImage

大佬們好,我是剛入坑的超級萌新
目前嘗試做手機音樂遊戲碰到一個問題,不知道如何解決

我想透過是否按下螢幕按鈕(就是打音遊的判定那條),
有:則觸發碰撞消除音符
若沒有則MISS掉

我不知道怎麼把他們PPAP融合在一起
網路上幾乎都是做電腦版的音遊,用Input.KeyCode做,
我是照著做,半懂慢慢改成手機版,但現在卡在這裡
求各位大佬開示

private void OnTriggerEnter2D(Collider2D collision)
{  
    if (collision.gameObject.tag == "6")
    {
      
            Destroy(collision.gameObject);
       
           
    }
}

// Update is called once per frame

void Update()
{
    int touchCount = Input.touchCount;

    if (touchCount > 0)
    {

        for (int i = 0; i < touchCount; i++)
        {

            Touch touch = Input.GetTouch(i);


            if (touch.phase == TouchPhase.Began)
            {


            }

            else if (touch.phase == TouchPhase.Ended)
            {
            我原本是想塞這看能不能觸發
        


            }


        }
    }

}
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

1
win895564
iT邦研究生 5 級 ‧ 2022-12-29 16:12:38

給您參考

void Update()
{
    int touchCount = Input.touchCount;

    if (touchCount > 0)
    {
        for (int i = 0; i < touchCount; i++)
        {
            Touch touch = Input.GetTouch(i);

            if (touch.phase == TouchPhase.Began)
            {
                Debug.Log("觸摸開始");
            }
            else if (touch.phase == TouchPhase.Ended)
            {
                Debug.Log("觸摸結束");
            }
        }
    }
}
0
破銅爛鐵
iT邦新手 4 級 ‧ 2022-12-30 22:56:55

因為沒有實際做過節奏類的遊戲, 所以不敢肯定實際的做法是什麼。但直接看你的程式碼, 我想到兩點你可以思考的問題來進行改進:

1. 如何讓不同的函式之間互相溝通
碰撞的檢測是在 OnTriggerEnter 的函式中進行, 而觸摸螢幕的檢測則是在 Update 的函式中進行, 因此你需要一個方法讓它們共享資訊, 一般來說會建議透過**全域變數 (Global Variable)**來實現這個部分, 不過方法有很多, 你也可以用其他方式實現

2. 要在哪一個位置進行判定
另一個你要想清楚的點, 是消除音符的判定應該在 OnTriggerEnter 的函式中進行還是在 Update 的函式中進行, 或是可以考慮加上其他的函式輔助, 如 OnTriggerStay 跟 OnTriggerExit。你前面有說要在 Update 中進行判定, 但問題是** Unity 會在每一個 frame 都執行一次 Update, 也就是說一秒大約會執行 30 - 60 次**, 你真的需要進行判定那麼多次嗎? 相對來說, OnTriggerEnter 只有在兩個 GameObject 互相碰撞時的瞬間才會執行, 這樣就有可能會因為玩家觸摸螢幕慢了而漏掉了該音符的判定。

不過還是先跟著你上面的想法先給你一個建議的寫法吧:

// 用來記錄檢測到碰撞的音符的全域變數
private GameObject go;
// 用來記錄檢測到觸摸螢幕的全域變數
private bool touchScreen = false;

private void OnTriggerEnter2D(Collider2D collision)
{  
    if (collision.gameObject.tag == "6")
    {
            // 把檢測到碰撞的音符記錄起來
            go = collision.gameObject;
    }
}

// Update is called once per frame

void Update()
{
    int touchCount = Input.touchCount;

    if (touchCount > 0)
    {
        for (int i = 0; i < touchCount; i++)
        {
            Touch touch = Input.GetTouch(i);

            if (touch.phase == TouchPhase.Began)
            {
                // 表示玩家開始觸摸螢幕
                touchScreen = true;
            }
            else if (touch.phase == TouchPhase.Ended)
            {
                // 表示玩家結束觸摸螢幕
                touchScreen = false;
            }
        }
    }
    // 檢查是否正在觸摸螢幕跟有沒有記錄中的碰撞的音符
    if (touchScreen && go != null) {
        // 消除音符
        Destroy(go);
    }
}

不過先提醒一下上面的程式碼並不是正確的做法, 你需要再修改一下喔~

另外, 從你的問題可以感覺到你對編程不太熟, 建議你可以先學習一點程式語言的基礎喔~

我要發表回答

立即登入回答