2016-03-16 64 views
2

我正在製作一個Unity3D的Android應用程序,它已經可以與點擊檢測一起使用,但不能與觸摸一起使用。我需要觸摸,但多點觸摸檢測。如何在Unity3D中使用觸摸屏?

我想要什麼:我有我的玩家和2個箭頭圖像。一個箭頭指向右側和一個左側。當我觸摸左箭頭時,玩家應該開始向左移動,當我觸摸右箭頭時,玩家應該開始向右移動。

但是,如何檢測哪個箭頭被觸摸(並保持)?我在Google上找到的所有代碼都太舊,而且不再工作。

我正在使用C#腳本,它是一款2D遊戲。

+2

檢測觸摸很容易。檢測觸摸和持有需要您熟悉C#,因爲涉及到很多邏輯。提供不起作用的代碼,也許有人可以幫助你。 – Programmer

+0

我剛剛意識到,朋友@ Klausar正在描述............................ *一個按鈕!! * – Fattie

回答

6

Klausar,你在找什麼是.........

一個按鈕(!)

就是這麼簡單!

  1. 單擊「添加畫布」。 (你很可能想要「縮放到屏幕大小」 - 選擇該選項。)

  2. 單擊「添加按鈕」。

  3. 有沒有「三」..去喝酒。

在代碼中,有一個像

public void UserClickedRight() 
{ 
Debug.Log("click right whoo!"); 
} 

和同爲左常規。在編輯器中轉到右邊的Button只需拖動腳本並選擇UserClickedRight即可。如果您以前沒有見過,可以在數百萬個教程中進行解釋。這是Unity的絕對基本機制和範式 - 在編輯器中將某個腳本拖到「插槽」中。

難以置信的簡單吧?!

你不需要去觸摸處理的水平來實現這一點。


現在你問,「什麼時候按下按鈕」?

這非常容易,你只需要知道關於Unity「事件」系統的一些事情。

請注意,在「按鈕」中,Unity會在「檢查器」面板中向您提供「OnClick」鏈接。

enter image description here

你完全知道如何使用,現在,對不對?因此,Unity會將它放在「面板中」,方便您在大多數按鈕上使用它。

好消息是,Button其他了不起的事件,你可以使用

你問,這些其他真棒事件是什麼?總是簡單地看看doco找出:​​

正如你可以看到有很棒的事件,如OnPointerDownOnPointerUp。這就是你想要的。

再次,看着這個形象......

enter image description here

要重複,團結 「給你」 OnClick正確的,在編輯器中。

你可能會說:「好吧,爲什麼其他人不在那裏?」沒有神祕感 - 這只是OnClick如此普遍。說一年或兩年,Unity發現每個人都一直使用OnPointerDown,每個人都一直在大喊大叫地把它加進去。在那種情況下,爲了方便起見,他們可能會添加它。相反,你可以想象,他們可能根本沒有打擾到把OnClick放在那裏,也許是爲了減小面板。

的一點是OnClickOnPointerDown等都是所有事件,一樣的 - 它只是因爲它發生,他們認爲OnClick面板上的「扔」在那裏,因爲它的流行。

的確,有人會說這有點令人困惑:如果Unity沒有把OnClick放在那裏,你就必須知道我要解釋什麼,對吧?你必須做到以下幾點,才能使用OnClick ...明白我的意思嗎?

所以使用其他事件非常簡單,你只

1,使腳本引用您想要的事件,

,並

2,你把劇本上有問題的按鈕...

就這麼簡單。

所以。你將要使用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查看我們到目前爲止的位置!

enter image description here

最後,這聽起來像你想「被按下按鈕時」做一些事情。這只是一個普遍的編程問題 - 你會有一個布爾值,隨着按鈕的上下移動你可以打開和關閉。我們開始做吧。

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,角色控制器......和音頻。請享用!

+0

謝謝!所以多點觸控已經在這個例子中工作?例如,如果我有一個按鈕可以拍攝並向左走,我可以同時按兩個按鈕嗎? – Klausar

+0

是的,去吧。 Unity的UI系統真的很棒。 – Fattie

+0

謝謝!我試過了,它工作。但是,我無法按住按鈕,它只能檢測到MouseDown。有什麼辦法解決這個問題? – Klausar

2

您應該首先閱讀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:增加了支持多點觸摸

+0

這將工作如果他只是想在屏幕上檢測觸摸/幫助。他想要檢測兩個不同箭頭上的觸摸。此代碼無法確定哪個箭頭正在被觸摸。 – Programmer

+0

你說得對,我只是編輯了我的答案。 – Stolous

+0

謝謝,這真的幫助我。這個例子中的多點觸摸已經工作了嗎?我也可以使用gameObject而不是GUI對象嗎? – Klausar