web-dev-qa-db-ja.com

Unityでのゲームオブジェクトのタップ検出

私は現在サッカーの試合を作っています。

このミニゲームでは、プレーヤーがボールに触れると力が加わり、ゴールは高得点になります。

だから私は書いた:

 void Update()
{
    if(Input.touchCount == 1 && Input.GetTouch(0).phase== TouchPhase.Began)
      {
       AddForce, and playsound ect...
      }

}

これにより、画面のどこかにタッチすると力が加わりますが、ゲームオブジェクト(ボール)にタッチすると力が加わるだけです。

どうやってやるの?

ありがとう! :)

4
Ophélia

これにより、画面のどこかにタッチすると力が加わりますが、ゲームオブジェクト(ボール)にタッチすると力が加わるだけです。

特定のゲームオブジェクトのタップを検出するには、Raycastを使用してそのサッカーボールのクリックを検出する必要があります。コライダー(例:Sphere Collider)が付いています。

void Update()
{
    if ((Input.touchCount > 0) && (Input.GetTouch(0).phase == TouchPhase.Began))
    {
        Ray raycast = Camera.main.ScreenPointToRay(Input.GetTouch(0).position);
        RaycastHit raycastHit;
        if (Physics.Raycast(raycast, out raycastHit))
        {
            Debug.Log("Something Hit");
            if (raycastHit.collider.name == "Soccer")
            {
                Debug.Log("Soccer Ball clicked");
            }

            //OR with Tag

            if (raycastHit.collider.CompareTag("SoccerTag"))
            {
                Debug.Log("Soccer Ball clicked");
            }
        }
    }
}
3
Programmer

スクリプトで OnMouseDown() を使用します。次に例を示します。

_using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {
    void OnMouseDown() {
        Application.LoadLevel("SomeLevel");
    }
}
_

PS:Update()メソッドから以前のコードを削除します。


EDIT:モバイルデバイスの代替コード

_using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class OnTouchDown : MonoBehaviour
{
    void Update () {
        // Code for OnMouseDown in the iPhone. Unquote to test.
        RaycastHit hit = new RaycastHit();
        for (int i = 0; i < Input.touchCount; ++i) {
            if (Input.GetTouch(i).phase.Equals(TouchPhase.Began)) {
            // Construct a ray from the current touch coordinates
            Ray ray = Camera.main.ScreenPointToRay(Input.GetTouch(i).position);
            if (Physics.Raycast(ray, out hit)) {
                hit.transform.gameObject.SendMessage("OnMouseDown");
              }
           }
       }
    }
}
_

上記のスクリプトをシーン内のアクティブなgameObjectに接続すると、モバイルデバイスでもOnMouseDown()が機能します。

2
Umair M

ここでいくつかの項目を実行する必要があります

  1. ボールに触れたかどうかを判断するには、タッチをレイキャストする必要があります

  2. タッチしている間、パワーを増やす必要があります

  3. あなたはボールを発射し、タッチのリリース時に電源をリセットする必要があります


コード例 here は、rayCastの処理方法を示しています

コード例 here はパート2で役立つはずです

3は素晴らしくシンプルです。Endedで起動コードとリセットをトリガーするだけです

それらをまとめると、このようなものが得られます

public class ExampleClass : MonoBehaviour {

    void FixedUpdate() {
       for (int i = 0; i < Input.touchCount; ++i) {
           Ray camRay = Camera.main.ScreenPointToRay (Input.GetTouch(i).Position);
           RaycastHit ballHit;
           if(Physics.Raycast (camRay, out ballHit, camRayLength, ballMask))
           {
               if (Input.GetTouch(i).phase == TouchPhase.Stationary) {
                   power += speed + Time.deltaTime;             
               }

               else if (Input.GetTouch(i).phase == TouchPhase.Ended) {
                   LauchBall(power);
                   power = 0;        
               }
           }
        }
    }
}

注:コードは一例であり、テストされておらず、完全ではありません

これは、物理的な更新をトリガーとして使用します。代わりに、他のいくつかの回答で示唆されているように、オブジェクトトリガーに直接リンクできます。

0
MikeT

Co-Rouitneを使用したTake Touchイベントが適しています。コルーチンを使用しない場合は、OnUpdateのタッチイベントを常にチェックします。コルーチンでタッチイベントを取るのが良いです。使い方を確認できるリンクです。


http://unitycodestuff.blogspot.in/2017/11/how-to-use-co-routine-for-taking-touch.html

0
Rupal Patel