上文地址 小白Unity入门(上)
本篇文章还是学习总结,如写的有问题,请指出,谢谢!
旧版 UI 组件之 GUIText
常用 UI 系统简介
NGUI
NGUI 是一款使用最多的第三方的 UI 插件。
目前国内大部分的游戏的界面 UI,都是使用 NGUI 这个插件来编写实现的。UGUI
Unity 自 4.6 版本后自带的一套 UI 系统。
随着 UGUI 的不断完善,慢慢的也有公司使用 UGUI 来编写游戏的界面 UI。
GameObject–>UI 菜单下,是 UGUI 的相关 UI 对象。
Component –> UI 菜单下,是 UGUI 的相关 UI 组件。OnGUI
现在主要用于 Unity 引擎的界面扩展。
NGUI 和 UGUI 都是“所见即所得”的形式制作 UI,而 OnGUI 类似于 Web开发中的 html 和 css的编写。Legacy GUI
旧版 UI,只有两个组件,文字和图片,配合鼠标事件来实现界面 UI。
这个在公司的实际游戏项目开发中,几乎不会用到。
本篇文章主要讲的就是这个UI——Legacy GUI,因为这个 UI 系统非常简单,在我们学习Unity 的过程中,可以实现一些“并不是很漂亮,但能用”的 UI 界面。
GUIText 组件
- GUIText 简介
GUIText 组件主要用于文字的显示。 - 创建 GUIText
①新建一个空游戏物体。
②给这个空游戏物体添加“GUIText”组件,步骤如下:
Component->Rendering->GUI Text
③这个游戏物体就可以用来负责显示文字了。 - GUIText 常用属性
Text(文字)
设置 GUIText 组件显示的文字。
Font Size(文字大小)
设置文字显示的大小,默认是 0。
Pixel Offset(像素位置偏移)
通过 x 轴和 y 轴两个值,设置文本组件在场景中显示的位置。
- GUIText 简介
- 要点注意
前面三个属性设置完毕后,我们的文本 UI 就可以正常显示了。
另外 GUIText 组件只能在 Game 窗口测试,Scene 窗口看不到。
Color(颜色):用于设置文字的显示颜色。
旧版 UI 组件之 GUITexture
GUITexture 简介
GUITexture 组件主要用于图片的显示。创建 GUITexture
①新建一个空游戏物体。
②给这个空游戏物体添加“GUITexture”组件,步骤如下:
Component->Rendering->GUI Texture
③这个游戏物体就可以用来负责显示图片了。GUITexture 使用步骤
①首先先将 GUITexture 的 Scale 缩放属性全部设置为 0.1 的显示比例。
②然后再设置 GUITexture 组件的相关属性。GUITexture 常用属性
Texture(纹理)
设置要显示的图片。Color(颜色)
设置图片的颜色。默认状态时 Color 属性是不会影响图片显示效果的。Pixel Inset(像素设置)
X(轴)和 Y(轴)设置图片显示的位置。
W(width)和 H(height)设置图片的宽度和高度。
要点注意
GUITexture 组件同样也只能在 Game 窗口测试,Scene 窗口看不到。鼠标事件
常用事件方法
OnMouseEnter() :鼠标进入
OnMouseExit() :鼠标离开
OnMouseDown() :鼠标按下[单击]颜色参数
Color 结构体,里面有常用的颜色。
Color.red;Color.green;Color.blue ……
特效组件之 TrailRenderer
TrailRenderer 简介
简介
TrailRenderer,拖尾渲染器,作用是用于渲染显示“拖尾特效”。
拖尾:物体后面拖着的尾巴,现实生活中存在的拖尾比如流星拖尾。拖尾在游戏中的运用
拖尾特效在游戏中也被大量的使用和运用,比如发射出去的炮弹,子弹,导弹。
只要这些物体是高速运动的,为了体现他们的运动快,往往都会在他们的后面加上一个拖尾特效。
这里可以看到拖尾的一个重要用途:体现物体的运动速度。- 创建拖尾特效
①新建一个空游戏物体;
②给这个空游戏物体添加 TrailRenderer 组件,步骤如下:
Component–>Effects–>Trail Renderer
③在 Scene 面板移动这个空物体的位置,就可以看到最原始的拖尾效果。
TrailRenderer 材质球
- Materials(材质球)
设置“拖尾渲染器”这个组件使用哪个材质球来渲染拖尾。 注意事项:
Unity3D 中所有以“Renderer”为后缀进行命名的组件,都需要给他们指定材质球,比如之前讲解的 Mesh Renderer。
当这类组件身上没有材质球的时候,默认就会显示成“粉红色”。以后再看到某些游戏物体显示成了这种“粉红色”,你就要知道这些游戏物体缺失材质球。制作透明材质球
①创建一个材质球;
②设置该材质球的 Shader 为 Particles/Additive;(粒子/添加物)
③给材质球拖拽赋予贴图;
- Materials(材质球)
TrailRenderer 常用属性
Time(时间)
设置拖尾特效的持续时间。Start Width(开始宽度)
设置拖尾开始时的宽度。End Width(结束宽度)
设置拖尾结束时的宽度。Color(颜色)
设置拖尾显示的颜色。
在实际开发中,美工人员给我们的贴图往往是“黑白图”,这种图片中黑色是透明区域,白色是不透明区域,可以简单记忆为“黑透白不透”。
我们可以通过设置这里的 Color 属性值,来让白色区域显示成特定的颜色。
特效组件之 LineRenderer
LineRenderer 简介
简介
LineRenderer,线渲染器,作用是用于渲染显示“线特效”。
线:就是一根线。我们要想绘制一根线,需要至少两个点,在游戏中也不例外。
现实生活中比如玩具激光灯照射出来的线。线特效在游戏中的运用
线特效在游戏中常用于渲染激光效果,或者用于子弹瞄准。创建线特效
①新建一个空游戏物体;
②给这个空游戏物体添加 LineRenderer 组件,步骤如下:
Component–>Effects–>Line Renderer
- LineRenderer 材质球
- Materials(材质球)
设置“线渲染器”这个组件使用哪个材质球来渲染线。 - 制作透明材质球
①创建一个材质球;
②设置该材质球的 Shader 为 Particles/Additive;(粒子/添加物)
③给材质球拖拽赋予贴图;
- Materials(材质球)
LineRenderer 常用属性
Positions(位置)
设置线的开始点和结束点的位置。Start Width(开始宽度)
设置线开始时的宽度。End Width(结束宽度)
设置线结束时的宽度。Start Color(开始颜色)
设置线的开始颜色。End Color(结束颜色)
设置线的结束颜色。
声音组件之 AudioSource
AudioClip 音频剪辑
音频简介
在 Unity3D 游戏开发过程中,为了烘托场景氛围,会大量的使用到各种各样的“声音”来制造场景氛围。
比如:游戏的背景声音,各种武器的特效声音,刀剑武器的挥舞声音……
如果一个游戏中没有了声音,至少会降低玩家一半的游戏快感,声音在游戏开发和制作的过程中是非常重要的。AudioClip
AudioClip:音频剪辑(音频片段)。
我们导入到 Unity 中的所有的声音文件,他们在 Unity 引擎中的资源类型都是
AudioClip类型。
Unity 能使用的音频格式: .aif .wav .mp3 .ogg
我们可以在 Project 面板的 Assets 文件夹中创建一个“Audios”文件夹来存放和管理游戏中使用到的音频资源。AudioSource 组件
- 组件简介
AudioSource:音频源组件,作用是用于播放音频剪辑(AudioClip)资源。
你可以将音频源组件当成一个“音响”。 - 创建 AudioSource
①新建一个空游戏对象;
②给这个空游戏对象添加 AudioSource 组件,步骤如下:
Component–>Audio–>AudioSource
- 组件简介
AudioSource 常用属性
AudioClip(音频剪辑)
指定该音频源播放哪个音频文件。Play On Awake(在唤醒时开始播放)
勾选之后,在游戏运行起来之后,就会开始播放。Loop(循环)
勾选之后,声音会进入“单曲循环”状态。Mute(静音)
勾选之后,静音,但是音频还是处于播放状态。Volume(音量)
为 0 时,无声音;为 1 时,音量最大。Spatial Blend(空间混合)
设置声音是 2D 声音,还是 3D 声音。
为 0 时,是 2D 声音;为 1 时,是 3D 声音。
Audio Listener 组件
Audio Listener:声音侦听器,其实就是我们在游戏世界中的“耳朵”。
我们依靠这个组件来听游戏世界中的声音,如果没有了这个组件,我们是听不到
任何声音的。
默认状态这个组件,是挂载到我们的摄像机身上的。AudioSource 常用函数
Play() 函数
播放音频剪辑。Stop() 函数
停止播放。Pause() 函数
暂停播放。
常用 API 之实例化与销毁
实例化游戏物体
游戏中的案例介绍
在很多 MMORPG 类的游戏中都有类似于“金钱副本”的副本关卡。在这类副本中通常都是限定一个时间,在这个时间内玩家可以尽情的破坏,然后收集金钱。案例场景制作
①创建地面模型;
②创建“坛子”模型,并制作成预制体;实例化生成 1 个坛子
GameObject.Instantiate(Object, Vector3, Quaternion);
参数说明:
Object:用于实例化的预制体;
Vector3:实例化后生成的物体所在的位置;
Quaternion[四元数]:实例化后生成的物体的旋转状态;
Quaternion.identity:无旋转;构造随机位置
位置是用 Vector3 类型进行表示的。
X,Y,Z 三个值确定了物体在三维世界中的位置。
Random.Range(min, max):生成随机数。
在 min 和 max 直接随机生成一个随机数。
销毁游戏物体
GameObject.Destroy(Object, float);定时销毁某个游戏物体。
参数说明:
Object:要销毁的游戏物体;
float:时间,多少秒后销毁;
常用 API 之 Invoke 函数调用
金钱副本细节完善
宝箱自动掉落
给宝箱预制体添加刚体组件即可。实现按键宝箱批量掉落
①将实例化生成宝箱的代码单独封装成一个函数;
②使用 for 循环,批量生成宝箱。宝箱自动掉落
现在我们是通过按下某键,然后程序调用“生成宝箱”的函数,来实现功能。
在真正的游戏中,这个“生成宝箱”的函数,也是需要由程序自动调用的。那么如何实现呢??往下看~
Invoke 函数
Invoke 函数代码
Invoke(string,float):多少秒后执行某个函数[只会调用一次]。
参数说明:
String:要执行的函数的名称;
Float:秒数,倒计时的时间;InvokeRepeating(string,float,float):多少秒[第二个参数]后执行某个函数,并且以后每隔多少秒[第三个参数]都会执行该函数一次[重复调用N次]。
参数说明:
String:要执行的函数的名称;
Float:秒数,准备时间,预热时间;
Float:秒数,重复调用的间隔时间;
CancelInvoke():取消这个脚本中所有的 Invoke 调用。
Invoke 函数的家在哪儿?
Class 类可以理解成是一个“家”,各种各样的函数(方法),字段,属性可以理解成是这个“家”的家庭成员。
那么,这三个 Invoke 相关的函数,他们的家在哪儿?
回答:MonoBehaviour类。金钱副本主角控制
主角基本控制
①创建一个 Cube 模型,美化一下,作为主角;
②添加刚体组件,使用刚体的 MovePosition 结合按键控制主角移动。控制主角与 Box 碰撞
①主角碰撞到 Box,Box 自动销毁。
常用 API 之消息发送
金钱副本细节完善
主角战斗
①主角碰撞到 Box,Box 消失后,在消失的位置生成 1 枚金币;
②金币设置为触发器模式,且自身要不停的旋转;
③主角编写触发器处理代码,触发销毁金币。SendMessage 消息发送
SendMessage 函数
gameObject.SendMessage(string):通知这个游戏物体身上的脚本文件中的“指定方法”执行。
参数说明:
String:方法名,要执行的方法的名称;完善金钱副本
①创建一个 GUIText 用于显示分数;
②给金币创建脚本,金币获取到 GUIText 组件的引用;
③在金币脚本中编写“增加分数”的函数;
④当金币销毁时,SendMessage 通知该“增加分数”函数执行。
常用 API 之协同程序
协同程序简介
什么是协同程序
协同程序,简称“协程”。在脚本运行过程中,需要额外的执行一些其他的代码,
这个时候就可以将“其他的代码”以协程的形式来运行。
类似于开启了一个线程,但是协程不是线程。协同程序的使用前提
只有在继承了“MonoBehaviour”这个类的子类中才能使用相关的协程方法。
协同程序语法格式
- 定义协同程序
协同程序就是一个“代码片段”,往往我们需要将这个代码片段封装成一个方法,或者称之为函数。
- 定义协同程序
IEnumerator Task3() { yield return new WaitForSeconds (2); Debug.Log ("任务 3"); }
参数说明:
IEnumerator:协同程序的返回值类型;
yield return:协同程序返回 xxxxx;
new WaitForSeconds (秒数):实例化一个对象,等待多少秒后继续执行。
这个 Task3()的作用就是等待两秒后,继续执行任务 3.
2. 开启协同程序
StartCoroutine(“协同程序方法名”);
这个 StartCoroutine 有三种重载形式,目前先只介绍这一种。
3. 停止协同程序
StopCoroutine(“协同程序方法名”);
这个 StopCoroutine 也有三种重载形式,目前先只介绍这一种。
常用 API 之脚本生命周期
脚本生命周期简介
脚本作为我们游戏的“灵魂”,往往不单独存在,而是经常作为组件的形式挂载到特定的游戏物体身上,比如:游戏主角,敌人,Boss,子弹,建筑物……脚本的生命周期,也就是所挂载到的游戏物体的生命周期。
脚本的生命周期,就是挂载到的游戏物体“从出生到死亡”,所经历的一些事件。这些生命周期事件,是一些特定的方法,且是由 Unity 引擎事先定义好的,在游戏的运行过程中,由引擎自动调用。
这些生命周期事件,全部定义的 MonoBehaviour 这个类中。也就意味着只有继承自这个类的脚本,才有这些生命周期事件。[见图]
常用生命周期事件
通过一个小的 Demo 演示,来讲解生命周期事件:
按下键盘上的某个键,然后在场景中实例化一个 Cube 物体,
这个 Cube 物体身上挂载一个脚本,用于测试它的生命周期事件。Awake() ※
唤醒事件,只执行一次。OnEnable()
启用事件,只执行一次。当脚本组件被启用的时候执行一次。Start() ※
开始事件,只执行一次。FixedUpdate() ※
固定更新事件,执行 N 次,0.02 秒执行一次。
所有物理组件相关的更新都在这个事件中处理。Update() ※
更新事件,执行 N 次,每帧执行一次。LateUpdate()
稍后更新事件,执行 N 次,在 Update 事件执行完毕后再执行。OnGUI()
GUI 渲染事件,执行 N 次,执行的次数是 Update 事件的两倍。OnDisable()
禁用事件,执行一次。在 OnDestroy 事件前执行。
或者当该脚本组件被“禁用”后,也会触发该事件。OnDestroy() ※
销毁事件,执行一次。当脚本所挂载的游戏物体被销毁时执行。注意事项
生命周期事件,全部是由系统定义好的,且系统会自动调用。
系统调用这些事件的顺序,和我们代码里面的书写顺序无关。
- 替换代码编辑器
将 Unity 自带的 MonoDevelop 替换成微软的 VS 2013 编辑器。
操作步骤:
Edit–>Preferences…–>Unity Preferences 面板–>
External Tools–>External Script Editor 位置进行下拉选择设置。
常用 API 之工具类
Screen 屏幕类
作用
这个类中包含屏幕相关的数据信息。类中常用属性
Screen.width:静态只读属性,屏幕的宽度。
Screen.height:静态只读属性,屏幕的高度。
备注:在 Unity 的开发模式下,这两个值取的是 Game 窗口的宽度和高度。
在项目编译打包后,再运行,就是具体的设备的屏幕的宽度和高度。
Time 时间类
作用
这个类中包含时间相关的数据信息。类中常用属性
Time.time
静态只读属性,游戏时间。从游戏开始到现在所经过的秒数。Time.deltaTime
静态只读属性,时间增量。渲染完上一帧画面所消耗的时间。
[可以用于实现倒计时效果]- Time.timeScale
静态属性,时间缩放。[可以用于暂停游戏]
当值为 1 时,游戏是正常状态;为 0 时,游戏是暂停状态;为 0.5 时,游戏是处于慢放 0.5 倍的状态。
Mathf 数学类
作用
这个类(其实 Mathf 是结构体类型)中包含了各种各样的数学运算相关的函数。常用函数
Mathf.Abs() 取绝对值
Mathf.Max() 取最大值
Mathf.Min() 取最小值
Mathf.Round() 四舍五入- 插值运算函数
Mathf.Lerp(float a,float b,float t)
:插值运算
基于浮点数 t 返回 a 到 b 之间的插值,t 限制在 0~1 之间。
当 t = 0 返回 a,当 t = 1 返回 b。当 t = 0.5 返回 a 和 b 的平均值。
演示:一个数从 0,插值到 10。
备注:Lerp()这个函数,在很多类中都存在,插值运算的目的基本都是为了
“平滑过渡”。
物理射线之原理分析
物理射线简介
何为物理射线?
从一个点往一个方向,发射一根无限长的射线,这根射线与场景中的其余的游戏物体的碰撞体组件相碰撞,射线即结束。
由于射线可以与物理组件 Collider 相交互,所以“射线”也称之为“物理射线”。物理射线的应用范围?
超人的激光眼,X 战警镭射眼。
物理射线相关方法
通过摄像机创建射线
演示:按下鼠标左键发射射线。- Camera.main 代表 tag 设置为“MainCamera”的摄像机的 Camera 组件的引用。
m_Camera.ScreenPointToRay(Vector3)
摄像机组件(对象)下的一个方法。屏幕点转化为射线,这个方法会返回一个 Ray 类型的射线。
这个屏幕点通常写鼠标的点击位置,这样的话,就代表从摄像机的位置开始,往鼠标点击点这个方向,发射一根射线。Input.mousePosition
鼠标所在的位置值。- Ray射线,一个结构体。
代码完整格式:
ray=Camera.main.ScreenPointToRay(Input.mousePosition);
检查射线与其他物体的碰撞
RaycastHit
一个结构体,用于存储射线的碰撞信息。Physics.Raycast(Ray, out RaycastHit)
物理类下面有一个静态方法叫做 Raycast(),射线检查。
检查这根射线,如果射线与场景中的物理碰撞了,返回值为真,并且将碰撞信息,存储到 RaycastHit 类型的变量中。物理射线使用步骤
第一步:创建一根射线。
第二步:检查这根射线与其他物体的碰撞,得到碰撞信息。
第三步:通过碰撞信息对碰撞到的物体进行处理。
PC 端游戏打包与发布
游戏打包发布简介
简介
现在的项目文件必须在 Unity 引擎中才能运行,通过“打包发布”可以将工程文件转换成独立的“游戏文件”,就可以脱离 Unity 引擎直接在电脑上运行。打包好的“游戏文件”就可以到处发布传播了。Unity 发布游戏
Unity 的最大的一个特点就是“跨平台运行”,一处开发多处运行。
常用的发布平台:Windows,Android,IOS,Mac,Web……
我们现在演示打包发布 Windows 版本的游戏。
Unity 发布 PC 版游戏
Build Settings[生成设置]
File–>Build Settings 弹出项目生成设置面板。
① 选择要发布到的平台;
② 添加要发布的场景;Player Settings[详细设置]
Company Name:公司名称
Product Name:产品名称(游戏名称)
Default Icon:默认图标成品文件介绍
一个 exe 可执行文件,一个 Data 数据文件夹,两个缺一不可以,且不可分割。
学点英语
You only live once, but if you do it right, once is enough.
年华没虚度,一生也足矣。