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 == mute1 ?静音2:静音1;}

4

5 回答 5

17

使用 OnMouseDown

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

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

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

与其他方法的比较

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

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

于 2015-01-26T19:42:23.267 回答
2

与 3D 事物相比,我不是 100% 确定 unity 如何处理 2D 事物,但我相当确定光线投射的原理是相同的,因此请尝试以下操作并将其粘贴在您的脚本中的更新下想要点击。

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

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

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.GetKeyDown (KeyCode.Mouse0) 更改为 Input.GetMouseButtonDown(0) 并且无论我点击哪里它仍然会激活

无论您在何处单击它都会激活它并不奇怪,因为您没有将其限制在特定位置。现在你只是在检查

input.GetMouseButtonDown(0)

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

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

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

于 2015-01-26T09:06:45.613 回答
1

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

于 2015-01-26T08:26:54.603 回答