我正在製作一個Unity3D的Android應用程序,它已經可以與點擊檢測一起使用,但不能與觸摸一起使用。我需要觸摸,但多點觸摸檢測。如何在Unity3D中使用觸摸屏?
我想要什麼:我有我的玩家和2個箭頭圖像。一個箭頭指向右側和一個左側。當我觸摸左箭頭時,玩家應該開始向左移動,當我觸摸右箭頭時,玩家應該開始向右移動。
但是,如何檢測哪個箭頭被觸摸(並保持)?我在Google上找到的所有代碼都太舊,而且不再工作。
我正在使用C#腳本,它是一款2D遊戲。
我正在製作一個Unity3D的Android應用程序,它已經可以與點擊檢測一起使用,但不能與觸摸一起使用。我需要觸摸,但多點觸摸檢測。如何在Unity3D中使用觸摸屏?
我想要什麼:我有我的玩家和2個箭頭圖像。一個箭頭指向右側和一個左側。當我觸摸左箭頭時,玩家應該開始向左移動,當我觸摸右箭頭時,玩家應該開始向右移動。
但是,如何檢測哪個箭頭被觸摸(並保持)?我在Google上找到的所有代碼都太舊,而且不再工作。
我正在使用C#腳本,它是一款2D遊戲。
Klausar,你在找什麼是.........
就是這麼簡單!
單擊「添加畫布」。 (你很可能想要「縮放到屏幕大小」 - 選擇該選項。)
單擊「添加按鈕」。
有沒有「三」..去喝酒。
在代碼中,有一個像
public void UserClickedRight()
{
Debug.Log("click right whoo!");
}
和同爲左常規。在編輯器中轉到右邊的Button
。 只需拖動腳本並選擇UserClickedRight
即可。如果您以前沒有見過,可以在數百萬個教程中進行解釋。這是Unity的絕對基本機制和範式 - 在編輯器中將某個腳本拖到「插槽」中。
難以置信的簡單吧?!
你不需要去觸摸處理的水平來實現這一點。
這非常容易,你只需要知道關於Unity「事件」系統的一些事情。
請注意,在「按鈕」中,Unity會在「檢查器」面板中向您提供「OnClick」鏈接。
你完全知道如何使用,現在,對不對?因此,Unity會將它放在「面板中」,方便您在大多數按鈕上使用它。
好消息是,Button
有其他了不起的事件,你可以使用。
你問,這些其他真棒事件是什麼?總是簡單地看看doco找出:
正如你可以看到有很棒的事件,如OnPointerDown
和OnPointerUp
。這就是你想要的。
再次,看着這個形象......
要重複,團結 「給你」 OnClick
正確的,在編輯器中。
你可能會說:「好吧,爲什麼其他人不在那裏?」沒有神祕感 - 這只是OnClick
如此普遍。說一年或兩年,Unity發現每個人都一直使用OnPointerDown
,每個人都一直在大喊大叫地把它加進去。在那種情況下,爲了方便起見,他們可能會添加它。相反,你可以想象,他們可能根本沒有打擾到把OnClick
放在那裏,也許是爲了減小面板。
的一點是OnClick
,OnPointerDown
等都是所有事件,一樣的 - 它只是因爲它發生,他們認爲OnClick
面板上的「扔」在那裏,因爲它的流行。
的確,有人會說這有點令人困惑:如果Unity沒有把OnClick
放在那裏,你就必須知道我要解釋什麼,對吧?你必須做到以下幾點,才能使用OnClick
...明白我的意思嗎?
所以使用其他事件非常簡單,你只
,並
就這麼簡單。
所以。你將要使用Unity的事件系統,所以你必須這樣做:
using UnityEngine.EventSystems;
接下來,你知道一個腳本正常啓動這樣的...
public class FancyButton:MonoBehaviour
的「MonoBehaviour」部分只是意味着它是一個C#腳本,將其中的「駕駛GamObject」,這將是「一個遊戲對象的一部分。」但在這種情況下,我們必須進一步警告引擎,您將使用向下和向上單擊事件。所以你補充一點。
,IPointerDownHandler,IPointerUpHandler
所以,到目前爲止,我們有這個
using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;
public class FancyButton:MonoBehaviour,IPointerDownHandler,IPointerUpHandler
{
現在很容易的部分。只要輸入Unity發佈的兩個例程即可。
using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;
public class FancyButton:MonoBehaviour,IPointerDownHandler,IPointerUpHandler
{
public void OnPointerDown(PointerEventData data)
{
Debug.Log("holy! someone clicked down!")
}
public void OnPointerUp(PointerEventData data)
{
Debug.Log("whoa! someone clicked up!")
}
}
現在,所有你需要做的就是把該腳本的按鈕。這樣做並給它一個測試。
所以不要忘了實際上把腳本放在問題的按鈕上。不要忘了,事實上,你可以把它放在任何按鈕你喜歡使那個按鈕的工作方式。 (這是很常見的,你有這樣的腳本,你可以把它放在項目中的每個按鈕上,或者放在預製件上。)
接下來,點擊Obi-wan查看我們到目前爲止的位置!
最後,這聽起來像你想「被按下按鈕時」做一些事情。這只是一個普遍的編程問題 - 你會有一個布爾值,隨着按鈕的上下移動你可以打開和關閉。我們開始做吧。
using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;
public class FancyButton:MonoBehaviour,IPointerDownHandler,IPointerUpHandler
{
[System.NonSerialized] public bool mouseIsDownRightNow;
public void OnPointerDown(PointerEventData data)
{
mouseIsDownRightNow = true;
}
public void OnPointerUp(PointerEventData data)
{
mouseIsDownRightNow = false;
}
}
You could access that variable from another script, or whatever you want.
Add the following if you want to run a routine while the button is down:
void Update()
{
if (buttonIsDownRightNow) WhileButtonIsDown();
}
private void WhileButtonIsDown()
{
Debug.Log("THE #[email protected]#$ BUTTON IS DOWN!!!!!!!! WHOA!");
}
Try that and watch the console as you hold the button down and up.
Here's an example of something like continually increasing a value while the button is down:
using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;
public class FancyButton:MonoBehaviour,IPointerDownHandler,IPointerUpHandler
{
[System.NonSerialized] public bool buttonIsDownRightNow;
private int countSomething;
public void OnPointerDown(PointerEventData data)
{
buttonIsDownRightNow = true;
}
public void OnPointerUp(PointerEventData data)
{
buttonIsDownRightNow = false;
}
private void WhileButtonIsDown()
{
++countSomething;
}
void Update()
{
if (buttonIsDownRightNow) WhileButtonIsDown();
Debug.Log("value is now " +countSomething.ToString());
}
}
就是這樣。一旦你真正理解了Unity中的事件,就沒有什麼可以理解的了。其他重要主題包括Mecanim,着色器寫作,觸摸,協同程序,線程,PhysX,本地插件,精靈,網絡,動態網格,導航,VR,AR,動畫,逆運動學,粒子,地形,IAP,照明,烘焙,陰影,MMP,角色控制器......和音頻。請享用!
您應該首先閱讀this。 你所要做的其實很簡單:
foreach (Touch touch in Input.touches) {
if (touch.phase == TouchPhase.Moved || touch.phase == TouchPhase.Stationary)
if (guiTexture1.HitTest(touch.position)) {
// Maybe move left
}
if (guiTexture2.HitTest(touch.position)) {
// Maybe move right
}
}
}
編輯1:這段代碼被壓
現在檢查其圖像 編輯2:增加了支持多點觸摸
這將工作如果他只是想在屏幕上檢測觸摸/幫助。他想要檢測兩個不同箭頭上的觸摸。此代碼無法確定哪個箭頭正在被觸摸。 – Programmer
你說得對,我只是編輯了我的答案。 – Stolous
謝謝,這真的幫助我。這個例子中的多點觸摸已經工作了嗎?我也可以使用gameObject而不是GUI對象嗎? – Klausar
檢測觸摸很容易。檢測觸摸和持有需要您熟悉C#,因爲涉及到很多邏輯。提供不起作用的代碼,也許有人可以幫助你。 – Programmer
我剛剛意識到,朋友@ Klausar正在描述............................ *一個按鈕!! * – Fattie