美文网首页
【Unity3D】基础知识学习笔记

【Unity3D】基础知识学习笔记

作者: 夕望有你 | 来源:发表于2016-12-29 16:11 被阅读167次

    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】基础知识学习笔记

          本文链接:https://www.haomeiwen.com/subject/lrkpvttx.html