【问题标题】:How to make a sprite clickable?如何使精灵可点击?
【发布时间】:2015-01-26 08:08:01
【问题描述】:

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

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

EDIT - 是的,它有一个 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; }

【问题讨论】:

  • Vector3 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
  • 我现在会做出改变,希望这就是我的问题。
  • @Barnstokkr 我会在哪里使用它?我将 Input.GetKeyDown (KeyCode.Mouse0) 更改为 Input.GetMouseButtonDown(0) 并且无论我在哪里点击它仍然会激活
  • 抱歉,如果我问的是如何使“精灵”可点击..而不是如何使整个屏幕可点击并激活精灵..

标签: c# unity3d unity3d-2dtools


【解决方案1】:

使用 OnMouseDown

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

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

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

与其他方法的比较

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

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

【讨论】:

  • 非常感谢,很抱歉回复晚了...是的,这正是我不想使用基于位置的代码的原因,因为我不断改变主意并四处移动。我会给这个去..我不知道 raycast 2d ......我用 Google 搜索了一下,发现 ray cast 在 2d 上不起作用,但感谢您让我知道这一点:PI 将在几小时内试一试,并祈祷它是我在追求什么:P 再次感谢。
  • 没问题。我刚刚意识到您的建议 OnMouseDown 也有效。我编辑了我的答案。这要好得多,因为只有在用户单击时才需要这样做。
  • 非常感谢!我们有赢家!我知道有一个简单的方法可以做到这一点,你找到了!!!如果我能给你买啤酒,我会的!
  • 哇!这是一个很好的答案!没想到这么简单!
【解决方案2】:

我不是 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.
        }
    }
}

所以它所做的是检查鼠标是否被点击,检查鼠标点击的位置是否实际有任何东西,然后检查点击的是带有脚本的东西。

【讨论】:

  • 看起来是一个更简单的选择,但我想我必须导入光线投射?目前它说 Assets/mute.cs(33,37): error CS0117: UnityEngine.Physics' does not contain a definition for RayCast'
  • 对不起@MIke,我指的是Raycast;中途没有大写字母。我现在改变了答案。
  • 哦,没问题,对不起,我应该注意到了。
  • bugger 它不起作用.. 不知道为什么.. 没有造成任何错误只是现在根本没有激活精灵。
  • 代码已经放在你想要点击的对象中,并且它上面也有一些描述的碰撞器?
【解决方案3】:

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

【讨论】:

  • 感谢您的建议,如果我进行更改,现在可以吗?我还没有加快光线投射的速度
  • 我已经更改了它,但无论我点击哪里,它仍然有效。有什么简单的想法吗?
【解决方案4】:

我将 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

【讨论】:

  • 感谢您提供的帮助:P 我最终让 onmousedown 开始工作,我只需要将其设为 void 而不是 input.get 但最终……非常感谢。
【解决方案5】:

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

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。

【讨论】:

  • 感谢您提供回复,但我最终让 mousedown 开始工作。我不想选择一个位置,因为我可能需要稍后移动精灵而我没有想要重新编码。
猜你喜欢
  • 1970-01-01
  • 2016-03-16
  • 2014-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-07
  • 1970-01-01
  • 2011-08-18
相关资源
最近更新 更多