现有的自适应方法,通常都是基于屏幕的分辨率。分辨率越高的设备上,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等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)