问题标签 [unity-ui]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 在嵌套的 UI 元素上检测 IPointerEnterHander
我有一张卡片,上面有一些图标。该卡上有一个 IPointerEnterHandler ,它工作正常,当鼠标进入对象时被调用。该卡有一个隐藏的按钮,覆盖表面。
问题是,有一些嵌套的游戏对象我想检测 IPointerEnterHandler 事件。我在这些对象上有 IPointerEnterHandler 侦听器,但它们不会触发。
如果我将它们从卡中移除,它们会在悬停时发射。但是,在卡上时,它们不会开火。
这是一个视觉示例,层次结构和箭头对应于图标及其在层次结构中的位置:
我尝试在 Update 调用中使用 EventSystem,但 currentSelectedObject 始终是卡片(或者更确切地说是覆盖它的卡片按钮)。
你知道我如何检测这些嵌套对象(它们上方有一个 UI 元素占用事件)上的鼠标悬停事件吗?如果可能的话,我想避免使用 RayCasting。
临时解决方案:
我暂时使用了光线投射。我在小图标上放了一个对撞机,并在鼠标悬停在卡片上时检查它是否击中:
我本来希望图标来处理这个逻辑,但这暂时有效。欢迎提出更好的建议。
unity3d - Unity Canvas 图像着色器的 Object-To-Clip
TL; 博士
将着色器应用于UI.Image
Unity3D 画布中的对象时,UNITY_MATRIX_MVP
似乎与画布渲染器相关,而不是正在绘制的图像对象本身。
有没有一种方法可以计算 Image 对象的局部空间中一个点的剪辑空间坐标,而不仅仅是相对于 Canvas 根?
概述
作为着色器的预处理步骤,我正在计算屏幕上出现在此模型中的图像四边形的、x_min
和:x_max
y_min
y_max
UnityObjectToClipPos
我的基本方法是使用(仅使用内置转换矩阵)手动计算 4 个角的剪辑空间位置UNITY_MATRIX_MVP
,然后从中获取最小/最大值。
我发现这适用于SpriteRenderer
或MeshRenderer
组件,但对于UI.Image
画布中的组件UNITY_MATRIX_MVP
似乎仅相对于画布父级,而不是图像对象本身,这意味着我不能使用它来计算相对于图像的位置。
细节
你可以在这里找到完整的着色器:https ://gist.github.com/JohannesMP/5a74fcc41d77f281a5900021c01f2356
对于给定的对象空间坐标UnityObjectToClipPos
,首先使用齐次剪辑空间坐标,然后将其移动到屏幕 UV 空间中(在屏幕上可见时值范围从 0 到 1):
由于在对象空间中定义单位四边形的 4 个顶点是微不足道的(在对象空间 X/Y 轴上仅偏移 0.5),因此屏幕上的最小/最大值可以计算如下:
请注意,我目前不打算优化最小/最大逻辑。
为了验证最小/最大值的计算是否正确,可以在绘制对象时将它们用于红色和绿色通道。
例如,要验证它是否有效x_min
,y_min
可以使用以下片段着色器:
对于MeshRenderer
四边形和SpriteRenderer
对象,结果如下:
- 随着
x_min
增加,红色通道也增加。 - 随着
y_min
增加,绿色通道也增加。
测试最大值也会产生预期的结果。
但是,UI.Image
在画布中的组件上测试相同的着色器时,它不能按预期工作:
尽管UI.Image
对象(将着色器设置为其材质)在屏幕上移动,但其颜色不会改变。但是,当在编辑器场景视图中移动编辑器相机时,颜色会发生变化。
这似乎意味着UnityObjectToClipPos
,以及UNITY_MATRIX_MVP
它所依赖的矩阵,与 Canvas Parent 对象相关,而不是与父对象内的 Image 对象相关。
问题
我的假设是否正确,UNITY_MATRIX_MVP
即相对于画布对象,而不是正在绘制的 Image 对象?如果是这样,是否有另一种方法可以专门为 Image 对象获取 MVP 矩阵?或者,是否有任何其他方法可以在着色器中计算图像局部空间中某个点的剪辑空间位置?
- 我正在使用 Unity 2017.1.2f1
- 着色器
DisableBatching
标志已启用
image - Unity Sprite 编辑器:您可以在设置 Pivot 时预览背景图像吗?
我用谷歌搜索了很多,我检查了 Unity 资产商店,但我似乎找不到我认为是一个常见问题(或者我做错了)。
问题是当我使用 Sprite Editor 时,我看不到对设置 sprite 枢轴有用的参考图像。
当我在给定的图像文件上打开 Sprite 编辑器时,我似乎无法添加背景参考图像:
我希望能够看到可以定位的背景图像(例如特定字符),然后使用它来设置轴心。
你知道有什么方法可以做到这一点吗?Asset Store 引用是可以接受的。
我找到了一个用于动画轴设置但不是用于静态图像的。
欢迎任何和所有建议(如果您有减轻此问题的工作流程建议,请随时提出建议:))
c# - Unity:为什么我不能自动选择我的输入字段?
我目前正在为 Android 开发一个 Highscore 系统。我有一个输入字段,玩家将在其中输入他们的名字。
我想要它,这样玩家就不必点击这个输入字段来输入它。 然而,到目前为止,我所有的尝试都失败了。
我目前有一个名为HighScoreTemplate的预制件。这个预制件有一个 UI 输入字段(用于名称)和 UI 文本对象(用于乐谱)。它还有一个名为HighScoreTemplate.cs的脚本。
我在HighScoreTemplate.cs脚本中创建了一个Select()函数,该函数将在输入字段上调用.Select() ,然后在之后调用.ActivateInputField()。
但是,这不会自动选择 NameField 输入字段,因为我的 Android 设备上没有弹出键盘。
我已经通过调试验证了这个 Select() 函数正在被调用和运行。
我还验证了这个输入字段是可交互的,当我选择它时,我可以在检查器中看到它的复选框。
然后我假设 Unity 可能有延迟,所以我尝试了这个测试,看看它是否有效:
这个测试给了我同样的结果,android 键盘没有弹出并允许我在输入字段中输入文本。
有人可以阐明我做错了什么吗?为什么我的输入字段没有获得焦点,为什么 Android 中的键盘没有弹出以便我可以在字段中输入而无需先点击它?
c# - -Unity-无论点击了哪个错误按钮,都按顺序提供反馈提示
我是一名教育研究员,为我的博士课程开发游戏。我正在通过教程和论坛随时随地学习。
我有这个带有测验面板的场景(即 4 个按钮 - 1 个正确答案和 3 个错误答案)
无论单击了哪个错误按钮,我都想知道如何按顺序提供反馈提示。
这些是面板的一些图片和我目前拥有的代码。
我所做的就是将每个提示分配给某个错误的答案按钮。但是这种方法对我的研究来说不会很有趣,特别是因为第三个提示实际上是一个答案赠品。因此,如果学生点击了我手动分配的第三个提示的错误答案,他们将在银盘上得到答案,而我的数据很糟糕。= (
请记住:无论学生单击哪个错误按钮,我都需要按顺序显示提示 1、2 和 3。
EXTRA REQUEST = ) : 有没有办法以更经济有效的方式管理这些面板游戏对象?
任何帮助将不胜感激!(特别是因为我已经烧毁了大量的神经元试图自己弄清楚......哈哈!)
c# - 错误的数字将int转换为字符串c#
我有简单的硬币计数器,在 2d Unity 游戏中。但它把一枚硬币算作 2。我认为这是因为错误地将 int 转换为 string。
因此,在调试日志中它显示正确的总量,但在 UI 中,它显示错误的数字。例如,当总金额为 1 时,它显示 2 等。
unity3d - Unity - 界面按钮从带有凹口的手机上的图形“错位”
我们正在移植到移动设备的游戏遇到了这个奇怪的问题:所有 UI 元素都可以正常工作,除非您在有凹槽的手机(例如 iPhoneX)上运行它。当发生这种情况时,界面会重新调整以适应设备的安全区域,这会在极端情况下创建两个黑条(目前还可以)。然后,您必须单击以激活任何按钮的区域不再对应于按钮图形本身。
就好像输入检测区域被拉伸以覆盖手机的整个区域,但图形被缩小,“错位”了输入触摸区域。
下图显示了问题:
注意红色涂鸦显示安全区域之外的区域,绿色圆圈显示按钮输入的实际位置。
附加信息:为了使关卡正常工作,我们必须使用 Screen.SetResolution() 将分辨率强制为 1080。这可能与问题有关吗?
c# - 捕捉到滚动视图元素
我在 Unity3D 中有一个滚动视图,其中包含我的所有元素。它只水平滚动,并且在任何时候都可以看到多个子元素。大多数情况下这将是 6,在极少数情况下可能是 5。设置是 2 行,每行 3 个对象
正如您所看到的,大多数时候它是 6 个(以及 7/8 号的一部分)对象,在极少数情况下它可能是 5 个。(例如,接近尾声)
我想要的是:拖动对象时,它总是捕捉到 6 个居中的对象。因此,当我有 12 个对象并且用户稍微拖动窗口时,我希望它捕捉到最接近的 6 个。我使用 Unity 的 Scroll Rect 窗口和它下方的水平布局组来实现我当前的结果。使用以下设置: 其中“GameGrid”只是一个带有水平布局组的空对象。在游戏网格下方,游戏图块是在运行时制作的。