
现有的自适应方法,通常都是基于屏幕的分辨率。分辨率越高的设备上,UI显示的越小。这就造成了一些5寸左右的手机分辨率比ipad等平板设备还要高。UI在平板上显示太大。但是在高分辨率手机上显示太小。
以上脚本为基于屏幕物理尺寸自适应UI的一种方法。通过计算屏幕的DPI获取到屏幕的实际尺寸。然后根据一个标准的尺寸对UI的分辨率进行相对应的缩放。
可以改进的地方就是对于大屏幕或者小屏幕进行缩放的限制。避免类似ipad pro这类的设备上,UI有小的离谱。
配合这个脚本使用的同时。UI也需要用到锚点,进行初步的自适应,不然会造成UI的错乱。
电脑屏幕显示字体模糊的原因有两种:1、屏幕分辨率设置不对。2、显卡驱动不对。解决方法:修改屏幕分辨率:1、在桌面空白处点击鼠标右键。2、在右键菜单中选择屏幕分辨率。3、在d出的对话框中找到分辨率。4、点击下拉按钮。5、在下拉菜单中选择合适的分辨率,点确定。6、如果桌面显示出来的大小不适合,在询问是否保存的时候选否。重复第4、5项。7、如果桌面内容大小适合,点保存更改就行了。重新安装显卡驱动:1、下载一个驱动精灵,驱动人生之类的软件。2、打开软件。3、在软件中找到更新驱动。4、更新驱动。让软件自动下载合适的即可。
效果图,素材是网上随便拉的
这是运行后的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();
}
}
以上就是简单的游戏关卡的选择界面的实现,如果有错误,或者更好的方法,望指正,万分感谢!
宽: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来显示和隐藏鼠标
以上就是关于Unity3d UGUI基于屏幕尺寸的自适应全部的内容,包括:Unity3d UGUI基于屏幕尺寸的自适应、使用UGUI的默认中文文字显示模糊,怎么办、Unity UGUI实现游戏关卡选择界面等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)