层次视图:主要存储游戏场景中的具体游戏物体(模型、物体)
项目视图:游戏资源
e.g.层次视图中的球,项目资源中提供球的外表
父子关系(从属关系):子物体继承父物体的旋转&移动
场景视图:
资源以及资源类型
Profab(预设)可以用来创建一些重复性的东西,运行时实例化,在程序运行时创建或销毁,节省资源,可以通过脚本来随时进行销毁。
Cubemap 一种纹理,立方体六个面定义需要的环境效果
Lense flare 产生当摄像机面向强光的效果,配合摄像机使用
Fonts 添加字体资源(字体特性包括动态字体)
RenderTexture 材质资源,把某个场景进行单独渲染,通过将其转换为一副独立纹理,并覆盖或包裹在某一物体,相当于 在一个物体上播放电影的效果
GUI skin 图形界面效果(如透明效果)
模型和角色东湖的输出设置
模型主要可以以两种方式进行输出:
√
优点:仅仅输出需要的数据
验证数据(在导入Unity前,可以输入会3D软件对数据进行验证)
产生比较少的文件
可以使用模块化的方法,即一模块可以用于碰撞,而另一输出的模块可以用于交互。
而对于其他Unity不支持的3D软件的专有格式,则可以使用插件
缺点:整改输出导入过程可能会反复;
输出版本不容易控制(比如输出多个版本的FBX)
优点: 快速的输出过程,直接从3D 文件到Unity
简单的初始化工程
缺点: 文件中可能包括不需要的数据。
若输出的文件过大,可能会妨碍Unity的更新过程。
比较少的数据检测过程,可能增加出错的几率。
动画片段导入到Unity中:
单个的模型文件,但此文件中包含有 所有的动画片段,在输入到Unity中后,根据各个动画片段的 帧范围来 分割出动画片段
② 不需要一次创建所有的动画片段,而是输出为多个模型文件中,每个模型文件只包含有一个动画片段,如Idle,Run,Walk等,此时不得不输出多个文件,且把这些动画片段输入到Unity中
Heroine_animate@idle[包含有idle名称的动画片段] )
在三维软件输出前需要对动画进行烘焙,动画片段的命名按照一定的规范。
相当于框架
在材质框架中选择不同的shader模型来定义材质的外表
着色器:
相当于框架中的内容
在shader中调节shader中各种特性(如颜色或纹理)
纹理 Texture (外部的图像处理文件处理后导入到Unity中)
物体使用纹理需要一定的条件,尺寸能够被2整除(纹理啊)
纹理可以添加标签,便于搜索
使用纹理:
①直接拖动纹理到纹理样本中
②单击select按钮,在弹出对话框中选择纹理
Bumped Diffuse
在一个模型上使用法线贴图,可以在该简单的模型上实现真实的复杂的效果,减少模型量,提高游戏运行效果。
Bumped Specular
增加了Specular color,(高光颜色)
改变纹理的取样最大尺寸,可以更改游戏的运行效果 (随着取样尺寸的增加,细节层度也会随着增加。)
纹理可以通过材质的方式显示在视图中
通过图形GUI来显示2D纹理
GUI纹理显示:
{} GUI图形元素的绘制
Resource.Load()和Resources.LoadAll()方法 加载资源(使用时需要把文件保存在制定的文件中)
GUI.DrawTexture() 把纹理绘制在视图中
通过JavaScript显示纹理(按钮)
Moive纹理的格式:
动画纹理,用户可以向平常资源一样将其放置在Asset资源文件夹中进行导入。当一个视频文件添加到项目中时,它会被自动输入并被Unity转为Ogg Theora格式,然后可以像谱图纹理那样进行使用。
(Moive纹理是通过Apple Quick Time导入的,支持的格式为.mov, .mpg, .mpeg, .mp4, .avi, asf)
声音文件
Audio source和Audio Listener共同作用才能使声音在场景中播放。
Audio source添加在声源体,Audio Listener添加到camera中。
有2D声音or3D声音。
PlayOneshot 可以播放指定的声音片段。
Prefab(预设)
重用性
运行实例化
(预设)实例的继承性
实例的重载(revert取消所有的重载/apply所有的预设都与重载一致)
①createPrimitive创建物体
②instantiate创建多个物体的实现——修改时对预设物体进行修改即可,不用添加别的代码;预设实例化所产生的物体都是预设的克隆物体,因此可以提高程序运行效率和节省内存空间。
具有功能的游戏物体= 基础框架的基础上+组件
Component:具有某种功能代码
刚体组件-》物体可以运动
动画组件-》物体具有动画
Transform-》物体在场景中旋转、移动等等
引用源组件-》如音频。。。。
可以拷贝组件属性
属性编辑器的使用
Unity把脚本认为是自定义的组件类型,因此脚本的变量也会显示在属性编辑器中,因此可以在属性编辑器中设置。
场景视图操作
使某物体成为显示中心,先选择该物体,鼠标移动到场景视图中,按F键后该物体则显示在场景中心。
Alt键+鼠标左键/鼠标中键/鼠标右键
V键:顶点吸附,可以使两个物体快速对齐。
标签图标(使用图标功能可以方便地查看重要的游戏物体,方便对其进行选择和操作)
Shift + 点击中间方块
灯光定义场景的颜色和基调。
颜色来改变场景的基调(明暗变化以及颜色色调)
实时灯光:运行时改变
灯光贴图:(灯光不变)提高游戏运行速度
不同的渲染路径,对游戏发布的灯光的质量和效果产生影响
点灯光:(模拟蜡烛或灯泡)
聚光灯:(模拟手电筒或汽车头灯)
方向灯光:(模拟太阳光)
区域灯光:(灯光属性贴图)
cookie(使用纹理来定义,相当于一个部分透明的纸片,从而定义灯光投射的形状)
灯光阴影,灯光使用阴影使用较多的系统资源来处理,也是渲染路径的一项。
(Auto、Important(如车辆的头灯)、Not Important) )、culling mask
摄像机
clear flags 摄像机在渲染过程中,如何设置其背景以及如何处理在渲染过程中所产生的颜色和深度信息等等。天空盒和实体颜色, 设置摄像机 在渲染过程中 对于不存在物体时的处理。Depth only用于场景中有多个摄像机,设置渲染顺序,清除深度信息,保留颜色信息,产生正确的叠加效果。 Don't Clear 每一帧都叠加在上一帧上,形成涂抹拖尾效果。
Culling mask 通过层方式渲染
Depth 深度值大的摄像机的渲染内容叠加在深度值小的摄像机的渲染画面上。
Target Texture (如水面)
Unity脚本的使用
脚本的执行,必须把脚本连接到场景中的激活物体。
Javascript脚本
function Start函数 在脚本激活时执行且只执行一次,常用于变量的初始化操作
每一帧都会执行。
e.g. transform.Rotate(0, speed*Time.deltaTime, 0);
rigidbody.mass=(Mathf.Sin(Time.time)+1);
Debug.Log(rigidbody.mass);
通过变量的使用,提高脚本的重用性,以及测试脚本的运行效果。
面向对象
.gameObject.transform.Roate(0, speed*Time.deltaTime, 0);
游戏物体的一些组件可以使用成员变量的方式直接访问。
使用成员变量的方式来直接访问 , 则在脚本中需要定义变量,使用获取组件语句来对他们进行引用。
e.g. B脚本中定义变量:
public var wide = 5.0;
A脚本获取组件语句:
var other : ScriptB;
function Start () {
other = GetComponent( ScriptB ); 或 other = GetComponent.<ScriptB>();(语句的泛型写法)
Debug.Log( other.wide );
}
游戏对象访问操作控制
属性编辑器中引用其他物体
#pragma strict
var target : Transform;
function Start ( ) {
} function Update ( ) { target.renderer.material.color = Color.red;
}
可以使用拖动方式来赋值或选择框中选择赋值
或
#pragma strict
var target : SphereScript;
function Start ( ) {
//target.DoSomething();
}
function Update ( ) { target.renderer.material.color = Color.red;
}
定义变量来访问,拖动对象来赋值
GameObject.Find()函数来访问
#pragma strict
var target : GameObject ;
function Start ( ) {
target = GameObject .Find("Sphere");
// target = GameObject
.Find("/Main Camera/Sphere");
}
function Update ( ) {
target.renderer.material.color = Color.red;
}
通过物体的名称,或路径来查找场景中的物体
标签访问控制
#pragma strict
var target : GameObject ;
function Start ( ) {
GameObject.FindGameObjectWithTag("SphereTag");
// target = GameObject
.FindGameObjectsWithTag("SphereTag"); 返回物体数组 可以使用for循环语句对物体数组进行处理
}
function Update ( ) {
target.renderer.material.color = Color.red;
}
脚本时间控制
deltaTime变量,记录自上一次更新语句执行完成所花费的时间,使物体执行以恒定速度执行,不受计算机的性能影响。
e.g.
点灯光范围改变,速度恒定:
function Update () {
light.range += 2.0 * Time.deltaTime;
}
处理刚体物体,不适用detlaTime,因为刚体引擎已经有固定更新,所以不会有帧速率不一致的问题。
e.g.
Yield语句是一种特殊类型的Return语句,它可以确保函数下一次被执行时,不是从头开始,而是从Yield语句处开始。
e.g. function Start ( ) {
yield WaitForSeconds(5.0); // 程序等待5s后执行
}
在start中同时执行两个函数。
随机数的使用
e.g.
#pragma strict
function Start ( ) {
var a : float;
a = Random.value;
Debug.Log("a的数值是:"+a);
var b : int;
var c : float;
b = Random.Range(1,100);
c = Random.Range(0.0, 10.0);
Debug.Log("产生1到100之间的整形随机数:"+b);//产生的整数数字不可能为最大数
Debug.Log("产生1到10之间的浮点随机数:"+c); //产生的数字最大和最小都可能
}
function Update ( ) {
}
多用于NPC的随机反应:
e.g.
#pragma strict
//保存NPC反应的概率
private var probValue : int;
function OnGUI ( ) {
if (GUI.Button(Rect(10,70,50,30), "Click"))
{
probValue = Choose(proArray);
switch(proValue) {
case 0:
Debug.Log("NPC向我敬礼");
break;
case 1:
Debug.Log("NPC离开了");
break;
case 2:
Debug.Log("NPC打我了");
break;
case 3:
Debug.Log("NPC给我送钱了");
break;
Debug.Log("木有遇见NPC");
}
}
}
表盘,投掷飞镖
function Choose(probs : float [] ) {
var total = 0.0;
for ( elem in probs) {
total += elem;
}
var randomPoint = Random.value * total;
var i : int;
for ( i = 0; i < probs.Length; i++) {
if ( randomPoint < probs[i])
return i;
else
randomPoint -= probs[i];
}
}
JavaScript脚本
#pragma strict
var obj : GameObject;
function Start ( ) {
obj = GameObject.Find("Cube");
var script: jsTest = obj.GetComponent("jsTest"); //获取组件语句,获取组件后可以使用它的函数。
script.SetInt(50);
scirpt.SetFloat(0.9);
Debug.Log(script.getInt());
Debug.Log(script.getFloat());
}
function Update ( ) {
}
C#脚本
物体间通信方式
JS消息传递函数:
GameObject.SendMessage : 向自身的脚本中发送消息
GameObject.BroadcastMessage:向自身及子物体的脚本发送消息
GameObject.SendMessageUpwards : 向自身及父物体的脚本发送消息
e.g.
function Start ( ) {
gameObject.SendMessageUpwards ("ApplyDamage", 5.0 );
//指定自身或其他物体中的接受消息的函数名(发送消息后,其他物体中的该函数就会执行),附带消息中可以传递的函数消息类型
}
C# 使用EventDispatcher和Listener
在EventDispatcher中定义委托以及事件
在Listen中 获取引用,后对监听函数进行重载。
可以把监听定义到 多个物体对某一个物体的监听。
导入插件:
Assets -> import package -> custom package (导入自定义包)
插件不应该放在中文目录下。