8

私はたくさんグーグルで調べましたが、それを行うための本当に複雑な方法しか思いつきませんでした. 関数OnMouseDown()も見つけましたが、機能させることができませんでした。

現時点では、画面のどこかをタップするとスプライトがアクティブになります。

編集- はい、2d Box コライダーがあります

以下の私のコード:

using UnityEngine;
using System.Collections;

public class mute : MonoBehaviour 
{
    public bool isMuted = false;
    public Sprite mute1, mute2;

    private SpriteRenderer spriteRenderer; 

    private void Start () 
    {
        spriteRenderer = GetComponent<SpriteRenderer>();

        if (spriteRenderer.sprite == null) 
            spriteRenderer.sprite = mute1;
    }
    private void Update () 
    {
        if (Input.GetKeyDown (KeyCode.Mouse0)) 
        {
            if (!isMuted)
            {
                AudioListener.pause = true;
                AudioListener.volume = 0;

                isMuted = true;
                ChangeSprite();

            }
            else
            {
                AudioListener.pause = false;
                AudioListener.volume = 1;

                isMuted = false;
                ChangeSprite();
            }
        }
    }
    private void ChangeSprite() => spriteRenderer.sprite = 

spriteRenderer.sprite == ミュート 1 ? ミュート 2 : ミュート 1; }

4

5 に答える 5

17

OnMouseDown の使用

最も簡単な方法は、スプライトを含む gameObject にアタッチされた任意のスクリプト コンポーネントにこの関数を追加することです。

void OnMouseDown(){
    Debug.Log("Sprite Clicked");
}

gameObject にもコライダーが必要です。2D コライダーと 3D コライダーの両方が機能します。

他の方法との比較

レイキャスティングは、一度に 1 つのコライダー タイプでのみ機能し、Physics.Raycast3D コライダーに対してPhysics2D.Raycastのみ機能し、2D コライダーに対してのみ機能します。OnMouseDown両方で動作しますが、そのパフォーマンスが両方のレイキャストを実行するパフォーマンスと同じくらい悪い可能性があります。

他の回答に記載されている位置ベースの方法は、パフォーマンスに優れています。いくつかのifステートメントは、レイ キャスティングよりもはるかに高速に計算できますが、レイ キャスティングは基本的なシーンには十分に高速です。位置チェックの欠点は、何か (スケールまたは位置) を変更すると、if 句が壊れる可能性が高いことです。また、ifスプライトを互いの上に配置したい場合、 s は非常に複雑です。

于 2015-01-26T19:42:23.267 に答える
2

Unity が 3D のものと比較して 2D のものをどのように処理するかについて 100% 確信があるわけではありませんが、レイキャスティングの原理は同じであると確信しているので、次のようなことを試して、スクリプトの更新の下に貼り付けます。クリックしたい。

if (Input.GetMouseButtonDown(0))
{
    RaycastHit hit;
    if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out hit))
    {
        if (hit.collider == collider)
        {
            //Do your thing.
        }
    }
}

これは、マウスがクリックされたかどうかを確認し、マウスがクリックされた場所に実際に何かがあったかどうかを確認し、クリックされたものがスクリプトを含むものであることを確認することです。

于 2015-01-26T09:07:00.557 に答える
1

Input.GetKeyDown (KeyCode.Mouse0) を Input.GetMouseButtonDown(0) に変更しましたが、どこをクリックしてもアクティブになります

特定の場所に制限されていないため、クリックした場所に関係なくアクティブになるのはそれほど奇妙ではありません. 今、あなたはちょうどチェックしています

input.GetMouseButtonDown(0)

クリックが特定の領域内にあるかどうか、または特定のオブジェクトに当たったかどうかを確認する必要があります。したがって、このようなものを使用して、現在のマウスの位置によって制限できます。

if(mousePosition.x < 100 && mousePosition.x > 10)
    if(mousePosition.y < 500 && mousePosition.y > 10

または、レイキャストを使用して、現在ヒットしているオブジェクトを特定することもできます。ほとんどすべてのシナリオで積極的にアドバイスします。レイキャスティングの詳細については、unity のチュートリアルをご覧ください。

于 2015-01-26T09:06:45.613 に答える
1

コメントで見たように、実際のタッチ位置を取得できます

if (Input.GetTouch(0) /*|| buttondown or what you want*/)
{
    fingerPos =  Input.GetTouch(0).position; // or buttondown
    Vector3 realPos = Camera.main.ScreenToWorldPoint(fingerPos);

    if (realPos.transform.position.x >= SpriteRenderer.transform.position.x -10
        && realPos.transform.position.x <= SpriteRenderer.transform.position.x +10)
        && realPos.transform.position.y >= SpriteRenderer.transform.position.y -10
        && realPos.transform.position.y <= SpriteRenderer.transform.position.y +10)
    {
        ChangeSprite();
    }
}

チェックの条件を見逃している可能性があります xD アイデアは、タップがスプライトがあるべき妥当な範囲内にあるかどうかを確認することです。そこに単純な数字を入れました。もちろん、SpriteRendererのサイズxとサイズyを使用できます。

于 2015-01-26T09:27:15.330 に答える
1

まず、ゲームオブジェクトにコライダーが必要で、クリックには一種のレイキャスティングを使用する必要があると思います。Input.GetMouseButtonDown (0)そして、代わりに使用できます Input.GetKeyDown (KeyCode.Mouse0)

于 2015-01-26T08:26:54.603 に答える