大牛专栏 收藏本版 已有21人收藏 +发表新主题
查看: 14839|回复: 0
打印 上一主题 下一主题

Capricorn|Unity3d UGUI获取系统默认Font

[复制链接]

Capricorn|Unity3d UGUI获取系统默认Font

zzlple 发表于 2016-6-22 23:29:53 浏览:  14839 回复:  0 只看该作者 复制链接
本帖最后由 zzlple 于 2016-6-30 19:25 编辑

有时候我们在项目中有这样的需求,new GameObject("Text").AddComponent<Text>(),可是出来的结果是Text组件下面的Font未传入,这样缺少字体库就会造成不显示,于是尝试FontData.defaultFontData.font,但是这个API返回的是个空指针,最后在github上面看到一位日本开发者的代码:
FacebookのUnity助け合い所でこんな質問投げさせてもらいました。

これがですね、何をしたかったかというと、デバックモード用のUIを作りたかったんですよね。
必要な分だけコードで生成みたいな。
結果から言うと整備されていなさそうなので、
時間もないので、見つけたリンクのフォーラムの内容を参考に、
自己ソリューションしてみました。
一部RenderModeの改修があったようで直しました。
uGUITest.cs
using UnityEngine;using UnityEngine.EventSystems;using UnityEngine.UI;public class uGUITest : MonoBehaviour{    private void Start()    {        if (FindObjectOfType<EventSystem>() == null)        {            var es = new GameObject("EventSystem", typeof(EventSystem));            es.AddComponent<StandaloneInputModule>();        }        var canvasObject = new GameObject("Canvas");        var canvas = canvasObject.AddComponent<Canvas>();        canvasObject.AddComponent<GraphicRaycaster>();        canvas.renderMode = RenderMode.ScreenSpaceOverlay;        var buttonObject = new GameObject("Button");        var image = buttonObject.AddComponent<Image>();        image.transform.parent = canvas.transform;        image.rectTransform.sizeDelta = new Vector2(180, 50);        image.rectTransform.anchoredPosition = Vector3.zero;        image.color = new Color(1f, .3f, .3f, .5f);        var button = buttonObject.AddComponent<Button>();        button.targetGraphic = image;        button.onClick.AddListener(() => Debug.Log(Time.time));        var textObject = new GameObject("Text");        textObject.transform.parent = buttonObject.transform;        var text = textObject.AddComponent<Text>();        text.rectTransform.sizeDelta = Vector2.zero;        text.rectTransform.anchorMin = Vector2.zero;        text.rectTransform.anchorMax = Vector2.one;        text.rectTransform.anchoredPosition = new Vector2(.5f, .5f);        text.text = "Yo 世界!";        text.font = Resources.FindObjectsOfTypeAll<Font>()[0];        text.fontSize = 20;        text.color = Color.yellow;        text.alignment = TextAnchor.MiddleCenter;    }}

このコードを空のオブジェクトにつけると、
ボタンが一つ生成される仕組みになっています。
これを再生すると、

加粗颜色标注部分,就是我们需要的系统默认字体,真是绕啊,有需要的小伙伴去试试吧。

但是在使用这个api的时候确保系统默认有一个Text组件并且有字体的引入,否则在移动平台无法找到字体,这可能和unity的打包策略有关系。
分享至:
| 人收藏
回复

使用道具 举报

*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

中级会员

Copyright © 2013-2017 ARinChina-增强现实中国技术论坛   All Rights Reserved.