如何使精灵可点击?

How to make a sprite clickable?

我在谷歌上搜索了很多,只提出了非常复杂的方法。我也找到了函数 OnMouseDown() 但我没能让它工作。

目前,当您点击屏幕上的任意位置时,精灵会激活。

编辑 - 是的,它有一个 2d Box collider

我的代码如下:

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; }

首先,我认为您的游戏对象应该有一个对撞机,对于点击,您应该使用某种光线投射。您可以使用 Input.GetMouseButtonDown (0) 而不是 Input.GetKeyDown (KeyCode.Mouse0)

I changed Input.GetKeyDown (KeyCode.Mouse0) to Input.GetMouseButtonDown(0) and it still activates no matter where i click

它在你点击的地方激活并不奇怪,因为你没有将它限制在特定的位置。现在你只是检查

input.GetMouseButtonDown(0)

您将要检查点击是否在特定区域内,或是否击中特定对象。所以你可以通过你当前的鼠标位置来限制它,像这样。

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

或者您可以使用光线投射来确定您当前击中的对象。我会在几乎所有情况下积极提出建议。有关光线投射的更多信息,请查看 unity tutorials

我不是 100% 确定 unity 如何处理 2D 事物与 3D 事物相比,但我相当确定光线投射的原理是相同的,所以尝试像下面这样的东西并将其粘贴在更新您想要点击的脚本。

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

所以这是在检查鼠标是否被点击,检查鼠标点击的地方是否真的有东西,然后检查点击的是不是有脚本的东西。

正如我在评论中看到的那样,您可以获得真实的触摸位置

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 size x 和 size y。

使用 OnMouseDown

最简单的方法是将此函数添加到附加到包含精灵的游戏对象的任何脚本组件中:

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

游戏对象还需要有一个碰撞体。 2D 和 3D 碰撞器都可以工作。

与其他方法的比较

光线投射当时仅适用于一种碰撞器类型 Physics.Raycast 仅适用于 3D 碰撞器并且 Physics2D.Raycast 仅适用于 2D 碰撞器。 OnMouseDown 对两者都有效,但它的性能可能与执行两个光线投射的性能一样差。

其他答案中所述的基于位置的方法对性能有好处。几个 if 语句的计算速度比光线投射快得多,但光线投射对于基本场景来说仍然足够快。位置检查的缺点是,如果您更改任何内容(比例或位置),您可能会破坏 if 子句。此外,如果您希望精灵彼此重叠,if 会非常复杂。