Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使精灵可点击?_C#_Unity3d_Unity3d 2dtools - Fatal编程技术网

C# 如何使精灵可点击?

C# 如何使精灵可点击?,c#,unity3d,unity3d-2dtools,C#,Unity3d,Unity3d 2dtools,我在谷歌上搜索了很多,只找到了非常复杂的方法。我也找到了这个函数,但我一直无法使它工作 当你点击屏幕上的任何地方时,精灵就会激活 编辑-是的,它有一个2d长方体碰撞器 我的代码如下: using UnityEngine; using System.Collections; public class mute : MonoBehaviour { public bool isMuted = false; public Sprite mute1, mute2; priva

我在谷歌上搜索了很多,只找到了非常复杂的方法。我也找到了这个函数,但我一直无法使它工作

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

编辑-是的,它有一个2d长方体碰撞器

我的代码如下:

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 = 
使用UnityEngine;
使用系统集合;
公共类哑巴:单一行为
{
公共bool isMuted=false;
公共精灵静音1、静音2;
私人喷灌工;
私有void开始()
{
spriteender=GetComponent();
if(spritenderer.sprite==null)
spriteRenderer.sprite=mute1;
}
私有无效更新()
{
if(Input.GetKeyDown(KeyCode.Mouse0))
{
如果(!isMuted)
{
AudioListener.pause=true;
AudioListener.volume=0;
Ismute=true;
ChangeSprite();
}
其他的
{
AudioListener.pause=false;
AudioListener.volume=1;
Ismute=假;
ChangeSprite();
}
}
}
私有void ChangeSprite()=>spriteender.sprite=
spritenderer.sprite==mute1?mute2:mute1;
}

首先,我认为您应该在游戏对象上安装一个碰撞器,对于单击,您应该使用某种光线投射。您可以使用
Input.GetMouseButtonDown(0)
而不是
Input.GetKeyDown(KeyCode.Mouse0)

我将Input.GetKeyDown(KeyCode.Mouse0)更改为Input.GetMouseButtonDown(0),无论我在哪里单击,它都会激活

不管你点击哪里,它都会激活,这并不是很奇怪,因为你并没有把它限制在一个特定的位置。现在你只是检查一下

input.GetMouseButtonDown(0)
您需要检查单击是否在某个区域内,或是否击中某个对象。所以你可以通过你现在的鼠标位置来限制它,比如这样

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

或者你可以使用光线投射来确定你当前击中的对象。在几乎所有场景中,我都会积极建议这一点。有关光线投射的更多信息,请查看

我不是100%确定unity与3D相比如何处理2D事物,但我相当确定光线投射的原理是相同的,所以尝试一下如下图所示,并将其粘贴在您希望单击的脚本中的更新下

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();
    }
}
if(Input.GetTouch(0)/*| | buttondown或您想要的*/)
{
fingerPos=Input.GetTouch(0).position;//或buttondown
Vector3 realPos=Camera.main.ScreenToWorldPoint(fingerPos);
if(realPos.transform.position.x>=spritterender.transform.position.x-10
&&realPos.transform.position.x=spritterenderer.transform.position.y-10
&&使用OnMouseDown的realPos.transform.position.y
最简单的方法是将此功能添加到任何附加到包含精灵的游戏对象的脚本组件中:

void OnMouseDown(){
    Debug.Log("Sprite Clicked");
}
游戏对象还需要一个碰撞器。2D和3D碰撞器都可以工作

与其他方法的比较 光线投射在物理上只适用于一种碰撞器类型。光线投射仅适用于3D碰撞器和物理2D碰撞器。光线投射仅适用于2D碰撞器。
OnMouseDown
同时适用于两种碰撞器,但其性能可能与执行两种光线投射的性能一样差


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

Vector3 mousePos=Camera.main.ScreenToWorldPoint(Input.mousePosition);我现在就做这个更改,希望这就是我的问题所在。@barnstokr我在哪里使用它?我更改了Input.GetKeyDown(KeyCode.Mouse0)输入。GetMouseButtonDown(0),无论我在哪里单击抱歉,它都会激活,但如果我问如何制作“精灵”可点击..不是如何使整个屏幕可点击并激活精灵..谢谢你的建议,如果我做了更改,现在会起作用吗?我没有跟上光线投射的速度,雪人已经更改了它,但无论我点击哪里都会激活。有什么简单的想法吗?看起来是一个更容易的选择,但我想我现在必须导入光线投射吗t it said Assets/mute.cs(33,37):错误CS0117:
UnityEngine.Physics'不包含对
RayCast'Sorry@MIke,我的意思是RayCast;中途没有大写字母。我现在已经更改了答案。哦,没问题,对不起,我应该已经注意到了。bugger它不起作用..不确定为什么..没有造成任何错误只是现在根本没有激活精灵。code已经被放在你试图点击的对象中,它也有一些描述的对撞机?非常感谢,很抱歉迟了回复…是的,这正是为什么我不想使用基于位置的代码,因为我一直在改变主意和移动东西…我会尝试一下…我不知道raycast 2d…我在谷歌上搜索了它,然后我发现ray cast在2d上不起作用,但谢谢你让我知道:P我将在几个小时内试一试,祈祷这是我想要的:P再次感谢。没问题。我刚刚意识到你的建议
OnMouseDown