本帖最后由 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的打包策略有关系。
|
|
|
|
|
|