第二讲:Unity资源管理【持续更新中】
2.1 Unity 资源及资源类型
2.2 模型和角色动画的输出设置
2.3 材质和着色器
2.4 2D 纹理和 Moive纹理
2.5 声音文件
2.6 Asset Store( 资源 Store)
2.7 Prefab( 预设 )
2.8 Project视窗搜索功能
2.9 资源输入原理( metadata )
【模型】
* 模型主要可以以两种方式进行输出:
1. 使用插件进行输出。并输出为指定的文件格式,如FBX或OBJ。
2. 直接输出为相应的3应用文件,如.max或Blend,Unity自身再进行转换。
* 使用3D软件自身格式进行输出:
优点:
1. 快速的输出过程,直接从3D文件到Unity
2. 简单的初始化过程
不足:
1. 文件中可能会包括不需要的数据;
2. 若输出文件过大,可能会妨碍Unity的更新过程;
3. 比较少的数据校验过程,可能会增加出错几率。
* 使用插件进行输出:
优点:
1. 仅仅输出你需要的数据;
2. 验证数据;(在导入Unity中之前,可以重新输入回3D软件对数据进行验证);
3. 产生比较小的文件;
4. 可以使用模块化的方法,即一模块可以用于碰撞,而另一输出的模块可以用于交互。
5. 对于其他Unity不支持的3D软件的专有格式,可以使用插件。
不足:
1. 整个输出导入过程可能会反复;
2. 输出版本不容易控制(比如输出多个版本的FBX)。
【动画】
* 两种动画的输入方式:
1.第一种方式:我们从三维软件中输出一个单个的模型文件,但此文件中包含有所有的动画片段,在输入到Unity中后,根据各个动画片段的帧范围来分割出动画片段;
2.第二种方式:在三维软件包中,我们不需要一次性创建所有的动画片段,而是输出为多个模型文件中,每个模型文件中只包含有一个动画片段,如Idle,Run,Walk等,此时不得不输出多个文件,这时要把这些动画片段输入到Unity中,还需要遵循一定的命名规范:例如,我们输出一个名称为Heroine_animate的不带有任何动画片段的基本的FBX模型文件,然后我们再输出一个包含有idle名称为Heroine_animate@idle的动画片段,以此类推,这样在Unity中才能恰当的使用它们。
1. 纹理尺寸应该是2的幂次方;
2. 材质是基础,然后可以把纹理加载到材质上,然后加载到物体上;
3. 材质?---着色器模型?--纹理。
【2D纹理】
Gui纹理显示:Texture2D
1.Function OnGui()
{//绘制
}
2.Resources.Load(“路径”)和Resources.LoadAll()方法//加载资源
3.GUI.DrawTexture()//绘制
【Movie纹理】
Movie纹理的格式:
1. Movie纹理是从视屏文件中产生的一系列动画纹理,用户可以像平常资源一样将其放置在Asset资源文件夹中进行导入;
2. Movie纹理是通过Apple Quick Time导入的,因此凡是Quick Time支持的格式,Movie纹理都可以支持:.mov,.mpg,.mpeg,.mp4,.avi,.asf;
3. 当一个视频文件添加到项目中时,他会被自动输入并被Unity转换为Ogg Theora格式,然后可以像普通纹理那样进行使用。
1. 声音文件可以直接拖拽添加;
2. 声音产生和监听要添加Audio Source组件(声源)和Audio Listener组件(一般为摄像机);
3. 2D声源监听效果与距离无关,3D声源离声源越近声音越清晰;
4. audio.Play(Stop,Pause,PlayOneShot)函数操作。
1. 关键字搜索资源;
2. 下载资源;
3. 查看、更新以前下载的资源;
4. 下载的资源路径:c/用户/AppData/Roaming/Unity/Asset Store
1. 实例继承性:修改Assets中属性,实例化的物体中属性也会相应改变;
2. 实例重载:可以单个修改实例化的物体;
3. 选择实例:select
4. 取消重载:Revert
5. 预设,空的预设和资源图标不同,本质也不同。
6. 实例化:Instance()
资源文件管理,创建资源,搜索资源。
Favorites 快速访问:
1. 拖拽文件夹;
2. 添加搜索结果。
搜索:
1. 搜索指定类型资源;
2. 搜索标签;
3. 保存搜索结果。
资源使用和管理:
添加到文件夹中时,unity自动输入资源并管理:
1.对已有资源建立链表;
2.添加新文件时,自动对比链表以发现新文件,为新文件添加唯一id号
3.处理是对文件做转换,放置于library文件夹中。
4.对文件的操作要在unity里边做,不能拿出来在windows文件夹中做,以防出现文件不符合的问题。
开始的游戏物体都是基础物体,将组件添加到基础物体上使其获得属性以成为可以使用的物体。
组件作用:为相应物体增加相应的功能效果。
组件属性:数值属性和引用属性。
组件顺序:影响影像效果。
预设,层次,场景中的物体在属性编辑器中修改、
属性:数值属性,引用属性。
数值属性:直接修改文本框;动画曲线,颜色间层使用相应编辑器。
引用属性:直接用拖放的方式操作。
Ps:
1.可以选择多个相同类型物体同时编辑共同属性,不同属性显示横线;
2.多个相同预设实例物体不可以多重编辑,但可以单个对预设重载;
3.编辑器模式:normal,debug[易于调试],lock[锁定]
场景浏览:
1.用箭头键移动摄像机,按住shift键加速移动速度;
2.层次视图中,选中物体,在场景视图中用F键,将其设为场景中心;
3.Alt+左键:旋转;Alt+中键:移动;Alt+右键:放缩。
4.飞行模式[透视]:按住右键,wsad上下作左右移动,qe上下移动,右键拖动旋转。
5.正交视图和透视视图切换
定位物体:
1.移动,旋转,缩放
2.单位吸附[snap]:ctrl+移动
3.表面吸附:shift+ctrl+移动,会在表面移动
4.顶点吸附[顶点对齐]:按住v键,用鼠标左键选择要吸附的顶点并移动
5.设置图标:属性框中修改,可设置自定义图标
灯光:颜色和基调
1.可以将灯光当成一个组件
2.改变灯光颜色来改变场景基调
3.灯光:实时灯光、灯光贴图
4.根据不同平台不同需要设置相应的渲染路径
5.灯光:点灯光、聚光灯、方向灯、区域灯光[灯光贴图]
摄像机:
1.可以实例化;
2.多个摄像机处理
3.场景中空白部分的处理
创建脚本:create edit-》create
脚本内容:start()只执行一遍,update()实时循环操作[每一帧]
1.脚本必须依附在物体上;
变量:实时测试不同变量的效果,提高重用性;
1.播放时的数值修改不会保存,需要在停止播放后再次修改;
2.对不同物体中重用脚本,变量使不同物体产生不同的效果;
公共组件:transform,rigidbody,摄像机,动画可以直接用“.”
脚本:通过getcomponent()调用别的脚本
引用物体以及其他物体的脚本:
1.定义公有变量,在属性编辑器将对应的物体或物体所在的脚本拖动赋值;
2.GameObject.Find()函数:通过物体的名称,或路径来查找场景中的物体。
3.GameObject.FindGameObjectWithTag()函数:通过物体的标签获取物体
1.Time.deltaTime:根据时间固定变化,每秒改变,而不是每帧时间
2.Time.time:当前的时间
3.Time.deltaTime :上一帧所消耗的时间
4.Time.fixedTime :固定增量时间
5.Time.fixedDeltaTime :固定增量间隔时间
6.Time.smoothDeltaTime :平滑DeltaTime
7.Yield语句:Yield语句是一种特殊类型的Return(返回)语句,它可以确保函数在下一次被执行时,不是从头开始,而是从Yield语句处开始。
Eg:yield WaitForSeconds(5.0); 后续部分延迟5s执行
Random类:
1.Random.value:0--1之间的随机数
2.Random.Range():指定的范围
1.声明定义变量
js:public var i:int=0;
C# :public int i=0;
2.使用函数
Js:Function SetInt(temp:int)
{
i=temp;
}
Function getInt():int
{
return i;
}
Var obj:GameObject ;
Obj=GameObject.Find(“Cube”);
Var script:jsTest=obj.GetComponent(“jsTest”);
Script.setint(50);
Debug.log(Script.getint());
C# :public void Setint(int temp )
{
I=temp;
}
Public int getint()
{
Return i;
}
cTest script =obj.GetComponent<jsTest>();
1.父物体和子物体间
GameObject.SendMessage:向自身的脚本中发送消息
GameObject.BroadcastMessage :向自身及子物体的脚本中发送消息
GameObject.SendMessageUpwards:向自身及父物体中发送消息
2.事件发送和接收
发送:
委托:public delegate void EventHandler(GameObject e);
事件:public event EventHandler MouseOver;
对事件定义:
void OnMouseOver () {
if (MouseOver != null)
MouseOver (this.gameObject);
}
接收:
EventDispatcher ev=GameObject.Find(“cube”).GetComponent<EventDispatcher>();
Ev.MouseOver+=ListeningFunction;//注册监听器
//监听函数
void ListeningFunction (GameObject e) {
this.transform.Rotate(20, 0, 0); // ‘e‘ is the game object that dispatched the event
// e.GetComponent<EventDispatcher>().MouseOver -= ListeningFunction; // Remove the listener
Debug.Log("mouse is over: "+e);
}
OnGUI():
1.每帧执行一次
2.定义UI即为创建UI
3.可以像普通物体那样控制UI,例如Time
4.一般用Rect限制按钮的大小
5.可以在规定的按钮上添加指定文字,图片;甚至图片+文字+提示『GUIContent』
Eg:
Function OnGUI()
{
If((Time.time %2)<1)
{
if(GUI.Button(Rect(10,10,120,110),GUIContent(“我的按钮”,“提示”)))
{
Print(“用户单击了按钮”);
}
}
}
1.标签:显示信息
GUI.Label();
2.按钮:可以单击
GUI.Button();
3.重复按钮:按住后内容持续执行
GUI.RepeatButton();
4.文本输入框:可以输入变量并引用
GUI.TextField();
5.开关控件:表达是否选中『bool』
GUI.Toggle();
6.滑块控件:
水平滑块:GUI.HorizontalSlider(Rect(),当前位置,开始位置,最远位置);
1. 工具条控件:模拟工具栏效果,每次只一个按钮激活,且一直保持到激活其他按钮为止
参数变量:
标记工具条当前激活的按钮[int];
当前按钮数目以及按钮名称[string[]];
2. 选择网格控件[效果和工具条类似,但是可以分列]:
参数变量:
标记工具条当前激活的按钮[int];
当前按钮数目以及按钮名称[string[]];
列数[int].
3. GUI.changed():若是某些控件发生了更新,可以对某些控件进行检测
1. GUILayout:可以自动调整控件大小
2. 使用组:
GUI.BeginGroup(Rect());
GUI.EndGroup();
组可以互相嵌套,产生子组:可以实现类似能量条的效果
1. 使用默认显示风格:
2. 使用自定义的GUIStyle
GUI.Button(Rect(),”名称”,”box”);
3. 使用GUISkin:多个GUIStyle的集合
GUISkin skin=myskin;//直接在前边说明,后边控件的皮肤都是这个
GUISkin skin=null;//此后的皮肤都为默认皮肤
GUILayout控件:
1. 自动布局的控件
2. 可以创建GUI包含的控件
3. 默认垂直布局
4. 若要水平布局:GUILayout.BeginHorizontal();GUILayout.EndHorizontal();
5. 滑动条要与别的控件间产生间距:GUILayout.Space(120);并指定控件的固定宽度和固定高度。
GUILayout.HorizontalSlider(sliderValue,0.0,10.0,GUILayout.Width(100));
6. 控件组/容器:GUILayout.BeginArea(); GUILayout .EndArea();
1.创建窗口:
windowRect=GUI.Window(0,windowRect,DoMyWindowFunction,”我的窗口”);
Function DoMyWindowFunction(windowID :int )//窗口函数
{//创建窗口控件
GUI.DragWindow(Rect(0,0,10000,10000));//范围内可拖动
}
2.可以使用toggle控件控制窗口的显示或关闭
创建地形:create Terrain
1.第一项 抬高降低工具。选择地形样式,点击拖动鼠标,可以抬高地形;按着shift键,可以创建凹陷效果【在突起地形可以实现,也可以抬高地形,再实现凹陷效果】。
1.第二项 绘画高度选项。可以选择笔刷,绘制的高度不能超过hight参数,否则会平整掉。
2.第三项 平滑高度选项。对尖锐部分操作,可以产生平滑效果。
1.第四项 绘制纹理。
① 导入标准地形资源
② 添加纹理,纹理同时平铺于整个地形中[基础纹理]
③ 添加其他纹理,在基础纹理上添加相应的效果。
1.第五项 添加树木
1) 添加树木
2) 点击ctrl拖动鼠标,可以删除指定树木;点击shift拖动鼠标,将删除所有拖过的树木。
2.第六项 添加植被等细小的物体
1) 添加植被
2) 点击ctrl拖动鼠标,可以删除指定细节;点击shift拖动鼠标,将删除所有拖过的细节。
3) 可以添加纹理,也可以添加实体
4) 拉近摄像机镜头才可以看到草的效果
1.第七项 地形设置
① 基础地形
② 树及细节纹理
③ 风的设置
④ 地形碰撞器
2.公路创建 easyRoads3D插件
1) 添加公路标记shift+鼠标左键
2) 插入公路标记
1.输入管理器
Edit->Project Settings->Input.
2.获取虚拟轴
Input.GetAxis ("Vertical") 上下箭头,w,s按键
汽车驾驶效果
1. var translation : float = Input.GetAxis ("Vertical") * speed;
键盘事件
2. if (Input.GetKey ("a")) {
print ("a键被按下");
}
3. if (Input.GetKeyDown ("b")) {
print ("b键被按下一次");
}
4. if (Input.GetButton ("Fire1")
Print(“按下开火按钮”);
鼠标事件
1.if(Input.GetMouseButtonDown(0))
Debug.Log("您在_"+Time.time+"时,按下了鼠标左键");
if(Input.GetMouseButtonDown(1))
Debug.Log("您在_"+Time.time+"时,按下了鼠标右键");
if(Input.GetMouseButtonDown(2))
Debug.Log("您在_"+Time.time+"时,按下了鼠标中键");
2. if(Input.GetMouseButton(0))
Debug.Log("您一直按着鼠标左键");
3. if(Input.GetMouseButtonUp(0))
Debug.Log("您在_"+Time.time+"时,抬起了鼠标左键");
if(Input.GetMouseButtonUp(1))
Debug.Log("您在_"+Time.time+"时,抬起了鼠标右键");
if(Input.GetMouseButtonUp(2))
Debug.Log("您在_"+Time.time+"时,抬起了鼠标中键");
GUI系统双击检测
function OnGUI()
{
var e : Event = Event.current;
if (e.isMouse&&(e.clickCount==2)) {
Debug.Log("用户双击了鼠标");
}
}
第一人称角色控制器:
1.CharacterController:设置角色爬坡的角度,步高[每步可以抬高的高度]
2.Mouse Look:调节视角
3.Character Motor:实现更精确功能:移动物体上运动,滑动等
4.FPSInput Controller:获取输入
unity3d 英保通公开课小结 1-38讲,布布扣,bubuko.com
原文地址:http://blog.csdn.net/ly209/article/details/36014827