现在,在Unity中拖动UI元素非常容易:制作一些UI项目.添加组件 - >事件 - > 事件触发器.放在下面的脚本上.单击以添加四个明显的触发器.你完成了.
然而.
我完全迷失了指针坐标和UI坐标之间的关系(如RectTransform中所见,等等).
在DragIt下面:你怎么在手指下正确移动UI面板?
假设你有一个大面板,十个UIButton坐在面板Dragster上,按钮上.RectTransform坐标和鼠标指针之间的关系是什么...
简而言之,如何在DragIt()下方移动其中一个按钮?
/* modern Unity drag of UI element */
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Events;
using UnityEngine.EventSystems;
public class Dragster:MonoBehaviour
{
public int index; // number each of your UI items
static bool beingDragged = false;
static int dragFrom;
public void DragStart()
{
beingDragged = true; dragFrom = index;
}
public void DragIt()
{
? ? W T F ? ? …Run Code Online (Sandbox Code Playgroud) 假设你想在Unity UI中使用普通的刷新左流.例子:
事实上,为了回答这个问题,我已经实现了冲洗左流"艰难的方式".在Unity autolayout中设置一个"垂直行组",在顶层附加FattieFlow,
public class FattieFlow : MonoBehaviour
{
public GameObject modelRow;
public GameObject modelItem;
public void Flow()
{
screen = GetComponent<RectTransform>().rect.width;
// move downwards any which need to be moved downwards
int row = 0;
while (row < transform.childCount) // (dynamic)
{
if (transform.GetChild(row).gameObject.activeSelf) FlowRow(row);
++row;
}
// et cetera....
}
}
Run Code Online (Sandbox Code Playgroud)
FattieFlow将完全重新流动它向左冲(通过操纵线条,艰难的方式).这是一个脚本,演示等:艰难的方式.
但这是一个糟糕的解决方案.
理想情况下,从 UI.HorizontalLayoutGroup和UI.VerticalLayoutGroup 开始应该可以创建
FlowLayoutGroup它放置,向左冲,进入一个块.(事实上,它应该根据需要扩展,依此类推......就像HorizontalLayoutGroup行为一样).
你似乎必须HorizontalOrVerticalLayoutGroup从那里开始并在那里工作.
如何将一个做到这一点(如果它不存在)?
我编写了自定义布局所需的自定义内容装配工.所以,RectTransform.sizeDelta当锚点不相同时我需要控制属性,但我不能得到它显示这个值.
我不需要Unity3D API参考,我读它并且没有任何内容因为它只是说:
此RectTransform的大小相对于锚点之间的距离.如果锚在一起,sizeDelta与大小相同.如果锚点位于父级的四个角中的每一个中,则sizeDelta是矩形与其父级相比的大小.
任何人都可以用正常语言解释这是什么意思?当锚点不相同时,如何手动计算?
令人惊讶的团结,多年来只有这样简单地缩放实际PNG是使用非常真棒库http://wiki.unity3d.com/index.php/TextureScale
以下示例
如何使用Unity5功能缩放PNG?现在必须有一种新的UI等方式.
因此,缩放实际像素(例如in Color[])或字面上的PNG文件,可能是从网上下载的.
(顺便说一下,如果你是Unity新手,那么这个Resize电话是无关的.它只会改变一个数组的大小.)
public WebCamTexture wct;
public void UseFamousLibraryToScale()
{
// take the photo. scale down to 256
// also crop to a central-square
WebCamTexture wct;
int oldW = wct.width; // NOTE example code assumes wider than high
int oldH = wct.height;
Texture2D photo = new Texture2D(oldW, oldH,
TextureFormat.ARGB32, false);
//consider WaitForEndOfFrame() before GetPixels
photo.SetPixels( 0,0,oldW,oldH, wct.GetPixels() );
photo.Apply();
int newH = 256;
int newW = Mathf.FloorToInt(
((float)newH/(float)oldH) * …Run Code Online (Sandbox Code Playgroud) 看看Unity论坛和问答网站中的一些答案,如何制作隐形按钮的答案不起作用,因为删除与按钮相关的图像使其无效.
你如何绕过这个并保持隐形属性,同时允许按钮实际工作?
想想Canvas你可能拥有的任何Unity.UI .
想象一下PanelCanvas上的一个典型.说它恰好包含一些图像,也许是一些文本等等.
如果您可以将该面板(仅面板)转换为屏幕截图:Texture2D或PNG,将会非常方便.
我唯一能想到的就是在屏幕上使用ReadPixels和搞清楚问题的区域Panel(实际上这非常棘手); 并且仅当面板恰好是正方形而不是以一定角度旋转时才有效.
您认为,应该有一种方法来渲染一个Panel,或者至少一个整个画布?我一无所获.
在示例中,将粉红色面板设为PNG图像.哎哟.
(显然,如果有人的解决方案仅仅是"整个画布",而不是一个小组,当然即使这是令人钦佩的.)
我有一个输入字段,其中包含一些有关选择和取消选择的重要处理程序。它的设置有:
其他什么都没有改变;我不包括这些处理程序,因为没有它们问题也可以重现。
当我按 Enter 时,输入字段会确认输入、取消选择并调用事件。Esc 键也是如此,只是要取消输入。
当我按 Enter 时,输入字段似乎保持选中状态,未调用事件处理程序,但我无法键入文本,如果我再次按 Enter,输入字段似乎会再次激活(它选择所有文本,并且我已打开)焦点 - 选择全部启用)。Esc 键也有同样的问题。
我发现按下 Enter 键时会调用On End Edit事件,但如何取消选择输入字段?它应该调用On Deselect事件,并且不应在 Enter 时再次激活。我尝试拨打电话DeactivateInputField,但没有成功。
Unity中是否有一种方法可以在不使用UI层的情况下创建简单的2D按钮.我有一个有很多按钮的游戏,我不想在UI中制作整个应用程序.还欢迎更多控件:开关,滑块等.
PS.我看到了NGUI,到目前为止我还不喜欢它.还要别的吗?
在当前的Unity中,
对于任何"Sprite(2D和UI)",实际上它始终默认为打开"生成Mip贴图".
因此,每次放入图像时,都必须将其"关闭"并应用.
我根本看不到任何想要使用带有平面精灵的mipmap的情况.如果它们在你的Unity.UI(按钮等)中逐字使用,你永远不会想要mipmap,如果它们是精灵,你永远不会想要使用mipmap(事实上,它们通常用于像素完美的用途).
只有纹理(在3D东西上)才能看到"非常接近"或"处于掠角" - 这些概念似乎与"Sprite(2D和UI)"技术无关.
这只是Unity的一个不重要的错误("他们意外地默认启用了切换"),还是在某种情况下你用mipmap图标等?
我担心单指移动代码OnPointerDown与之间的区别OnBeginDrag.
(在使用物理raycaster的最新Unity范例中:最后,Unity将正确地忽略UI层上的触摸.
所以从2015年开始你必须做的是:
忘记垃圾传统Input或Touches系统废话甚至Unity承认是完全没有意义的废话 - 因为他们不工作
添加一个空的游戏对象,通常是BoxCollider2D,可能比屏幕大.使图层"绘制"(物理设置,它与任何东西互动)
只需添加到相机,2D或3D物理raycaster.事件掩盖你的"绘图"图层.
做一个像下面这样的脚本并把它放在"画画"上.
(提示 - 不要忘记简单地添加一个EventSystem场景.奇怪的是,Unity在某些情况下不会自动为你做这件事,但Unity会在其他情况下自动为你做这件事,所以如果你忘记了它会很烦人!)
但这是问题所在.
在使用OnPointerDownvs OnBeginDrag(和匹配的结束调用)之间必须有一些细微的差别.(您可以在以下代码示例中交换操作.)
Unity自然没有提供任何指导; 下面的代码精美地拒绝了流浪抓取并且完美地忽略了你的UI层(感谢Unity!最后!)但是我对这两种方法之间的区别(开始拖动V开始触摸)完全神秘化了,我无论如何都找不到逻辑区别在单元测试中两者之间.
答案是什么?
/*
general movement of something by a finger.
*/
using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;
public class FingerMove:MonoBehaviour,
IPointerDownHandler,
IBeginDragHandler,
IDragHandler,
IPointerUpHandler,
IEndDragHandler
{
public Transform moveThis;
private Camera theCam;
private FourLimits thingLimits;
private Vector3 prevPointWorldSpace;
private Vector3 thisPointWorldSpace;
private Vector3 realWorldTravel;
public void Awake() …Run Code Online (Sandbox Code Playgroud) 如何在文本UI对象上统一添加文本大纲?
我想在设计器/编辑器视图中执行此操作.我无法找到任何有用的主题,我也无法看到如何从设计师的视图中添加它.
我的项目是2d,我使用的是最新的统一版本5.3.我想达到类似的效果.
这是我在找不到解决方案后不得不自己解决的问题。
问题在于,从 ScrollRect 的内容中删除 GameObject 元素后,它不会钳制其标准化位置,直到用户再次开始移动它。这可能会导致 ScrollRect 在显示最后一个元素时显示空白空间并且已停用父元素的最后一个元素。
unity3d-ui ×13
c# ×3
button ×1
mipmaps ×1
png ×1
sprite ×1
textures ×1
touch ×1
transparent ×1
unity5 ×1
unityscript ×1