【Unity3D】基础知识学习笔记

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委托特性来实现。

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

using UnityEngine;
using System.Collections;

public class TestDelegate : MonoBehaviour
{

    //定义一个委托(格式是不是很类很像),用来指向我们某个函数。(c++里面的指针函数)
    //param参数是名字
    private delegate void DebugString(string param);

    /// 
    /// 输出中文名字
    /// 
    public void DebugNameOfChina(string str)
    {
        Debug.Log("中文名字:" + str);
    }

    /// 
    /// 输出英文名字
    /// 
    public void DebugNameOfEnglish(string str)
    {
        Debug.Log("English Name:" + str);
    }

    //定义一个委托的变量事件
    private DebugString handlerDebugString;


    void OnGUI()
    {
        if (GUILayout.Button("输出中文名字"))
        {
            //我想输出中文名字的话就给handlerDebugString  赋值成输出中文名字的这个函数DebugNameOfChina
            handlerDebugString = DebugNameOfChina;
            handlerDebugString("丁小未");
        }
        else if (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学习。


你可能感兴趣的:(虚拟现实技术)