Unity3d UGUI基于屏幕尺寸的自适应

Unity3d UGUI基于屏幕尺寸的自适应,第1张

现有的自适应方法,通常都是基于屏幕的分辨率。分辨率越高的设备上,UI显示的越小。这就造成了一些5寸左右的手机分辨率比ipad等平板设备还要高。UI在平板上显示太大。但是在高分辨率手机上显示太小。

以上脚本为基于屏幕物理尺寸自适应UI的一种方法。通过计算屏幕的DPI获取到屏幕的实际尺寸。然后根据一个标准的尺寸对UI的分辨率进行相对应的缩放。

可以改进的地方就是对于大屏幕或者小屏幕进行缩放的限制。避免类似ipad pro这类的设备上,UI有小的离谱。

配合这个脚本使用的同时。UI也需要用到锚点,进行初步的自适应,不然会造成UI的错乱。

Image控件是用来显示一张的,sprite类型的

CanvasRenderer:负责UI元素的渲染,所有UI控件都需要一个CanvasRenderer,它继承自Componet

SpriteRenderer(渲染sprite用的)、MeshRenderer(渲染三维物体用的)、SkinnedMeshRenderer(渲染蒙皮的物体),它们都继承自Renderer负责渲染的

SourceImage: 是你要显示的,下面的有一个对应的 Set Native Size按钮 ,有可能会被拉伸,按这个按钮可以让Image控件的宽高设置为和原始的宽高一样,

Material: 材质,当我们需要一些比较高级的效果,比如你要为这张编写自己的shader的时候,才会用到材质

ImageType: 表示展示的类型,默认是Simple,就是正常显示,对应一个Preserve Aspect选项,意思是,是否保持比例(宽高比), 在屏幕适配的时候,有可能会拉伸,这时候为了不让失真,一般会勾选这个选项

1引入命名空间

using UnityEngineUI

2获取组件

Image image = GetComponent<Image>();

3改变属性

imagesprite = xxx;

RawImage控件也是用来显示一张的,但是显示的是Texture类型的

用于显示文本,这个和一些应用里面的字体差不多,没什么好说的

Line Spacing:行距

Rich Text:是否使用富文本,就是会检测到尖括号

Best Fit:根据Text控件的大小来显示合适的字体大小,字体大小会受控件大小的限制,即文本会完整显示

宽:gameObjectGetComponent<RectTransform>()rectwidth

高:gameObjectGetComponent<RectTransform>()rectheight

GetComponent<RectTransform>()sizeDelta

或者GetComponent<RectTransform>()rectsize

延展:

用户界面(User Interface)是指对软件的人机交互、 *** 作逻辑、界面美观的整体设计

用户界面是介于用户与硬件而设计彼此之间交互沟通相关软件,目的在于让用户高效完成工作

用户界面定义广泛,包含了人机交互与图形用户接口,凡参与人类与机械的信息交流的领域都存在着用户界面

好的软件不仅要体现个性有品位,而且要求 *** 作变得舒适、简单、自由、充分体现软件的定位和特点

用户界面( User Interface,简称 UI,亦称 使用者界面)是系统和用户之间进行交互和信息交换的媒介,它实现信息的内部形式与人类可以接受形式之间的转换

用户界面是介于用户与硬件之间,为彼此之间交互沟通而设计的相关软件,使得用户能够方便有效地去 *** 作硬件以达成双向之交互,完成所希望的工作

用户界面定义广泛,包含了人机交互与图形用户界面,凡参与人类与机械的信息交流的领域都存在着用户界面

用户和系统之间一般用面向问题的受限自然语言进行交互。目前有系统开始利用多媒体技术开发新一代的用户界面

随着“UI”热的到来,近几年国内很多从事手机, 软件,网站, 增值服务等企业和公司都设立了这个部门

还有很多专门从事UI设计的公司也应运而生。软件UI设计师的待遇和地位也逐渐上升

因项目的需求,在制作中需要让UGUI中的组件,追随鼠标的运动轨迹。由于个人在以前使用中对于UGUI的坐标系了解不深,在使用中产生了一些问题,在此对UGUI的坐标系做一个简单的记录,以备后面查询。

Unity3D 采用InputmousePosition来获取当前鼠标的位置,获取的位置是相对于屏幕坐标系的,而UGUI使用的坐标系和屏幕坐标系不是同一个坐标系,

在UGUI中组件使用的坐标都是2D在Rect中的一个相对坐标,所以在实际使用中需要进行转换。

<pre>

public class test : MonoBehaviour

{

public RectTransform myRectTransform; // 目标组件

public Canvas myCanvas; // 当前画布

// Update is called once per frame

void Update ()

{

Vector2 vT = Vector2zero;

// 通过此函数,将鼠标坐标,从屏幕坐标,转换到UGUI坐标

RectTransformUtilityScreenPointToLocalPointInRectangle(myCanvastransform as RectTransform, InputmousePosition, myCanvasworldCamera, out vT);

myRectTransformlocalPosition = vT;

}

}

</pre>

#######附带一说,在Unity3D中可以使用函数ScreenshowCursor(老版本)、UnityEngineCursorvisible来显示和隐藏鼠标

效果图,素材是网上随便拉的

这是运行后的Hierarchy的界面,其中最下面的Item是放在摄像机不能拍到的位置,当做预设体,每个Item都有Toggle组件,在Grid上有Toggle Group 组件,并且将Itme上的Toggle组件中Group设置为Grid,这实现了点了一个之后,其他不会高亮。Grid上有组件 Grid Layout Group,该组件实现了当创建Item,并且将父物体设置为Grid后能够自动排版

这里我们需要写三个类,一个是自己捏造的数据类,放在Item上获取各种UI的类,还有能够创建Item并且能够对Item进行管理的类

public class ItemData//这个类存放的是数据

{

public int _starNum;//星星的数量(本来是想找星星的,现在就随便将就一下)

public string _icon;//这是名字

public string _itemName;//关卡的名字

public string _itemNum;//第几关

}

item上的类,用来获取item上的UI控件

public class Item : MonoBehaviour

{    

public Image _star1;    

public Image _star2;    

public Image _star3;    

public Image _icon;    

public Text _levelNum;    

public Text _levelName;    

void initializeItem()    

{        

_star1 = transformFind("StarGroup/star1")GetComponent<Image>();       

 _star2 = transformFind("StarGroup/star2")GetComponent<Image>();        

_star3 = transformFind("StarGroup/star3")GetComponent<Image>();

 _icon = transformFind("Icon")GetComponent<Image>();        

_levelName = transformFind("Levelname/name")GetComponent<Text>();        

_levelNum = transformFind("Levelname/Lv")GetComponent<Text>();

}

void Awake()

{

initializeItem();

}

}

这是个管理Item创建的类

public class MainMgr : MonoBehaviour 

{    

GameObject item;    

Transform Parent;    //这里需要得到Gird的Transform

List<ItemData> dataGroup = new List<ItemData>();   

void Awake()    

{        

CreateData();        

item = transformFind("Item")gameObject;        //获得一开始放在摄像机外的游戏对象,当做预设体

Parent = transformFind("Grid");    //保存Gird的Transform

}    

void CreateData()    //创建自己捏造的数据

{       

 dataGroupClear();//确保这个List没有其他数据        

ItemData itemdata = new ItemData();        

itemdata_icon = "1 (5)";       

itemdata_itemName = "小树林";        

itemdata_itemNum = "第一关";        

itemdata_starNum = 3;        

dataGroupAdd(itemdata);        

ItemData itemdata1 = new ItemData();        

itemdata1_icon = "1 (7)";        

itemdata1_itemName = "沼泽";       

 itemdata1_itemNum = "第二关";        

itemdata1_starNum = 1;        

dataGroupAdd(itemdata1);        

ItemData itemdata2 = new ItemData();        

itemdata2_icon = "1 (15)";        

itemdata2_itemName = "山海关";        

itemdata2_itemNum = "第三关";       

itemdata2_starNum = 1;        

dataGroupAdd(itemdata2);        

ItemData itemdata3 = new ItemData();        

itemdata3_icon = "1 (12)";        

itemdata3_itemName = "墓地";        

itemdata3_itemNum = "第四关";        

itemdata3_starNum = 2;        

dataGroupAdd(itemdata3);       

 ItemData itemdata4 = new ItemData();        

itemdata4_icon = "1 (32)";        

itemdata4_itemName = "神殿";       

 itemdata4_itemNum = "第五关";       

 itemdata4_starNum = 3;        

dataGroupAdd(itemdata4);        

ItemData itemdata5 = new ItemData();        

itemdata5_icon = "1 (25)";        

itemdata5_itemName = "天庭";        

itemdata5_itemNum = "第六关";        

itemdata5_starNum = 2;        

dataGroupAdd(itemdata5);        

ItemData itemdata6 = new ItemData();        

itemdata6_icon = "1 (30)";        

itemdata6_itemName = "心魔";        

itemdata6_itemNum = "第七关";        

itemdata6_starNum = 3;        

dataGroupAdd(itemdata6);   

 }    

GameObject tempItem; //创建临时的游戏对象   

void CreateTempItem()    //创建Item

{        

if (dataGroup != null)       //当这个List不为空时

{            

for (int i = 0; i < dataGroupCount; i++)            //循环创建Item

{                

tempItem = Instantiate(item) as GameObject;          //创建Item并且获取到这个游戏对象     

 tempItemtransformlocalPosition = Vector3zero;                //将其位置,缩放大小,旋转角度初始化

tempItemtransformlocalRotation = new Quaternion();                

tempItemtransformlocalScale = Vector3one;                

tempItemtransformSetParent(Parent);                //设置其父物体为Grid

Item itemSprite = tempItemAddComponent();  //为每一个创建的Item添加脚本

itemSprite_levelNametext = dataGroup[i]_itemName;//获取每一个关卡的名字获取,一下类似

itemSprite_levelNumtext = dataGroup[i]_itemNum;

string path = stringFormat("Icon/{0}", dataGroup[i]_icon);//字符串拼接

itemSprite_iconsprite = ResourcesLoad(path, typeof(Sprite)) as Sprite;

ShowStar(dataGroup[i]_starNum, itemSprite);//调用这个方法获得星星的显示

}

}

}

void ShowStar(int num,Item tempitem)//这个方法是用来显示星星

{

if (num == 1)

{

tempitem_star1gameObjectSetActive(true);

tempitem_star2gameObjectSetActive(false);

tempitem_star3gameObjectSetActive(false);

}

if (num == 2)

{

tempitem_star1gameObjectSetActive(true);

tempitem_star2gameObjectSetActive(true);

tempitem_star3gameObjectSetActive(false);

}

if (num == 3)

{

tempitem_star1gameObjectSetActive(true);

tempitem_star2gameObjectSetActive(true);

tempitem_star3gameObjectSetActive(true);

}

}

void Start () {

CreateTempItem();

}

}

以上就是简单的游戏关卡的选择界面的实现,如果有错误,或者更好的方法,望指正,万分感谢!

via @ >

今天永强接着昨天的课程 再接着给玉田讲一个新东西,名字非常酷炫,叫《EventTrigger》他的名字啥意思玉田并不需要知道,可以粗暴的这样理解哈。给你举个简单的例子:就好比玉田干坏错事了,玉田的爹地赵四抬手就给玉田一个大嘴巴子,玉田被抽一巴掌后,就捂住脸。

这里的EventTrigger就是:赵四抬手抽玉田一大嘴巴子。

执行的Function就是:玉田捂脸。。。

好嘞!下面我们看看详细 *** 作:

这是我们上一节课的栗子。现在选中Hierarchy中的Image对象

然后在Inspector中选择最下端的AddComponent按钮!按他就对啦!

然后会蹦出来一个小框框,上面有个搜索栏。像你平时搜索“苍老师”一样,在搜索栏中输入“EventTrigger”,然后就显示EventTrigger组件

选中我用红框框起来的这个吊东西。

这时你的Inspector中会多了一个东西,如下图

没错,揍四他!

摁“Add New Event Type”按钮。

选择PointerEnter

点右下角的➕号,出现下图的样子

把Hierarchy中的Image拖到对相框里

然后按我下图的设置做。玉田你蹩BB,就按我说的做就对了!

这个意思是当画布渲染时,如果有PointerEnter事件时,Image的Alpha设置为05

下面我们再添加一个事件。当PointerExit事件发生时。Image的Alpha设置为1

好滴。玉田真棒!现在运行一下看看效果吧。嘤嘤嘤。。。

当鼠标悬停在上时,Image透明度变成05

当鼠标离开时,Image的透明度变成了1

好啦玉田,哥累了。你该回家吃饭了。

以上就是关于Unity3d UGUI基于屏幕尺寸的自适应全部的内容,包括:Unity3d UGUI基于屏幕尺寸的自适应、UGUI笔记2-Image、RawImage和Text控件、怎么获得ui的宽高 unity ugui等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9405718.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存