如何使精灵可点击?

时间:2015-01-26 08:08:01

标签: c# unity3d unity3d-2dtools

我已经google了很多,只提出了非常复杂的方法。我还发现了函数OnMouseDown(),但我还没有能够使它工作。

当你点击屏幕上的任何地方时,精灵会激活。

编辑 - 是的它有一个2d Box对撞机

我的代码如下:

using UnityEngine;
using System.Collections;

public class mute : MonoBehaviour {

    public bool isMuted = false;
    public Sprite mute1; // Drag your first sprite here
    public Sprite mute2; // Drag your second sprite here

    private SpriteRenderer spriteRenderer; 

    // Use this for initialization
    void Start () {
        spriteRenderer = GetComponent<SpriteRenderer>(); // we are accessing the SpriteRenderer that is attached to the Gameobject
        if (spriteRenderer.sprite == null) // if the sprite on spriteRenderer is null then
            spriteRenderer.sprite = mute1; // set the sprite to sprite1
    }

    // Update is called once per frame
    void Update () {

        if (Input.GetKeyDown (KeyCode.Mouse0)) {
            if(isMuted == false){
                AudioListener.pause = true;
                AudioListener.volume = 0;
                isMuted = true;
                ChangeSprite ();

            }
            else{
                AudioListener.pause = false;
                AudioListener.volume = 1;
                isMuted = false;
                ChangeSprite ();

            }
        }
    }

    void ChangeSprite ()
    {
        if (spriteRenderer.sprite == mute1) // if the spriteRenderer sprite = sprite1 then change to sprite2
        {
            spriteRenderer.sprite = mute2;
        }
        else
        {
            spriteRenderer.sprite = mute1; // otherwise change it back to sprite1
        }
    }
}

5 个答案:

答案 0 :(得分:10)

使用OnMouseDown

最简单的方法是将此函数添加到附加到包含sprite的gameObject的任何脚本组件中:

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

gameObject还需要有一个对撞机。 2D和3D对撞机都可以工作。

与其他方法的比较

光线投射仅适用于一种碰撞器类型Physics.Raycast仅适用于3D碰撞器,而Physics2D.Raycast仅适用于2D碰撞器。 OnMouseDown适用于两者,但其性能可能与执行两个光线播放的性能一样糟糕。

其他答案中陈述的基于位置的方法有利于提高性能。一些if语句的计算速度比光线投射要快得多,但是对于基本场景,光线投射仍然足够快。位置检查的缺点是,如果你改变任何东西(比例或位置),你可能会破坏你的if条款。如果你想让精灵在彼此之上,那么if也非常复杂。

答案 1 :(得分:1)

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

答案 2 :(得分: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 tutorials

答案 3 :(得分:1)

我不是百分之百确定统一处理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.
        }
    }
}

所以这样做是检查鼠标是否被点击,检查鼠标在那里点击的位置实际上是什么,然后检查点击的内容是否包含脚本。

答案 4 :(得分: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。