我已经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
}
}
}
答案 0 :(得分:10)
最简单的方法是将此函数添加到附加到包含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。