C# 未调用Unity 3D新UI EventSystem接口方法
我对新的UI事件系统有问题 我已经编写了一个基本的独立解析库来帮助GUI。一切都很好,没有问题 我刚刚添加了一个基本按钮组件,它基本上只是将一个精灵作为背景,并允许在顶部包含一个基本文本标签。它还实现了一些指针事件——我目前正在尝试添加鼠标悬停支持C# 未调用Unity 3D新UI EventSystem接口方法,c#,unity3d,C#,Unity3d,我对新的UI事件系统有问题 我已经编写了一个基本的独立解析库来帮助GUI。一切都很好,没有问题 我刚刚添加了一个基本按钮组件,它基本上只是将一个精灵作为背景,并允许在顶部包含一个基本文本标签。它还实现了一些指针事件——我目前正在尝试添加鼠标悬停支持 using UnityEngine; using UnityEngine.EventSystems; public class UIButton : UISprite, IPointerEnterHandler, IPointerExitHandl
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
extendmonobhavior
?这是自您发布更新以来我唯一能真正发现的东西。是的,我想知道在扩展类上而不是在基上实现接口是否会导致问题。然而,我在真实场景中丢弃了一个相同的调试对象,我也得到了同样的缺陷我想知道还有一个不同点——由于背景粒子系统,场景中有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);
}