大佬們好,我是剛入坑的超級萌新
目前嘗試做手機音樂遊戲碰到一個問題,不知道如何解決
我想透過是否按下螢幕按鈕(就是打音遊的判定那條),
有:則觸發碰撞消除音符
若沒有則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)
{
我原本是想塞這看能不能觸發
}
}
}
}
給您參考
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("觸摸結束");
}
}
}
}
因為沒有實際做過節奏類的遊戲, 所以不敢肯定實際的做法是什麼。但直接看你的程式碼, 我想到兩點你可以思考的問題來進行改進:
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);
}
}
不過先提醒一下上面的程式碼並不是正確的做法, 你需要再修改一下喔~
另外, 從你的問題可以感覺到你對編程不太熟, 建議你可以先學習一點程式語言的基礎喔~