手头的问题:
简
鉴于UnityEngine.Ui.Image如何在ScreenSpace单位(如400,300)中找到该图像内的标准化偏移(如左上角0.4,0.3)的X,Y位置
我想我需要找到左上方的ScreenSpace值,然后知道图像的渲染总大小按照像素表示的实际大小比例缩放归一化偏移量.
图2显示了要使用的normalisedOffsets
所以,在精确的情况下,我需要找到我在图像上存储的Rect的topLeft的ScreenSpace像素中的偏移量.
我认识到它可能是Camera.main.ViewportToWorldPoint()和一些对边界的引用的组合,可能通过backgroundImage.sprite.pixelsPerUnit进行缩放?
努力想象如何完成这项工作.
谢谢
Unity 版本: 5.6.5f1 个人版
TextMesh 专业版: 1.0.56.0b3
我有一个 TextMesh Pro UI Text 对象,其区域与 UI 图像的区域相交。文字是动态的,但图像永远不会改变。有没有办法让 TextMesh Pro UI 文本在图像周围流动,类似于文本在 HTML/CSS 中环绕到一侧的方式?
下图显示了 Unity 中对象的两个副本。一个对象,用图像所在的红色空间表示,是我目前得到的。文本进入图像的空间。另一个对象,由图像所在的蓝色空间表示,显示文本正确环绕的所需结果。
当前与预期结果:

迄今为止的研究:
如何将图像放入文本中?- 我使用的图像是 UI 图像,而不是文本资产。图像将只充当好像它是内联与文本。
你如何在矩形周围环绕文本?, Unity UI 的流体布局- 这些是我正在寻找的。但是,没有在其中发布任何建议。
我探索了使用多个 TextMesh Pro UI 文本对象的想法,每个对象都充当完整文本区域的一个片段。但是,这与在图像周围环绕文本不同。对于动态文本,如果我从一个文本区域拉取内容并将其推入下一个区域,这将与自动调整大小功能冲突并导致字体大小不等。
另一种可能性是我可以一次插入一个字符,检查添加另一个字符是否会导致与图像发生冲突,然后添加System.Environment.Newline以防止这种情况发生。但是,我担心处理大量文本会带来潜在的性能问题。
TextMesh Pro 文档- TextMesh Pro 文档有一些用于查找自动换行点的工具,但我还没有想出如何实现将其与另一个对象的锚点位置进行比较的方法。
我正在处理一个组件,我需要在 Start 函数中正确定位 HorizontalLayoutGroup 的子项。
我可以通过执行以下操作强制 HorizontalLayoutGroup 重建:
public HorizontalLayoutGroup horizLayoutGroup;
public RectTransform exampleChild;
private void Start()
{
horizLayoutGroup.CalculateLayoutInputHorizontal();
horizLayoutGroup.CalculateLayoutInputVertical();
horizLayoutGroup.SetLayoutHorizontal();
horizLayoutGroup.SetLayoutVertical();
Debug.Log(exampleChild.anchoredPosition);
}
Run Code Online (Sandbox Code Playgroud)
但这样做似乎很奇怪:
public RectTransform horizRectTransform;
public RectTransform exampleChild;
private void Start()
{
LayoutRebuilder.ForceRebuildLayoutImmediate(horizRectTransform);
Debug.Log(exampleChild.anchoredPosition);
}
Run Code Online (Sandbox Code Playgroud)
不起作用,因为据我从源代码中可以看出 LayoutRebuilder.ForceRebuildLayoutImmediate 正在调用相同的函数:
public static void ForceRebuildLayoutImmediate(RectTransform layoutRoot)
{
var rebuilder = s_Rebuilders.Get();
rebuilder.Initialize(layoutRoot);
rebuilder.Rebuild(CanvasUpdate.Layout);
s_Rebuilders.Release(rebuilder);
}
public void Rebuild(CanvasUpdate executing)
{
switch (executing)
{
case CanvasUpdate.Layout:
// It's unfortunate that we'll perform the same GetComponents querys for the tree 2 times, …Run Code Online (Sandbox Code Playgroud) 我查看了此处处理相同问题的帖子,但它既没有说明问题所在,也没有解决我的问题。
我创建了一个 Canvas 预制件,面板内有许多按钮。我在运行时实例化预制件并抓取Button面板内的所有对象。onClick()然后,我为调用相同clicked()方法的所有按钮添加一个事件侦听器
public class GameOptions
{
private GameObject canvas;
public GameOptions(GameObject canvas)
{
this.canvas = canvas;
GameObject.Instantiate(canvas);
Text[] textObjects = canvas.GetComponentsInChildren<Text>();
Button[] buttonObjects = canvas.GetComponentsInChildren<Button>();
for (int i = 0; i < buttonObjects.Length; i++)
{
Debug.Log(buttonObjects[i].name);
buttonObjects[i].onClick.AddListener(() => clicked());
buttonObjects[i].onClick.Invoke();
}
}
public void clicked()
{
Debug.Log("Clicked!");
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,当我通过代码调用该事件时,clicked()将被调用并“单击!” 正确输出到控制台。
但是,单击时没有任何按钮触发事件。我还注意到,检查器中 OnClick 中的 PersistentCalls.Calls 数组在运行时为所有按钮都有 0 个元素。
我在 Windows 10 64 中使用 Unity 2017.4.3f1。
您好,我正在尝试在统一(梯形)上创建自定义按钮。我在 Photoshop 上成功创建了可见区域,并将其导入为 Sprite 2D UI,如下图所示:
问题出现了,当我尝试选择游戏中的一个按钮时,它们的边框相互重叠,因为透明区域仍然被视为可点击按钮区域的一部分。我怎样才能删除这个?
编辑:
实际上,当我导入时,我希望方框不计入图像中。我需要将橙色区域的边缘与该区域齐平,而不是整个区域(即包括透明框)。
我目前正在为 Android 开发 Highscore 系统。我有一个输入字段,玩家可以在其中输入他们的名字。
我想要它,这样玩家就不必点击这个输入字段来输入内容。 然而,到目前为止我所有的尝试都失败了。
我在HighScoreTemplate.cs脚本中创建了一个Select()函数,它将在输入字段上调用.Select() ,然后调用.ActivateInputField()。
public void Select()
{
// Select it
NameField.Select();
NameField.ActivateInputField();
}
Run Code Online (Sandbox Code Playgroud)
然而,这并没有自动选择 NameField 输入字段,因为我的 Android 设备上没有弹出键盘。
我已经通过调试验证了这个 Select() 函数正在被调用并运行。
我还验证了该输入字段是可交互的,当我选择它时,我可以在检查器中看到它选中的复选框。
然后我假设 Unity 可能有延迟,所以我尝试进行此测试以查看它是否有效:
int counter = 1;
while(counter <= 50 && !_newHighScoreTemplate.NameField.isFocused)
{
_newHighScoreTemplate.Select();
Debug.Log("Select Attempt #" + counter);
counter++;
}
Run Code Online (Sandbox Code Playgroud)
这个测试给了我同样的结果,Android 键盘没有弹出并允许我在输入字段中输入文本。
我最近一直在使用新的 Unity UI 工具包 (Unity 2021.1),但注意到 UI 生成器不包含进度栏的定义。这似乎是游戏的标准部分(健康统计等),令我震惊的是,我既意识到没有内置组件,又找不到关于它的指南。我确信我一定是在错误的地方寻找,并希望有人能指出我正确的方向。
我当前的方法是使用 Slider 组件并尝试通过自定义 USS 工作表进行样式设置。然而,我注意到新的 UI 系统与旧的不同,并且无法指定“覆盖”颜色。关于如何处理这个问题有什么建议吗?我看过 UI Toolkit 示例的屏幕截图,其中示例中包含进度条;然而,当前的样本没有这个。
非常奇怪的问题,我有一个 Canvas 对象,我正在尝试将 overrideSorting 标志设置为 true。
public void SetSortingLevel(string sortinglayerName)
{
_canvas.overrideSorting = true;
_canvas.sortingLayerName = sortinglayerName;
}
Run Code Online (Sandbox Code Playgroud)
但是,通常这是有效的,但是如果我放置一个断点并查看代码,即使在将覆盖设置为 true 之后,它也是 false:
api 显示这只是一个 setter/getter。知道为什么会这样吗?
我以前用过这个代码,它正常工作。
注意:这是一个嵌套的画布,因此应该允许设置其排序层。
回答:正如下面的回答中所指出的,activeInHierarchy 检查结果是错误的。
我有一个问题,我尝试在游戏中创建一个评分系统,玩家根据他行驶的距离获得分数,而 vs 代码无法识别“使用 UnityEngine.ui;” 我已经尝试将 vs code 切换到较低版本(我转到了 1.1.3),但它不起作用。这是我的代码:
