2018-08-20 15:39:06 wang_huizhang 阅读数 196
  • Unity3DUI系统(UGUI)初级入门

    本课程主要介绍Unity3d的UI系统(UGUI),先对UGUI做一个总体概述,之后对每个UI控件逐一进行详细讲述,内容包括控件的作用、设置方法、使用场景及属性细节,帮助大家熟练使用UGUI设计游戏的交互界面。

    984 人正在学习 去看看 伍晓波

UGUI

using UnityEngine.UI;

Text控件
Text text;
text = GameObject.Find("ATestText").GetComponent<Text>() ;
text.text="需要显示的的字符串";


Image控件
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.IO;
using System;
public class UGUIImageControl : MonoBehaviour {

    // Use this for initialization
    Texture2D texture2D;
    public Image image;
    string ImagePath = "Assets/Cinema Suite/About/Resources/MocapKeyImage.png";
    string ImagePath2 = "sprites/tempIMG";//overrideSprite方法必须用Resources文件夹里的资源
    int a = 1;
    void Start () {

        image= GameObject.Find("Image_A").GetComponent<Image>();
        LoadByIO();
        
    }
    
    private void LoadByIO()
    { 
        /*
         * 读取图片文件
         */
        FileStream fileStream = new FileStream(ImagePath, FileMode.Open, FileAccess.Read);
        fileStream.Seek(0, SeekOrigin.Begin);
        byte[] bytes = new byte[fileStream.Length];
        fileStream.Read(bytes, 0, (int)fileStream.Length);
        fileStream.Close();
        fileStream.Dispose();
        fileStream = null;

        /*
         * 创建Textture
         */
        int width = 300;
        int height = 372;
        Texture2D texture2D = new Texture2D(width,height);
        texture2D.LoadImage(bytes);
        
        /*
         * 创建精灵。
         */
        Sprite sprite = Sprite.Create(texture2D, new Rect(0, 0, texture2D.width, texture2D.height), new Vector2(0.5f, 0.5f));

        image.sprite = sprite;
    }
    // Update is called once per frame
    void Update () {
        a++;
        if(a>300)
        {
            print(a);
            image.overrideSprite= Resources.Load<Sprite>(ImagePath2) as Sprite;
            //overrideSprite方法必须用Resources文件夹里的资源
        }
    }
}


Button控件
1. 在onClick选项里操作。
2. Button.onClick.AddListener(f);//f为编写好的函数。
3. EventTrigger添加:(也可以用层级试图操作)
using UnityEngine.EventSystems;
using UnityEngine.Events;
using UnityEngine;

public class AddTrigger : MonoBehaviour {

    // Use this for initialization
    void Start() {
        UnityAction<BaseEventData> click = new UnityAction<BaseEventData>(MyClick);
        EventTrigger.Entry myClick = new EventTrigger.Entry();
        myClick.eventID = EventTriggerType.PointerClick;
        myClick.callback.AddListener(click);

        EventTrigger trigger = gameObject.AddComponent<EventTrigger>();
        trigger.triggers.Add(myClick);
    }

    public void MyClick(BaseEventData data)
    {
        Debug.Log("自己写的evnt trigger");
    }
}

 

Toggle 控件
监听Toggle。
public Toggle toggle;
toggle.onValueChanged.AddListener((bool value)=>OnToggleClick(toggle,value));


public void OnToggleClick(Toggle  toggle,bool value)
    {
        Debug.Log("toggle change"+(value?"On":"Off"));
    }


slider滑动条
scrollbar滚动条

 

NGUI

面板滚动:

父物体Clipping加ScrollView脚本,子物体加 DragScrollView脚本,脚本参数为父物体。(注意锚点,锚点挂住无法滑动)

添加Button的方式:

新建gameObject,然后添加Button脚本 或者在

Toogle和开关

添加Toogle脚本和BoxCollider2D,3D的不行。

Grid 整齐排列

Table 表格排列,多出的列放到新的一行

聊天窗口的制作(box Collider 要换成 2D 的)

聊天窗口的制作

PopupList 下拉列表

2018-11-23 13:15:27 weixin_43778515 阅读数 4639
  • Unity3DUI系统(UGUI)初级入门

    本课程主要介绍Unity3d的UI系统(UGUI),先对UGUI做一个总体概述,之后对每个UI控件逐一进行详细讲述,内容包括控件的作用、设置方法、使用场景及属性细节,帮助大家熟练使用UGUI设计游戏的交互界面。

    984 人正在学习 去看看 伍晓波

Unity3D UGUI Text得分数字增加 代码

在这里插入图片描述
一、首先在Hierarchy中创建Text,并绑定脚本。

using UnityEngine;
using System.Collections;
using UnityEngine.UI;				**//导入资源库**

public class Score : MonoBehaviour {
	public static Text txt;				**//定义静态变量名以用于其他脚本内的引用**
	public static float x = 0;
	void Start () 
	{
		txt = GameObject.Find ("Text").GetComponent<Text> ();	 
	}
}

二、在确定变量名指定的组建后,对得分时情况进行判断。这里进入判断绑定刚体是否碰撞的脚本。

using UnityEngine;
using System.Collections;

public class collision2 : MonoBehaviour {
	public GameObject bullet;	

	void OnCollisionEnter(Collision col)				**//当刚体碰撞开始时**
	{
		if (col.gameObject.name.Equals ("Bullet(Clone)")) 
		{
			Instantiate (bullet,col.transform.position,Quaternion.identity);
			Destroy(col.gameObject);  
			Score.x += 1;				**//刚体碰撞结束后得分加1**
			Score.txt.text = "Score : " + Score.x;				//在text文本中显示Score : x
		}
	}

总结:这里的代码示例是以制定刚体碰撞的开始时,进行得分判断。当Bullet(Clone)与脚本绑定的刚体碰撞,便得分数 X+1 ,并在Score脚本中的txt中加上转换成文本类型后的X。

2018-01-05 16:20:14 ls9512 阅读数 1142
  • Unity3DUI系统(UGUI)初级入门

    本课程主要介绍Unity3d的UI系统(UGUI),先对UGUI做一个总体概述,之后对每个UI控件逐一进行详细讲述,内容包括控件的作用、设置方法、使用场景及属性细节,帮助大家熟练使用UGUI设计游戏的交互界面。

    984 人正在学习 去看看 伍晓波

Unity 中的 Rich Text

Unity中的富文本格式,通过类似html的标签语言来实现,支持常见的加粗,倾斜,颜色等,可以应用于GUI、UGUI和Debug日志输出。

Rich Text 的使用

原文: We are <b><i>definitely not</i></b> amused
显示: We are definitely not amused

具体使用方法大多数人应该都已经知道了,详见官方API文档。[UnityAPI - Rich Text]

如上所示,如果文本量很大,并且内容格式很复杂的情况下,原文的可阅读性会变得很差,而且,标签的配对层层嵌套后,很容易发生错误,虽然不是十分必要也不是什么非常强大的功能,但我们还是来尝试对它进行一下封装,让富文本标签用起来更简单一点。

代码实现

  • MarkupAdapter.cs
    标签装配器,用于给指定内容拼接指定的标签。
    public class MarkupAdapter
    {
        protected static StringBuilder StringBuilder = new StringBuilder();

        public string LeftMark { get; }
        public string RightMark { get; }

        public MarkupAdapter(string leftMark, string rightMark)
        {
            LeftMark = leftMark;
            RightMark = rightMark;
        }

        public string ToString(string str)
        {
            StringBuilder.Remove(0, StringBuilder.Length);
            StringBuilder.Append(LeftMark);
            StringBuilder.Append(str);
            StringBuilder.Append(RightMark);
            return StringBuilder.ToString();
        }
    }
  • Markup.cs
    为了使用方便,将所有接口都写在 Markup 类中,但不同的标签实现方式有所区别,写在一起代码比较冗长,故使用partial将代码分成多个文件。
    public static partial class Markup 
    {
        public static string Create(string str, params MarkupAdapter[] markups) 
        {
            for (var i = 0; i < markups.Length; i++)
            {
                var markup = markups[i];
                str = markup.ToString(str);
            }
            return str;
        }
    }
  • MarkupStyle.cs
    样式标签相关的接口:
    public static partial class Markup
    {
        public static MarkupAdapter Blod = new MarkupAdapter("<b>", "</b>");

        public static MarkupAdapter Italic = new MarkupAdapter("<i>", "</i>");

        public static MarkupAdapter Size(int size)
        {
            size = size < 1 ? 1 : size;
            return new MarkupAdapter("<size=" + size + ">", "</size>");
        }

        public static MarkupAdapter Material(int index) 
        {
            index = index < 0 ? 0 : index;
            return new MarkupAdapter("<material=" + index + ">", "</material>");
        }

        public static MarkupAdapter Quad(int materialIndex, int size, float x, float y, float width, float height)
        {
            materialIndex = materialIndex < 0 ? 0 : materialIndex;
            return new MarkupAdapter(
                "<quad material=" + materialIndex +
                " size=" + size +
                " x=" + x +
                " y=" + y +
                " width=" + width +
                " height=" + height + ">",
                "</material>");
        }

        public static MarkupAdapter Quad(string name, int size, float x, float y, float width, float height)
        {
            size = size < 0 ? 0 : size;
            return new MarkupAdapter(
                "<quad name=" + name +
                " size=" + size +
                " x=" + x +
                " y=" + y +
                " width=" + width +
                " height=" + height + ">",
                "</quad>");
        }
    }
  • MarkupColor.cs
    颜色标签相关的接口:
    public static partial class Markup
    {
        public static MarkupAdapter Red = Color(new Color(1f, 0f, 0f, 1f));
        public static MarkupAdapter Green = Color(new Color(0f, 1f, 0f, 1f));
        public static MrkupAdapter Blue = Color(new Color(0f, 0f, 1f, 1f));
        public static MarkupAdapter White = Color(new Color(1f, 1f, 1f, 1f));
        public static MarkupAdapter Black = Color(new Color(0f, 0f, 0f, 1f));
        public static MarkupAdapter Yellow = Color(new Color(1f, 0.9215686f, 0.01568628f, 1f));
        public static MarkupAdapter Cyan = Color(new Color(0.0f, 1f, 1f, 1f));
        public static MarkupAdapter Magenta = Color(new Color(1f, 0.0f, 1f, 1f));
        public static MarkupAdapter Gray = Color(new Color(0.5f, 0.5f, 0.5f, 1f));
        public static MarkupAdapter Clear = Color(new Color(0.0f, 0.0f, 0.0f, 0.0f));

        public static MarkupAdapter Color(Color color)
        {
            return new MarkupAdapter("<color=" + ColorToMarkup(color) + ">", "</color>");
        }

        private static string ColorToMarkup(Color color)
        {
            var r = (int) (color.r*255);
            var g = (int) (color.g*255);
            var b = (int) (color.b*255);
            var a = (int) (color.a*255);
            return "#" + r.ToString("x2") + g.ToString("x2") + b.ToString("x2") + a.ToString("x2");
        }
    }
  • MarkupExtension.cs
    为了使用方便,再对string做一些扩展。
    public static class MarkupExtension
    {
        public static string ToMarkup(this string str, params MarkupAdapter[] markups)
        {
            return Markup.Create(str, markups);
        }

        public static string ToMarkup(this string str, Color color)
        {
            return Markup.Create(str, Markup.Color(color));
        }

        public static string ToMarkup(this object obj, params MarkupAdapter[] markups) {
            return Markup.Create(obj.ToString(), markups);
        }

        public static string ToMarkup(this object obj, Color color) {
            return Markup.Create(obj.ToString(), Markup.Color(color));
        }
    }

使用方法

由于代码很简单代码量也很少,就不做过多说明了,直接上使用效果。
写一段测试代码,执行效果如下:
Console截图
对比一下原文;
[Markup 测试1]<size=15><b><color=#00ff00ff> 复合样式</color></b></size><color=#ffffffff> 白色</color><i> 斜体</i><b> 加粗</b>
[Markup 测试2]<size=12><i><color=#ffea04ff> 复合样式</color></i></size><color=#ff00ffff> 洋红</color><i> 斜体</i><size=14><b> 加粗</b></size>

测试代码如下:

    public class MarkupTest : MonoBehaviour
    {
        private void Start()
        {
            // 方式1
            var str1 = "[Markup 测试1]"
                       + " 复合样式".ToMarkup(Markup.Green, Markup.Blod, Markup.Size(15))
                       + " 白色".ToMarkup(Color.white)
                       + " 斜体".ToMarkup(Markup.Italic)
                       + " 加粗".ToMarkup(Markup.Blod);
            Debug.Log(str1);

            // 方式2
            var str2 = "[Markup 测试2]"
                       + Markup.Create(" 复合样式", Markup.Yellow, Markup.Italic, Markup.Size(12))
                       + Markup.Create(" 洋红", Markup.Magenta)
                       + Markup.Create(" 斜体", Markup.Italic)
                       + Markup.Create(" 加粗", Markup.Blod, Markup.Size(14));
            Debug.Log(str2);
        }
    }

这样使用起来,要写的代码其实并不短,但是,比较清晰明了,不容易出错,格式修改起来也容易了很多,比直接手写标签要直观很多。

后续

Unity支持的标签格式比较少,实际开发中还缺少了很多样式和功能,比如下划线,删除线,脚注,超链接等等,看情况以后可能会专门写几篇相关的内容。

2018-09-26 20:37:03 qq_37003027 阅读数 79
  • Unity3DUI系统(UGUI)初级入门

    本课程主要介绍Unity3d的UI系统(UGUI),先对UGUI做一个总体概述,之后对每个UI控件逐一进行详细讲述,内容包括控件的作用、设置方法、使用场景及属性细节,帮助大家熟练使用UGUI设计游戏的交互界面。

    984 人正在学习 去看看 伍晓波

在unity3d中,我们经常需要往界面上添加图片,文本,这时候我们就得使用UI了。 creat->uI,里面就有各种各样的UI对象。
在我们设置了各种各样的Text、Button、Image之后,对于小白来说,没有经过他人的手把手操作,要想调整它们的位置是非常困难的。因为,就算通过Scence中的拖拽,在改变画面大小之后,上面的UIGameObject也会到处乱飞。

现在我讲一下解决过程:
第一步:creat->UI->想要的UI;
第二步: 切换到Scence,并且切换到2d视图(位于左上角);
第三步:点击UI对象,在左侧Inspector中,有一个RectTransform,里面左侧有一个四方形的视图;
第四步:点击视图,里面有各种选项,要想使得无论水平,还是垂直方向,UI对象随着画面的大小自动变换位置,适应画面,可以按住shift,选择右下角的图形。同理,若想按别的方向固定变化,可以选择对应的拉伸。

原理:
Anchor(锚点):是由两个Vector2的向量决定的,归化成两个点,分别为Min和Max,两个点确定一个矩形,Min确定左下角坐标,Max确定右上角坐标。
Pivot(中心):Pivot为矩形中心。显示Pivot可以在工具栏中选择Transform Tools的最后一个选项,或者使用快捷键T。

笔记:
1.Transform有 position 和 localPosition 属性,这两个分别代表在世界空间的绝对位置和相对于父级物体的相对位置。RectTransform引入了 anchoredPosition 和 anchoredPosition3D ,它们都是相对位置,但是相对的是自身的Anchor。当锚点全部重合时, anchoredPosition 代表的就是自身Pivot到Anchor的向量。

2.在Screen Space——Overlay的模式下,由于Canvas的世界尺寸与其像素尺寸在数值上相等,因此其rectTransform的position与其在屏幕空间的坐标在数值上也相等。这种模式下,要获取某个RectTransform的屏幕坐标,直接使用position就可以。在Screen Space——Camera的模式和World Space下,RectTransform的渲染与摄像机有关,在获取其屏幕坐标时,需要利用canvas.worldCamera,或者transform.TransformPoint等坐标转换函数进行坐标转换。

2018-11-23 15:54:59 weixin_43778515 阅读数 4358
  • Unity3DUI系统(UGUI)初级入门

    本课程主要介绍Unity3d的UI系统(UGUI),先对UGUI做一个总体概述,之后对每个UI控件逐一进行详细讲述,内容包括控件的作用、设置方法、使用场景及属性细节,帮助大家熟练使用UGUI设计游戏的交互界面。

    984 人正在学习 去看看 伍晓波

Text文本显示/隐藏

一、首先创建一个脚本,并绑定在对应的text中。

在这里插入图片描述

二、定义变量,并使文本保持隐藏

using UnityEngine;
using System.Collections;
using UnityEngine.UI;				**//导入UI资源库**

public class die : MonoBehaviour 
{
	public static GameObject txt;				**//定义公共静态变量用于另外脚本的引用**

	void Start () 
	{
		txt = GameObject.Find("die");
		txt.SetActive (false);				**//保持txt的隐藏状态**
	}
}

三、接下来进入另一个脚本,使玩家碰到指定物体时,显示文本

using UnityEngine;
using System.Collections;

public class collision1 : MonoBehaviour {

	private GameObject man;

	void OnCollisionEnter(Collision col)				
	{
		if (col.gameObject.name.Equals ("prop_samoflange(Clone)")) 				**//当碰撞开始时**
		{
			die.txt.SetActive(true);				**//文本显示**
		}

首先文本利用SetActive函数控制其隐藏,当利用OnCollisionEnter方法,检测到物体碰撞时,显示文本。

unity3d中添加场景UI

阅读数 144

没有更多推荐了,返回首页