Unity3d Unity:如何在游戏对象(文本或图像)周围创建一个与Unity编辑器中类似的选择框?

Unity3d Unity:如何在游戏对象(文本或图像)周围创建一个与Unity编辑器中类似的选择框?,unity3d,Unity3d,在我的Unity应用程序中,用户可以选择输入文本和导入图像。我分别使用TMP_输入字段和图像/精灵实现了这些。该应用程序还要求用户知道当前选定的文本/图像,还可以拖动这些文本和图像,有时还可以调整它们的大小 要实现这一点,我需要的是这样一个UI 这是实际的Unity编辑器。但我想在我的应用程序中,在我的文本和图像周围有一个类似的框。以便用户知道当前选择,也可以拖动文本/图像或使用角落中的蓝色圆圈调整其大小 我不知道如何才能做到这一点。我看到的一种方式是使用视图包装我的文本和图像,这些视图将这些

在我的Unity应用程序中,用户可以选择输入文本和导入图像。我分别使用TMP_输入字段和图像/精灵实现了这些。该应用程序还要求用户知道当前选定的文本/图像,还可以拖动这些文本和图像,有时还可以调整它们的大小

要实现这一点,我需要的是这样一个UI

这是实际的Unity编辑器。但我想在我的应用程序中,在我的文本和图像周围有一个类似的框。以便用户知道当前选择,也可以拖动文本/图像或使用角落中的蓝色圆圈调整其大小

我不知道如何才能做到这一点。我看到的一种方式是使用视图包装我的文本和图像,这些视图将这些框作为背景


但我认为可能有一个更简单的方法来实现这一点,可能是统一带来的,因为这对我来说是一个普遍的要求。不过我不确定。实现这一目标的最佳方式是什么?我是否必须从头开始做所有事情,或者是否有任何现有的UI组件或资产可以使这更容易?如有任何建议,我们将不胜感激。谢谢

我决定看看这个问题,并提出了一个解决方案

每个可调整大小的元素有4个线图像和4个角图像

每个角都附加了此脚本,以使其可拖动,并在拖动到主ResizebleElement脚本时发送其位置更改

public类resizeblelementdraggable:monobhavior,IDragHandler
{
#pragma警告禁用0649
[SerializeField]private ResizebleElement _ResizebleElement;
[SerializeField]private ResizeableElementCorners\u Corners;
#pragma警告恢复0649
私有向量2 _lastnown位置;
私人空间
{
_LastKnown位置=transform.position;
}
void IDragHandler.OnDrag(pointereventdataeventdata)
{
_resizeblelement.UpdateSize(_corner,_lastKnownPosition-eventData.position);
}
public void UpdatePosition()
{
_LastKnown位置=transform.position;
}
}
主要的ResizeableElement脚本如下所示,其中包括公共枚举,以便轻松查看哪个角发送位置更改

public enum resizeblelementcorners
{
左上角,
右上角,
左下角,
右下角
}
公共类ResizebleElement:MonoBehavior,IPoClickHandler
{
#pragma警告禁用0649
[SerializeField]私有游戏对象[]\u行;
[SerializeField]私有可调整大小的元素可拖动[]\u;
#pragma警告禁用0649
私有RectTransform RectTransform;
公共布尔值{get;private set;}
私人空间
{
_rectTransform=GetComponent();
}
公共无效取消选择()
{
如果(当选)
{
IsSelected=false;
对于(int l=0;l<_lines.Length;l++)
{
_行[l]。设置活动(false);
}
对于(int c=0;c<_lines.Length;c++)
{
_角[c].gameObject.SetActive(false);
}
}
}
公共作废选择()
{
如果(!IsSelected)
{
IsSelected=true;
对于(int l=0;l<_lines.Length;l++)
{
_行[l]。设置活动(真);
}
对于(int c=0;c<_lines.Length;c++)
{
_角[c].gameObject.SetActive(true);
}
}
}
public void UpdateSize(可调整大小的元素角,矢量2更改)
{
Vector2 offsetMin=_rectTransform.offsetMin;
Vector2 offsetMax=_rectTransform.offsetMax;
道岔(转角)
{
案例大小可调整LelementCorners.TopLeft:
_rectcransform.offsetMax=新向量2(offsetMax.x,offsetMax.y-change.y);
_rectTransform.offsetMin=新向量2(offsetMin.x-change.x,offsetMin.y);
打破
案例大小可调整LementCorners.TopRight:
_rectcransform.offsetMax=新向量2(offsetMax.x-change.x,offsetMax.y-change.y);
打破
case resizeblelementcorners.BottomLeft:
_rectTransform.offsetMin=新向量2(offsetMin.x-change.x,offsetMin.y-change.y);
打破
case resizeblelementcorners.BottomRight:
_rectcransform.offsetMax=新矢量2(offsetMax.x-change.x,offsetMax.y);
_rectTransform.offsetMin=新向量2(offsetMin.x,offsetMin.y-change.y);
打破
}
对于(int c=0;c<_lines.Length;c++)
{
_角[c].UpdatePosition();
}
}
公共void OnPointerClick(PointerEventData事件数据)
{
选择();
}
}
它使用
OnPointerClick
来知道它何时被选中-您需要跟踪这些元素并发送到该触发器上取消选择其他元素,但对于本演示,我没有添加它

我已经创建了一个演示项目,并将其上传到Github,可以找到它

免责声明-这只是一个演示

更新:

我制作了一个基本的资产包,其中包括两个预置:一个是控制场景中可调整大小对象的Resizebleui主脚本持有者,另一个是当使用RectTransform将其作为子对象添加到任何UI对象时使其成为可调整大小的元素的预置

可以在每个可调整大小的元素上设置两个基本设置,包括调整大小方向、最小大小和锁定角

整个项目都将在中托管

希望有人觉得有用

更新2

我重写了这个项目,现在它已经成为一个成熟的组件,一旦所需的脚本(4)出现在项目中,所需要的就是添加一个
resizeblueicompon