Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.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# 未调用Unity 3D新UI EventSystem接口方法_C#_Unity3d - Fatal编程技术网

C# 未调用Unity 3D新UI EventSystem接口方法

C# 未调用Unity 3D新UI EventSystem接口方法,c#,unity3d,C#,Unity3d,我对新的UI事件系统有问题 我已经编写了一个基本的独立解析库来帮助GUI。一切都很好,没有问题 我刚刚添加了一个基本按钮组件,它基本上只是将一个精灵作为背景,并允许在顶部包含一个基本文本标签。它还实现了一些指针事件——我目前正在尝试添加鼠标悬停支持 using UnityEngine; using UnityEngine.EventSystems; public class UIButton : UISprite, IPointerEnterHandler, IPointerExitHandl

我对新的UI事件系统有问题

我已经编写了一个基本的独立解析库来帮助GUI。一切都很好,没有问题

我刚刚添加了一个基本按钮组件,它基本上只是将一个精灵作为背景,并允许在顶部包含一个基本文本标签。它还实现了一些指针事件——我目前正在尝试添加鼠标悬停支持

using UnityEngine;
using UnityEngine.EventSystems;

public class UIButton : UISprite, IPointerEnterHandler, IPointerExitHandler
{
    /* button stuff removed for clarity */

    private bool isMouseOver;

    public bool IsMouseOver { get { return this.isMouseOver; } }

    public void OnPointerEnter(PointerEventData eventData)
    {
        this.isMouseOver = true;
    }

    public void OnPointerExit(PointerEventData eventData)
    {
        this.isMouseOver = false;
    }
}
问题很简单——无论是在编辑器中还是在运行构建时,这两种方法都不会触发

我目前正在使用另一个脚本将这些组件添加到场景中,如果这有什么不同的话

我已经在网上浏览了一段时间,但我发现的每个例子似乎都表明这是正确的方法

有人吗


更新:

我刚刚看到它建议我需要在继承人的某个地方添加一个
EventSystem
组件。它还建议您在canvas对象上需要一个
Graphic Raycaster
组件

我创建了一个空白场景,包括以下内容:

Scene (EventSystem)
    Canvas (Canvas, GraphicRaycaster)
        Button (Image, DebugEventScript)
DebugEventScript就是这样:

using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using UnityEngine.UI;

public class DebugEventScript : MonoBehaviour, IPointerEnterHandler
{
    public void OnPointerEnter(PointerEventData eventData)
    {
        Debug.Log("finally!");
    }
}
这个测试场景很有效


然而,我的实际场景,尽管包含相同的组件,仍然不会引发任何事件。

我非常确定您需要
使用UnityEngine.UI

另外,请确保附加此脚本的
游戏对象
具有
图像
组件,并且位于
画布


除此之外,它真的应该像写的那样工作,否则您的问题超出了上述代码。

将“Physics Raycaster”脚本添加到您的相机中

通过操作代码,我可以得到一个UI图像,在鼠标上方改变颜色。我对班级申报行感到困惑

public class m1_btn1_ctrl : MonoBehaviour, IPointerEnterHandler
如果我不使用处理器,我似乎无法让它工作

如果我想设置IpointerExitHandler,我可以将其附加到末尾,然后用相同的脚本编写函数吗?或者我需要为退出函数制作一个全新的脚本吗?我假设按下,点击,释放,拖动,事件

下面是我的脚本,供那些对ui图像和OneNet事件的颜色变化感到好奇的人使用

public class m1_btn1_ctrl : MonoBehaviour, IPointerEnterHandler
{

公共游戏对象按钮1;
图像img;
//用于初始化
无效开始()
{
button1=游戏对象。查找(“m1_btn1”);
img=button1.GetComponent();
}
公共void OnPointerEnter(pointereventdataeventdata)
{
Log(“输入指针”);
img.color=newcolor32(0,255,255,255);
}

}

我添加了额外的2个using,并仔细检查了
GameObject
Canvas
节点下有一个
Image
——一切看起来都很好。问题中的图像在屏幕上的显示完全符合预期,所以我认为这一点是可以的。我不知道我还能在哪里找到-
OnPointerEnter
包含一个
Debug.Log
,它根本就不会触发(是否
UISprite
extend
monobhavior
?这是自您发布更新以来我唯一能真正发现的东西。是的,我想知道在扩展类上而不是在基上实现接口是否会导致问题。然而,我在真实场景中丢弃了一个相同的调试对象,我也得到了同样的缺陷我想知道还有一个不同点——由于背景粒子系统,场景中有2个
画布
对象。正如在沙箱中确认的那样,我猜一定是存在额外的对象/组件导致了问题。它们不是嵌套的或任何疯狂的东西,但即使如此,也有可能值得进行一些测试。哦,如果您有多个画布,那么这一定是一个深度问题。其中之一是阻止指向此画布的指针光线投射,因为它具有深度优先级。这当然有一定的意义,我感觉问题的根源就在这里。我将另一个
画布
移到了一个单独的位置根元素,将其层更改为
IgnoreRaycast
,并更新了我的粒子系统,以将该层克隆到它生成的所有对象。我还更新了我尝试用于遮罩该层的
画布。但目前仍然没有任何内容..:(
public GameObject button1;
Image img;


// Use this for initialization
void Start ()
{
    button1 = GameObject.Find("m1_btn1");
    img = button1.GetComponent<Image>();

}


public void OnPointerEnter(PointerEventData eventData)
{
    Debug.Log("Pointer Entered");
    img.color = new Color32(0, 255, 255, 255);
}