2016-07-16 23:25:57 daimou123 阅读数 1965
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4645 人正在学习 去看看 张刚

Unity制作颜色渐变的倒计时

项目需要制作颜色渐变的倒计时,挺简单的代码,大体思路就是开一个协程,在协程里面控制颜色的变化以及进度条的进度,话不多说代码奉上

public void ShowSliderWithId(int time)
{
    GameObject sl = (GameObject)Instantiate (_sliderPrefab);
    sl.transform.parent = transform;  //设置父节点
    sl.transform.localScale = new Vector3 (1f,1f,1f);
    sl.transform.localPosition = new Vector3 (0f,0f,0f);
    sl.GetComponent<UISlider> ().value = 1f;
    StartCoroutine (ScheduleUpdateGlobal (sl,time));
}

IEnumerator ScheduleUpdateGlobal(GameObject obj,int time)
{
    float seconds = 0;//倒计时时间
    UISlider slider  = obj.GetComponent<UISlider> ();
    UISprite sprite = obj.GetComponent<UISprite> ();
    while(true)  
    {  
        for (float timer = 0; timer < 1; timer += Time.deltaTime) {//控制时间1秒走完
            seconds += Time.deltaTime;  
            slider.value = (1-seconds / time);
            if (seconds > time / 2) { //时间到达一半开始我这里要求是时间过去一半颜色开始变化
                float g = ((time - seconds) * 2 / time);
                sprite.color = new Color (1, g, 1, 1);//控制g渐变为红色
            }
            yield return 0; 
        }
        if (seconds >= time) {
            GameObject.Destroy (obj);
            break; //跳出死循环
        }
    }
}

我用的是环形进度条,我的ui用的是NGUI,需要在Inspector面板中UISprite里面的type选择filled,fillDir选择redial360;
附上我用的进度条

2017-10-30 16:50:46 luckydog1120446388 阅读数 3579
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4645 人正在学习 去看看 张刚

首先新建一个material,在inspector选择Shader:UI/Default   

然后,如图


2017-03-24 11:39:29 pz789as 阅读数 3647
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4645 人正在学习 去看看 张刚

参考:http://blog.csdn.net/pz789as/article/details/65628796


今日在做项目中发现,很多时候需要对文字多特殊处理,渐变就是最常用的。

特别是文字特别多,还有动态的时候,就不能只靠图了,否则包的大小就吃不消了。

在网上搜到雨松写的渐变代码,于是就拿来用了。可是版本不一样,我的是5.5.0版本,函数ModifyMesh的参数已经是VertexHelper了,所以就需要改动改动

具体代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

[AddComponentMenu("UI/Effects/TextGradient")]
[RequireComponent(typeof(Text))]
public class UICustomTextGradient : BaseMeshEffect
{
    public Color32 topColor = Color.white;
    public Color32 bottomColor = Color.black;

	//后面自己添加的控制中心移动属性,有时候看着渐变不顺眼,中心偏离高或者低了,就可以通过这个去调整
	[RangeAttribute(0, 1)]
	public float center = 0.5f;

    public override void ModifyMesh(VertexHelper vh)
    {
        if (!IsActive())
        {
            return;
        }

        var count = vh.currentVertCount;
        if (count == 0)
            return;

        var vertexs = new List<UIVertex>();
        for (var i = 0; i < count; i++)
        {
            var vertex = new UIVertex();
            vh.PopulateUIVertex(ref vertex, i);
            vertexs.Add(vertex);
        }

        var topY = vertexs[0].position.y;
        var bottomY = vertexs[0].position.y;

        for (var i = 1; i < count; i++)
        {
            var y = vertexs[i].position.y;
            if (y > topY)
            {
                topY = y;
            }
            else if (y < bottomY)
            {
                bottomY = y;
            }
        }

        var height = topY - bottomY;
        for (var i = 0; i < count; i++)
        {
            var vertex = vertexs[i];

			//使用处理过后的颜色
            // var color = Color32.Lerp(bottomColor, topColor, (vertex.position.y - bottomY) / height);
			var color = CenterColor(bottomColor, topColor, (vertex.position.y - bottomY) / height);

            vertex.color = color;

            vh.SetUIVertex(vertex, i);
        }
    }
	//加了一个对颜色处理的函数,主要调整中心的位置
	private Color32 CenterColor(Color32 bc, Color32 tc, float time){
		if (center == 0){
			return bc;
		}else if (center == 1){
			return tc;
		}else{
			var centerColor = Color32.Lerp(bottomColor, topColor, 0.5f);
			var resultColor = tc;
			if (time < center) {
				resultColor = Color32.Lerp(bottomColor, centerColor, time / center);
			}else{
				resultColor = Color32.Lerp(centerColor, topColor, (time - center)/(1-center));
			}
			return resultColor;
		}
	}
}


效果截图:

center为0.8时


center为0.2时


center为0.5时


2014-02-11 08:16:59 oneRain88 阅读数 19953
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4645 人正在学习 去看看 张刚

照例打个广告,欢迎大家去论坛讨论点击打开论坛


1. UILabel简介

(1)UILabel支持类型

a.图字:是指根据某些工具,将游戏中需要用到的文字渲染到一张纹理上,并附其纹理信息(包括 id值,尺寸,间距等)。

b.字库字:是指直接载入ttf等字库文件,根据从ttf文件中读取的数据,生成纹理并渲染。

(2)UILabel基本属性

 

Font类型:上述介绍的图字和字库字(BitmapDynamic

Text:文本

Overflow:溢出时选项,包括所发,裁剪,扩充等

Spacing:间距

Max Lines:最大行数

Encoding:是否支持颜色和表情

Gradient:(默认关闭),颜色渐变效果

Effect:特效,包括描边,阴影

UIWidget属性不在赘述)

 

2. UILabel 绘制

UILabel根据类型不同(图字,字库字),其组织顶点,uv,颜色的方式有所区别,主要区别在于字库字是Unity3d支持的,图字是NGUI实现的,过程大同小异,这次用图字举例,即UIFont(字库字请参考NGUIText.cs

(本文不详细讨论NGUI中控件是怎样通过组织DrawCall顶点属性并渲染的,留到UIPanelUIWidget中去分析,这里主要分析一下UILable是怎么组织顶点属性的)

1)原理

本文以图字模式举例,前面已经介绍过了,图字的原理是将UI中所需要的文字合成到同一张纹理(也可以是多张),并附其每个字符的描述信息,目的在于渲染时可以得到文字的“uv”,根据属性中设置的位置确定其顶点“位置”,然后对其颜色属性的设置,可以确定每个顶点的“颜色”信息,这样,就满足了Shader对于顶点属性的基本要求,即位置,uv,颜色。

对于图字模式来说,其实和2d中常用的SpriteSheet很类似,只不过SpriteSheet中每个元素是Sprite帧,而图字纹理中是每个可能用到的字符。

(2)实现

图字模式的组织顶点属性的方法在

UIFont.Print(string text, BetterList<Vector3> verts, BetterList<Vector2> uvs, BetterList<Color32> cols)

(具体请参考源码,这里只给出步骤)

a.对于UILable中属性进行初始化赋值及简单元算,包括顶点属性(位置,uv,颜色),解析(颜色和表情)。

b.遍历文本中的每个字符,组织其顶点属性

c.先获取当前字符的BMSymbol信息(前文提到的字符描述信息)

d.位置:在原位置基础上加上偏移,宽高值(来源于BMSymbol,是生成图字纹理时设置生成的,对于每个字符不同)

e.uv:同上,根据BMSymbol

f.颜色:这个属性是根据在UILabel面板中的设置而来的,即前文设置的Gradient BottomGradient Top,这里需要注意的是每个字符的高度不同,从而导致字符所在矩形的上下边界点颜色并不与设置Gradient BottomGradient Top完全相同,而是根据字符的高度和行高插值出来的!代码如下

 

 

3. UILabel 中的 Gradient

效果如图

 

设置如第一幅图,Gradient Bottom设置为纯绿色(0,1.0,0,1.0f)Gradient Top设置为纯红色(1.0f,0,0,1.0f)。(PS: 只为举例,不代表个人审美)

其实相对于UILable的绘制,添加Gradient属性并不是什么难事,之前的NGUI只支持纯色(但是可变颜色)的文本,添加Gradient属性之后,即对字符的颜色根据字符信息,定位每个字符的颜色变化值(不是精确的属性中设置的纯绿色和纯红色,因为每个字符的高度不同,所以字符最上面和最下面的颜色为纯绿色和纯红色之间的某个值而不同),再由Shader插值出渐变的颜色效果。

2017-09-30 18:36:00 ailijiang3022 阅读数 19
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4645 人正在学习 去看看 张刚
 1 using System.Collections;
 2 using System.Collections.Generic;
 3 using UnityEngine;
 4 using UnityEngine.UI;
 5 
 6 [AddComponentMenu("UI/Effects/GradientText")]
 7 public class GradientText : BaseMeshEffect
 8 {
 9     [SerializeField]
10     private Color32 topColor = Color.white;
11 
12     [SerializeField]
13     private Color32 bottomColor = Color.black;
14 
15     public override void ModifyMesh(VertexHelper vh)
16     {
17         if (!IsActive() || vh.currentVertCount == 0)
18             return;
19         List<UIVertex> vertices =  new List<UIVertex>();
20         vh.GetUIVertexStream(vertices);
21         float bottomY = vertices[0].position.y;
22         float topY = vertices[0].position.y;
23         for (int i = 1; i < vertices.Count; i++ )
24         {
25            if( vertices[i].position.y > topY) {
26                 topY = vertices[i].position.y;
27             }
28             else if (vertices[i].position.y < bottomY)
29             {
30                 bottomY = vertices[i].position.y;
31             }
32         }
33         float uiElementHeight = topY- bottomY;
34         UIVertex v = new UIVertex();
35         for (int i = 0; i<vh.currentVertCount; i++)
36         {
37         vh.PopulateUIVertex(ref v, i);
38         v.color = Color32.Lerp(bottomColor, topColor, (v.position.y - bottomY) / uiElementHeight);
39         vh.SetUIVertex(v, i);
40         }
41     }
42 }

 

转载于:https://www.cnblogs.com/pmsl/p/7615891.html

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