【Unity3D】基础知识学习笔记

1、基础知识:

标题栏

菜单栏

工具栏:变换工具、gizmos切换、播放控件、层列表、布局列表

功能窗口

2、资源及资源类型:在project里面能够create的资源。project面板可以对资源进行组织管理,创建资源,搜索资源。

3、模型和角色动画:

角色动画创建过程时:创建角色模型、骨骼设置、蒙皮、烘焙动画。

maya、3dmax创建的模型、动画,用插件输出(fbx、obj)或者软件自己的格式(max、blend),unity自身转换。

maya、3dmax创建的模型、动画,需要把IK/FK动画烘焙为关键帧动画,然后导入到unity中,才能识别。关键帧动画能够节省很多计算资源,因为IK/FK运动学动画是每一帧都会涉及到运动学计算的。

maya、3dmax创建的模型、动画,可以全部导入到unity中,然后分割;或者按照一定的命名规则,先分割再导入到untiy中。

4、材质和着色器:

材质和着色器都是属于资源类型,在project面板中create,或者外部导入,纹理即图片,不能使用unity创建,但是可以通过ps等图形处理软件创建编辑之后,导入到unity中使用。

Mesh Renderer组件:包含材质、着色器、纹理(贴图)的选项和参数设置

可以这样理解:纹理+着色器=材质

2D纹理:一张2D贴图

movie纹理:视频(mov/mpg/mpeg/mp4/avi/asf)通过quick time导入之后,被unity自动转换为ogg theroa格式。即动画纹理,之后可以像普通纹理一样使用。

5、声音文件:

声音资源存放于project面板中,可以通过component中的audio listener和audio source组件进行使用。

6、prefab预设:

prefab预设:就是把设计好的游戏物体存为一个备份,当需要生成多个实例化物体时可以直接拷贝使用,避免了重复造轮子的问题。

重用性和运行实例化:创建预设的instance

实例的继承性:修改预设属性,所有的实例会跟着改变。

实例的重载:单独修改实例,则只会对此实例生效。

7、游戏物体使用组件来丰富功能,组件使用project里面的资源来设置属性。

8、scene视图操作;

透视模式persp、正交模式iso

snap移动,按住ctrl键拖动物体,以一定的增量来移动。

表面移动,ctrl+shift拖动物体,一个物体在另一个物体表面移动。

顶点吸附:v键激活移动物体顶点,选择好之后拖动,可在另一个物体的顶点上移动。

9、灯光和摄像机:

灯光类型:spot(聚光灯)、directional(方向光)、point(点灯光)、area(区域光)

10、unity脚本的使用:

5*Time.deltaTime:每秒5度或者5米,和unity的帧速率无关。deltaTime记录了上一帧执行完成的时间。 1/FPS 这里的FPS是实时变化的。

11、C#脚本:test01.cs test02.cs

test01.cs引用test02.cs变量

需要把变量定义为public static类型,然后可以直接引用 test02.var;test02.cs

可以在test02中定义方法(读写变量的实现),然后在test01中调用test02的方法即可实现

在test02中定义静态方法public static test02 instance;并在Awake中赋值为this,在test01中调用此方法test02.instance.var即可

test01和test02属于同一个GameObject:直接调用getcomponent获取脚本组件

test01和test02不属于同一个GameObject:可以通过定义test02所属GameObject的tag,然后在test01中FindGameObjectWithTag或者直接在test01中Find而不定义tag

12、GameObject的获取:

通过脚本里面定义public的GameObject的变量,然后在Inspector面板中拖动另一个GameObject获取

通过在脚本里面Find函数实现(直接Find或者给GameObject定义tag,然后通过Findtag来获取)

13、脚本使用:

脚本里面的时间控制:

time类

yield WaitForSecond(5);//等待5s钟之后再次返回执行。

脚本里面的随机数产生:random类

脚本物体间通信方式:

GameObject.SendMessage:向自身的脚本中发送消息。参数为函数名和函数的参数

GameObject.BroadcastMessage:向自身及子物体的脚本中发送消息

GameObject.SendMessageUpwards:向自身及父物体的脚本中发送消息

使用delegate委托特性来实现。

用一段代码来理解事件/委托机制的用法:下面的代码是点击中文,显示中文名字,点击英文,显示英文名字:

[cpp]view plaincopy

usingUnityEngine;

usingSystem.Collections;

publicclassTestDelegate : MonoBehaviour

{

//定义一个委托(格式是不是很类很像),用来指向我们某个函数。(c++里面的指针函数)

//param参数是名字

privatedelegatevoidDebugString(string param);

/// 

/// 输出中文名字

/// 

publicvoidDebugNameOfChina(string str)

{

Debug.Log("中文名字:"+ str);

}

/// 

/// 输出英文名字

/// 

publicvoidDebugNameOfEnglish(string str)

{

Debug.Log("English Name:"+ str);

}

//定义一个委托的变量事件

privateDebugString handlerDebugString;

voidOnGUI()

{

if(GUILayout.Button("输出中文名字"))

{

//我想输出中文名字的话就给handlerDebugString  赋值成输出中文名字的这个函数DebugNameOfChina

handlerDebugString = DebugNameOfChina;

handlerDebugString("丁小未");

}

elseif(GUILayout.Button("Debug English Name"))

{

//我想输出英文名字的话就给handlerDebugString  赋值成输出中文名字的这个函数DebugNameOfEnglish

handlerDebugString = DebugNameOfEnglish;

handlerDebugString("DingXiaowei");

}

}

}

14、物理引擎:碰撞器与触发器、射线碰撞检测

collider组件、rigidbody组件。

constant force组件:世界坐标系方向力,局部坐标系方向力,世界坐标系扭矩力,局部坐标系扭矩力

在脚本里面使用rigidbody类,和力有关的,需要放到FixedUpdate里面更新。

能检测碰撞发生的方式有两种,一种是利用碰撞器,另一种则是利用触发器。

碰撞器:一群组件,它包含了很多种类,比如:Box Collider(盒碰撞体),Mesh Collider(网格碰撞体)等,这些碰撞器应用的场合不同,但都必须加到GameObjecet身上。

触发器,只需要在检视面板中的碰撞器组件中勾选IsTrigger属性选择框。

碰撞器是触发器的载体,而触发器只是碰撞器身上的一个属性。

当Is Trigger=false时,碰撞器根据物理引擎引发碰撞,产生碰撞的效果,可以调用OnCollisionEnter/Stay/Exit函数;

当Is Trigger=true时,碰撞器被物理引擎所忽略,没有碰撞效果,可以调用OnTriggerEnter/Stay/Exit函数。

两个物体碰撞,可以不要rigidbody存在,但必须要有collider组件存在。只要勾选了is Trigger,就会进入OnTriggerEnter方法。

如果想实现两个刚体物理的实际碰撞效果时候用OnCollisionEnter,Unity引擎会自动处理刚体碰撞的效果。如果想在两个物体碰撞后自己处理碰撞事件用OnTriggerEnter。

发送一条射线:physics.Raycast(),出参为RayCastHit类型变量 hit.collider.gameObject

15、物理引擎:joint关节组件

joint关节组件依赖于rigidbody刚体组件

hinge joint铰链关节:开关门、两个物体弹簧等

fixed joint固定关节:两个物体的脱离效果

spring joint弹簧关节:

character joint角色关节:实际是一个球形关节,常用在人模型关节处,所以称为角色关节

configurable joint配置关节:极高的可配置性,可以配置出以上所有关节的效果

16、mecanim动画系统:

MAYA或3DMAX(角色建模、骨骼设置、蒙皮、动画、烘焙)->导出到unity中->动画分割(如果是一个完整的动画)->

mecanim系统专门为人类模型资源提供了一套avatar系统。

avatar的创建过程:分析导入角色资源骨骼结构,与mecanim提供的标准骨骼结构对比,最后转换或标志位mecanim可以识别的骨骼结构。通过avatar的创建,可以实现角色之间的retargeting(角色资源的重用)

在角色资源的输入配置中,Rig的Animation Type选择Humanoid,选择Apply之后自动生成Avatar,之后可以通过configure avatar手动调整。

可以调整关节的mapping映射、调整muscles的运动范围

body mask身体遮罩:在输入配置的animation中,有mask选项,目的是让身体的某部分运动失效。这样减少动画曲线的数量,减少计算量,优化CPU和内存的性能。

retargeting:只要角色创建了avatar,不同角色之间的animator controller就可以重用,这就是retargeting的原理。在animator组件中进行设置。

动画片段设置:有些动画效果只播放一遍,有些需要循环播放。在角色输入的animations中设置。

root motion:角色的移动重心,勾选上就运用到scene的实例中,角色就可以运动,否则角色没有重心指向,不能运动。通过root motion就可以使用角色动画驱动角色运动。

root motion的脚本控制:如果不勾选,又想让角色运动,则需要用脚本控制,一是在角色片段中创建curve曲线,二是在animator状态机中添加变量,三是创建脚本,重写方法OnAnimatorMove。

blendtree:几个类似的动画片段复合为一个动画片段,在动画状态机里面创建。比如(左走,直走,右走动画片段可以融合为一个blendtree)

嵌套blendtree可以实现走到跑的切换效果。

blendtree的参数设置:1D 2D效果

mecanim动画层的使用:使用层、身体遮罩、权重等设置,可以实现两个层的动画同时播放的效果,比如一边跑一边射击。

mecanim反向运动学运用:可以让角色去精确的抓取物体。脚本里面需要重写OnAnimatorIK,在动画层中,打开IK Pass选项。

mecanim目标匹配:通过animator.MatchTarget函数,可以实现角色攀爬的效果,定位到某个具体目标上。

一般性角色动画:非人类角色动画,也可以使用mecanim动画系统,唯一区别是avatar不可配置。

脚本实现角色跟随效果。

脚本实现群组动画效果。

17、输入与控制:

输入接口:input类

float h = Input.GetAxis("Horizontal");

float v = Input.GetAxis("Vertical");

判断输入值,然后控制player的移动

getaxis、getkey、getbutton、getjoystick等函数。

注意:unity GUI事件在一帧中可能触发多次。OnGUI函数可能在一帧中执行多次。

18、角色控制器:CharacterController组件

角色控制常规方式:rigidbody、角色控制器(最常用)

角色控制器内置一个capsule collider,所以可以进行碰撞检测。

角色控制器+第一人陈视角可以实现漫游效果。

19、粒子系统:particle system

创建:直接创建一个粒子系统GameObject或者先创建一个Empty的对象,再添加粒子系统组件。

粒子系统功能十分强大,可以创建出各种需要的特效。

20、树:

Tree component

可以使用程序自动生成,但是如果手动调节过后,一些参数将不再可调。

树的基本属性、树干的基本属性、树叶的基本属性、树与地形的配合使用。

21、地形引擎:Terrian

地形工具栏十分重要。下面的操作都是基于工具栏来选择和设置。

地形创建与绘制:注意海平面flatten的设置才能产生凹地效果。

地形纹理和材质的选择和使用。

地形中添加树木、植被。

地形工具栏中最后一项是地形设置。包括基本的地形分辨率显示,树木植被显示,风等效果的设置。

可以使用插件EasyRoads3D来创建公路效果。

22、GUI图形用户界面:

UGUI和NGUI学习。

你可能感兴趣的:(【Unity3D】基础知识学习笔记)