第一人称射击游戏实战——标签的封装和场景的淡入淡出效果

标签的封装和场景的淡入淡出效果

知识点一:标签

标签用来识别游戏物体的,必须在使用之前在标签管理器中定义。
创建文件夹Screen->C#script(命名Tags)

相关代码

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

public class Tags
{
	public const string plaer="Player";
	public const string gameController="GameController";
	public const string enemy="Enemy";
	public const string fader="Fader";
	public const string mainCamera="MainCamera";
}

知识点二:场景的淡入淡出效果

知识储备

1.首先考虑用到Lerp表示颜色的变化
static function Lerp(a:color,b:color,t:float):Color
通过t在颜色a和b之间插值,t属于[0,1],t=0时,返回颜色a;
t=1时,返回颜色b。
2.GUITexture.pixelInset像素嵌入(用于像素调整大小和位置)
pixelInset:Reset
GUITexture.pixelInset=Rect(x,y,width,height)
用于规划GUITexture的位置以及宽高,若x,y都为0时,居于
屏幕中心,正负情况符合直角坐标的四个象限。
3.像素的Alpha通道
大概有第一通道的内涵,其数值可以改变透明度,但是Alpha
和透明度无关。例如每个像素用16比特存储,RGB表示法的话,
R用5bit,G用5bit,B用5bit,最后一位是Alpha通道。因为只有
1bit,只能用0或者1表示透明和不透明。如果是用32比特储存,
R用8bit,G用8bit,B用8bit,因此Alpha通道用8bit表示,这样
就有256中不同的不透明度。
4.Time.deltaTime:float
以秒为单位,直到完成最后一帧用的时间。若乘上数字,例如10*Time.deltaTime 表示每秒10米。
5.tex.enabled:bool
判断GUI是否启用,设置为False,表示禁用GUI互动,且所有
控件绘制成半透明,不响应用户输入。
6.SceneManager.LoadScene("Demo")
场景同步加载,异步加载为LoadSceneAsync。可以通过设置AllowSceneActivation=false来控制进度到90%是否加载场景
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.SceneManagement;
public class FadeInOut:MonoBehaviour
{
	private float fadeSpeed=1.5f;//淡入淡出的速度
	private bool sceneStarting=true;//场景开启的标志
	private GUITexture tex;//申明界面纹理变量
	void Start()
	{
		tex=this.GetComponent<GUITexture>();
		//与transform,rigidbody一样,需要先获取组件,再调用相关方法,修改GUITexture的相关属性,这里是GUITexture对象的实例化
		tex.pixelInset=new Rect(0,0,Screen.width,Screen.height);
		//设置界面纹理为全屏	
	}
	private void FadeToClear()
	{
		tex.color=Color.Lerp(tex.color,Color.clear,fadeSpeed*Time.deltaTime);
	}
	//淡出
	private void FadeToBlack()
	{
		tex.color=Color.Lerp(tex.color,Color.black,fadeSpeed*Time.deltaTime);
	}
	//淡入
	private void StartScene()
	{
		FadeToClear();
		if(tex.color.a<=0.05f)//注意:a表示alpha通道,这里属于[0,1]。
		{
			tex.color=Color.clear;
			tex.enabled=false;
			sceneStarting=false;
		}
	}
	public void EndScene()
	{
		tex.enabled=true;
		FadeToBlack();
		if(tex.color.a>=0.95f)
		{
			SceneManager.LoadScene("Demo");
		}
	}
	void Updata()
	{
		if(sceneStarting)
		{
			StartScene();	
		}
	}
}

———————————————————————————
因为unity2018就将GUITexture给删除了,因此场景的淡入淡出就结合UI->Canvus->Rawimage或者image来实现。

知识储备

1.什么是图集
图集在使用3D技术开发2D游戏或制作UI时(即使用GPU绘制),都会使用到图集,而使用CPU渲染的2D游戏和UI则不存在图集这个概念(比如Flash的原生显示列表),那么什么是图集呢?准确的说法图集是一张包含了多个小图的大图和一份记录了每个小图id、位置、尺寸等数据的数据文件,一个图集应该对应两个文件,当然也有人把数据集成到图片中,导致看起来只有一张图片(参考自DragonBones的做法)
2.为什么要用图集
在GPU已经成为PC、手机等设备的必备组件的现在,把所有显示的绘制操作交给专门处理图像的GPU显然比交给CPU更合适,这样空闲下来的CPU可以集中力量处理游戏的逻辑运算。
而GPU处理图像的做法和CPU是不一样的,在GPU中,我们要绘制一个图像需要提交图片(即纹理)到显存,然后在进行绘制(这个过程称为一次DrawCall),那么如果我们一帧要绘制100个就需要提交100次图片,如果使用包含了这100图片的图集,只需要一次提交即可,即一次DrawCall就搞定,处理效率上会有很大的提升。另外使用图集也方便管理和归类各个模块的图片,可以通过一次加载和一次卸载完成多个图片的处理,同理,加载次数也下来了,可以提升运行效率。

知识点三:

UITexture和UIsprite的区别
一. UISprite和UITexture的区别
UISprite: NGUI引入图集的概念,不考虑ABA叠层的情况下,一个图集内的图片用UISprite,那么它就是一个DrawCall。但是如果你做了一个图集是1024X1024的。此时你的界面上只用了图集中的一张很小的图,那么很抱歉1024X1024这张大图都需要载入你的内存里面,1024就是4M的内存,如果你做了10个1024的图集,你的界面上刚好都只用了每个图集里面的一张小图,那么再次抱歉你的内存直接飙40M。

UITexture:它完全没有图集的概念,使用起来非常的灵活,只需要把图片挂上去就行了。这样内存里只会占用你这一张图的大小,内存虽然小了但是DrawCall就上去了。因为每一张UITexture就是一次DrawCall。另外自己独立存在,有自己的材质球和Shader。
二.UISprite和UITexture的使用选择
UITexture
(1)当图片过大,不适合合成图集的时候,可以使用UITexture,此时要尽量的保证图片的宽高是2的N次方。
(2)当图片为2的N次方,但出现的频率不高时,可以使用UITexture。例如游戏的背景和Logo。
(3)修改更改特别频繁的图片,为了减少每次更新维护的麻烦,可以考了使用UITexture。
(4)如果图片很小且多处会使用到(例如按钮 == )尽量将图片放入图集,通过精灵的方式使用。
UISprite
(1)sprite对于NGUI来说,是非常基础的元件,经常不会独立使用。例如进度条的Foreground和Background。
(2)如果要显示一张图片,它的形状不规则,长宽不是2的N次方,那么一定要使用UISprite。因为unity对非2的N次方的图片处理要慢很多。
(3)如果这个UI元件频繁的出现,那么最好使用UISprite,因为这样它就可以和图集一起被载入内存,并不用新增一个DrawCall去渲染它。
(4)对于一些展示型的图片,不会变化,只是起一个展示的作用,例如弹框上的花纹装饰,顶部的花圈==。一般都以UISprite的方式来制作和展示。
————————————————
版权声明:本文为CSDN博主「turbosdx」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/shadaoxi/article/details/44753737
根据以上特点,我们制作场景的淡入淡出是用来做游戏开始和结束的画面,就可以用到Rawimage。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值