07 «1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.» 09

ハルシオンシステムの気ままBlog

株式会社ハルシオンシステムのメンバーが送る、UnityやらJavaやらの技術的話題から、自社開発のアプリの宣伝とかとかのブログです。ほんと気ままにいきたいと思います。更新日は毎週 月 木でっす!

 

【Unity】マルチタップ(マルチタッチ)ってuGUIでできないの?結局無理やりになっちゃったけど・・・から、できる方法に修正してみた! 

こんにちは!坂内でございます。

最近全然技術ネタが無かったのですが、ようやく書くこと見つけたので書いちゃいます!

他のブログとかにも色々と書かれていますが、マルチタップについて。

例えば、以下のような感じで、ボタンAとボタンBがあり、同時に押している間なにかをするといった処理の場合のコードなんぞを考えてみました。


今回こちらのボタンAとボタンBはuGUIのImageで作っています。
uGUIのボタンにはマルチタップが無いのかな?そのままuGUIのボタンにしてしまうとできません。

ってことで、まずは以下のコードを書きます。

    bool leftTouch;
bool rightTouch;

void Update () {
leftTouch = false;
rightTouch = false;
Touch[] myTouches = Input.touches;
for (int i = 0; i < Input.touchCount; i++) {

if(!leftTouch){
leftTouch = isTouchLeft(myTouches[i]);
}
if(!rightTouch){
rightTouch = isTouchRight(myTouches[i]);
}
}
if(leftTouch && rightTouch){
Debug.Log("両方押されてるよ");
}
}

///
/// 左指をタップしているか
///

///
bool isTouchLeft(Touch touche) {
Vector2 touchPoint = Camera.main.ScreenToWorldPoint(touche.position);
Collider2D collition2d = Physics2D.OverlapPoint(touchPoint);
if (collition2d) {
RaycastHit2D hitObject = Physics2D.Raycast(touchPoint, -Vector2.up);
if (hitObject) {
if (hitObject.collider.gameObject.name == "btnA") {
return true;
}
}
}
return false;
}

///
/// 右指をタップしているか
///

///
bool isTouchRight(Touch touche) {
Vector2 touchPoint = Camera.main.ScreenToWorldPoint(touche.position);
Collider2D collition2d = Physics2D.OverlapPoint(touchPoint);
if (collition2d) {
RaycastHit2D hitObject = Physics2D.Raycast(touchPoint, -Vector2.up);
if (hitObject) {
if (hitObject.collider.gameObject.name == "btnB") {
return true;
}
}
}
return false;
}


ボタンAのオブジェクト名を「btnA」、ボタンBのオブジェクト名を「btnB」にし、両方のボタンにCircleCollider2D(形にあったコライダーをつける)をつけます。

Raycastを使用するため、コライダーが必要になります。

これで、両方をタップしている間、「両方押されてるよ」のメッセージが出る感じに!
絵を変えたい場合は、両方押されてるよのタイミングで絵を変えてあげてね!!

ってことで、今回はこんな感じでアデュ~ノシ

************************************************
追記:narudesignさん(@narudesign_dev)から楽な方法教えて頂きました!!

次のコードにしてー・・・
bool leftTouch;
bool rightTouch;
public Text text;

public void LeftDown() {
leftTouch = true;
}

public void LeftUp() {
leftTouch = false;
}

public void RightDown() {
rightTouch = true;
}

public void RightUp() {
rightTouch = false;
}

void Update () {
if (leftTouch && rightTouch) {
text.text = "両方押されてるよ";
} else if (leftTouch) {
text.text = "左おされてるよ";
} else if (rightTouch){
text.text = "右おされてるよ";
} else {
text.text = "";
}
}

で、左右のボタンに、EventTriggerをつけてPointerDown/Upをつけるだけ!


できるじゃー あーりませんか!
ここで注意。

テストしやすいようにとUnityRemoteを使っていただのですが、こいつがいけないらしいです。
UnityRemoteだとマルチタップ非対応?
この方法でも、UnityRemoteだと動作しませんが、実機に入れるとできます!!


ありがとうnarudesignさん!!
************************************************
スポンサーサイト

Category: 開発日記(Unity)

tb 0 : cm 0