最近要给公司的小伙伴做Unity入门,针对几个常用的知识进行快速入门介绍。

Unity快速入门之一 3D基础概念、Camera、Canvas RenderMode的几种方式对比_翕翕堂

Unity快速入门之二 GUI Transform 详解_翕翕堂-CSDN博客

Unity快速入门之三 脚本与事件_翕翕堂-CSDN博客

Unity快速入门之四 - Unity模型动画相关_翕翕堂-CSDN博客

资源管理待定……

……

目录

3D资源文件-模型与动画

模型与动画类型

模型导入设置

Model

Rig

Materials

Animation

组件

Mesh

Animator

Animator Controller

Animation Clip

自动化

插件


版本:Unity 2020.3.17

本篇主题:了解Unity模型动画相关内容

快速入门,所以只能涉及到一些主要部分,并不能面面俱到,以比较能快速上手的方式理解和简单使用unity的模型动画功能,以及插件。以FBX与Generic类型的骨骼蒙皮动画为主要叙述,其他捎带。

官方链接:模型 - Unity 手册

3D资源文件-模型与动画

基本概念

首先,我们得知道,3d游戏中,我们说到一个模型动画的时候,包含两个部分,一个是模型,一个是动画,都来自于.fbx格式文件,或其他支持的格式文件:模型文件格式 - Unity 手册。本篇是以.fbx格式文件为叙述。

模型基本组成是网格:网格 - Unity 手册。网格是指的由顶点组成三角片,再由三角片组成整个可见外观的数据集合。而一个模型可以包含多个这样的集合。比如人,如果需要,我们可以把身体、四肢、头都拆成单独的网格,并形成一个统一的.fbx文件。当然,如无必要,尽量不要拆分这么多网格。

引用参考,可以了解相关的更多概念,入门可以直接跳过,全部可能劝退:

  • 维基百科:https://en.wikipedia.org/wiki/FBX
  • 官网FBX的SDK,有介绍明码数据结构:Help
  • 自定义FBX二级制读取器:FBX binary file format specification — Blender Developers Blog
  • 有个不错的解析流程:深入理解加载FBX模型文件_海洋个人博客-CSDN博客_fbx文件
  • 有个不错的原理介绍:骨骼动画程序原理介绍_阿赵的博客-CSDN博客_骨骼动画

资源常见的划分与命名方式

通常,我们会将模型数据文件单独导成一个.fbx,而将其他的动画文件也导成独立的.fbx。分别按照model_name.fbx和model_name@animation_name.fbx的形式进行命名,则动画.fbx文件会自动生成一个内置的 animation_name.anim 动画剪辑组件,可供后续的 Animator组件使用。这些概念后面还会提到。


模型与动画类型

Unity模型类型

 基础概念与使用场景

从Unity的角度来讲,模型动画类型有三种分别是 Legacy、Generic、Humanoid。Legacy基本是在被舍弃了,用的多的是Generic和Humanoid。而从程序的角度来讲模型动画是:顶点动画、蒙皮骨骼动画等等分类。

Unity Generic与Humanoid的若干基础点除盲:

  • Humanoid类型使用范围与Generic类型使用范围是等价的,但是内部实现方式不一样,即是说使用Generic能达成的效果,Humanoid基本都能达成。但是Unity对Humanoid做了更多上层应用的封装.
  • Generic满足于一般的动画需求,而Humanoid类型结合Unity的Avartar可以使用Unity内置的IK、AvartarMask、重定向等等功能(提出这个是因为不少同事都是基于商业引擎开始学习的,误将Avartar这类定义在概念层面与3D模型动画绑定在了一起,这里除下盲)。
  • Humanoid的性能消耗>Generic。一般的模型动画播放,使用Generic也可以满足要求,即使是人形态的模型动画。

常见的几种程序和美术意义上的动画类型:

  • 骨骼蒙皮动画(SkinnedMesh):类比于:如同人体运动骨骼带动皮肤。概述一下就是,由世界矩阵驱动根骨骼,根骨骼矩阵驱动子骨骼,逐层递进驱动全身骨骼,再通过蒙皮信息决定每个骨骼对物体模型网格上每个顶点的权重影响,最终决定物体上每个顶点的实际运算位置。这一篇blog写的比较清楚,想继续了解,可以找专门的3D知识学习: 骨骼动画程序原理介绍_阿赵的博客-CSDN博客_骨骼动画
  • 混合形状动画(BlendShape):这个和骨骼动画不同,它是由相同网格顶多,预定义出不同的网格形状,进行插值运算,而不是通过骨骼层层递进去运算,参考:Unity项目捏脸解决方案BlendShape_天富儿的博客-CSDN博客_unity捏脸
  • 顶点动画:在Unity中很少直接接触到顶点动画,顶点动画与混合动画类似,不过它是记录每一帧的所有顶点数据,逐帧播放。这种对于大顶点数的模型,会占据相当大的内存,不过没啥运算压力。而在一些动画解决方案中,会有bake烘焙动画的功能,其实就是把骨骼动画的每帧计算结果转化成顶点动画,记录下来.由于用得少,这里只提一下.

模型导入设置

官方链接:

  • ​​​​​​Model Import Settings 窗口 - Unity 手册

    • Model 选项卡 - Unity 手册:主要设置导入的模型参数细节
    • Rig 选项卡 - Unity 手册:主要设置动画类型、Avartar等
    • Animation 选项卡 - Unity 手册:主要设置动画参数细节
    • Materials 选项卡 - Unity 手册:主要设置材质参数等

模型导入每个参数的概念,在官方文档中其实都有列出来,但是可能对于部分参数,没有了解过的同学可能不太清楚用处,我就可能产生疑问的地方稍加说明。

导入设置需要注意两点,一个是 Import类型参数,一个是非 Import类型参数,顾名思义,import参数是由外部导入的,而非 import基本都是Unity自身相关的。

Model

Model选项卡

Scene:

        这个标签下的参数,大部分跟3D资源导入Unity是有相互关系的。

Scene
ScaleFactor 1
Convert units True(1cm to 0.01m)

跟导出FBX软件的设置有关,这里有一篇对比描述:

Unity与3ds Max的单位关系(使用FBX文件)_a1780531的博客-CSDN博客_unity和3dmax单位比例

Scene
Bake Axis Conversion False

跟导出FBX软件的设置有关,轴转化烘焙,物件或模型的轴线信息不改变。由于一般我们在游戏中的角色或其他物体控制,是由游戏逻辑决定的,所以不由动画控制。

Scene
Import Blend Shapes False

跟导出FBX软件的设置有关,是否使用混合形状。动画的实现方式有多种,骨骼动画是一种,混合动画也是一种,前面提到了。

Scene
Import Visibility False
Import Camera False
Import Light False

跟导出FBX软件的设置有关,一般我们会选择在Unity内实现.

Scene
Preserve Hierarchy True,为预制创建根节点,用于核对模型和动画位置
Scene
Sort Hierachy By Name True,Unity内置优化

Mesh:

        这个标签下的参数,基本跟Unity自身优化相关。

Mesh
Mesh Compression off,根据具体情况而定,性能与质量成反比
Mesh
Read/Write Enable False,是否需要读写顶点等数据,详见文档吧,根据具体情况而定
Mesh
Optimize Mesh Everything,Unity内置优化,除非表现出了问题才调整
Mesh
Generate Colliders False

这个表明,是否在FBX模型导入时就决定使用碰撞,但是游戏一般会根据情况使用不同的特定碰撞体,而非原身的:

【unity】给物体加上collider碰撞器,以及触发的OnCollisionEnter等碰撞方法_冰冷的希望的博客-CSDN博客_unity 添加碰撞器

Geometry:

这个标签下的参数,基本大部分需要美术和渲染或TA程序参与讨论决定。

Geometry
Keep Quad False

使用曲面细分函数时才需要开启。

Geometry
Weld Vertices True
Index Format Auto
Legacy Blend Shape False

Unity默认优化即可,这篇文章的例子不使用BlendShape。

Geometry
Normals Import
Normals Mode Area and Angle Weighted

法线一般会由项目的渲染程序或者TA负责,一般也会在自己的项目中制定自己标准的材质,所以一般都是Import。Normals Mode默认即可。

Geometry
Smoothness Source Prefer Smoothing Groups
Smoothing Angle 60

跟导出FBX软件的设置有关,平滑组参数,默认即可,尽量使用模型文件中平滑组。Smoothing Angle 仅当 Normals = Calculate 时有效。

Geometry
Tangents Calculate Mikktspace
Swap UVs False
Generate Lightmap False

同样,切线、UI、光照贴图,也是需要跟渲染或TA讨论后才能确定。

Rig

Rig​​
Rig
Animation Type Generic
Avatar Defintion No Avatar
Skin Weights Standard(4 Bones)

这里我们来讲讲,Avatar Defintion的一个比较大的用处是用于 RootMotion,这个后面我们下面再细讲,跟预制上的组件相关。做根运动,是必须要这个东西的,但是游戏中很多时候并不需要根运动。

而Skin Weights,默认是4根,这个骨骼蒙皮动画中,蒙皮受骨骼影响的数量,多了也会影响性能,这里必须要跟做动作的美术约定清楚,以免后面播放出现问题或重新绑定蒙皮。

Materials

由于Animation内容比较多,换个顺序,先说下Material。

Material

因为我们大多数材质都是项目项目定制,除非是做Demo掩饰,所以一般都是None,在项目预制中对模型材质进行处理。

Animation

好了,另一个大头来了,Animation动画,首先,开始我们讲了,我们一般使模型和模型的动画分别单独导成独立的.fbx文件。当我们 Import Animation时可以看出明显的差别,看下面两个图:

模型FBX文件

动画FBX文件

所以在独立的FBX模型文件中,如果Import Animation是看不到其他任何信息的,很好区分,需要注意。所以模型一般不勾选。

而在本篇中,我们一个动画.fbx文件,一般是一个完整的动作,与模型分别导出。那么上面这个绿色三角标志的idle,就是一个包含60帧的等待动画剪辑。

特定资源属性:

特定资源属性

Import Constrains

False
Import Animation

-

跟导出FBX软件的设置有关,不做相关约束,这个Unity特性其实感觉有点鸡肋了,实际操作意义不大,约束 - Unity 手册

特定资源属性

Bake Animations

False

跟导出FBX软件的设置有关,将美术软件中IK转为FK,好处肯定就是降低运算量了,坏处也明显,内存增加,而且不一定满足实际的逻辑表现要求。一般不需要,如果要做IK,会选择在运行时使用IK库。

特定资源属性

Resample Curves

True

曲线采样,一般都会使用,将欧拉旋转转化为四元数,除非你的表现出现了问题,才会禁止:欧拉曲线重新采样 - Unity 手册

特定资源属性

Anim.Compression

-
Rotation Error -
Position Error -
Scale Error -

这是针对动画剪辑的压缩,也是性能与表现的取舍问题,需要和美术或策划商量,而下面三个Error,是指的在采用压缩的情况下对平移旋转缩放关键帧的取舍算法问题,一般会需要美术动作同学根据实际情况去调整。

特定资源属性

Animated Custom Properties

False,是否需要使用FBX导出的自定义属性,根据具体情况而定

剪辑选择列表:

剪辑选择列表

由于是一个.fbx对应一个Animation Clip,一个Clip对应一个.anim文件,所以此处一个动作基本是从0帧开始到满帧结束。当然,这里的方案有很多,比如有多个动画,放在了同一个.fbx文件中,这里就可以手动来切分创建多个Clip。

再重复提到一点,因为Unity自己做了导入处理,当导入的动画文件名称命名为 model_name@animation_name.fbx时,会自动创建一个 animation_name.anim文件在.fbx的展开内容中可以看到,并用于Animator组件中。

特定剪辑属性:

时间轴(帧轴)

反应的是当前这个.fbx文件内,动画的总帧数。其帧数 >= Clip帧数。

循环控制

循环与姿势控制:

动作循环控制

Loop Time

动作是否需要循环播放,根据具体情况而定
Loop Pose 动作是否需要自动首尾衔接过度,一般由美术确保
Cycel Offse 0,特殊情况特殊处理
Additive Reference Pos False,调参时候的辅助功能,不涉及实际功能

展开部分:

展开部分

Curves

动画曲线,根据具体情况,曲线可以跟状态机的参数值对应
Events 用于特殊逻辑时间出发,比如技能编辑器里面,某一帧发出特效技能
Mask 用于做多动画的动作融合,比如边跑边投长矛
Motion 作为根运动根节点,也是动画的驱动源

组件

Mesh

在前面提到网格概念的时候,说到了一个模型是可以由多个网格组成的。而Unity中与网格一一对应的组件就是 MeshFilter+MeshRenderer(不带蒙皮)或 SkinnedMeshRenderer(带蒙皮):

  • 网格过滤器 (Mesh Filter) - Unity 手册
  • 网格渲染器 (Mesh Renderer) - Unity 手册
  • 带蒙皮的网格渲染器 (Skinned Mesh Renderer) - Unity 手册

而一旦我们把模型文件转成了预制,就可以在Inspector面板上看到,对应的骨骼节点和对应网格的Renderer:

骨骼节点与MeshRenderer

Animator

动画系统组件,用于在游戏中播放动画,动画 - Unity 手册。这里参数细节就不解释了,文档很清楚,它的作用就是对动画控制的一个集合。一般我们在模型预制之上会加入一个Animator用来控制动画的播放。

Animator

Animator Controller

它是动画控制器,也是状态机,用于游戏中动画表现逻辑,具体用法,参见文档了:Animator Controllers - Unity 手册

btw:有的时候,并不会完全使用AnimatorContrroler提供的状态机管理功能,因为状态机的框架可以是独立的,只需要动画控制器能够播放对应的动画就足够了。所以AnimatorController具体怎么使用,依赖项目框架,没有定准,然后我们可以把它设置到Animator组件之下。至于下面的参数,暂时先保持不动吧,可以查看文档,也比较清楚。

Animation Clip

动画剪辑,对应的是动画.fbx文件。前面模型导入过程中也提到过了,不记得了看到 Animation部分。官方文档:动画剪辑 - Unity 手册。

我们可以在上面说到的AnimatorController中,创建一个状态,命名为“Idle”,并将Idle的动画剪辑设置进去:

动画剪辑设置

然后我们创建一个空脚本挂到预制上:

创建动画播放的脚本

加上一行代码,就可以播放了:

播放动画

中间省略了很多扩展的操作,比如blendtree,transition等等,但是对于基本的从导入到组件构成和基本播放都涵盖了。对于了解Unity的模型动画是个什么,和怎么用有个基本概念。


Humanoid 有几个概念容易让人模糊,这边提一下。

Humanoid Bake|RootMotion|Script

基本导入配置调整为:

Rig

则可以在Animation看到:

Animation

这里会多出三个 Root Transform XXX 选项。这里最主要的选项在于 Bake Into Pose 选项,一旦勾选,就意味着,假如说在动画软件中,做动画时就自带了 XYZ位置变化以及旋转变化时,那么在游戏中播动画时,就会表现出位移,但是播完动画后,就会被拉回原点。否则,游戏中播放动画,不会有位移表现,只是原地动作。

但是一旦我们勾选了,预制体中,Animator组件的 Apply Root Motion 选项,则没有标记Bake Into Pose 的选项就会目标对象根据动画的变化发生实际位移变化。

而一旦我们在其挂在脚本中实现了 OnAnimatorMove等函数,又会取消 Apply Root Motion标记的影响。

如果既想要Root Motion生效,按照动画产生实时实际位移,又想要实现 OnAnimatorMove获得实时位置信息,则可以手动调用 Animator.ApplyBuiltinRootMotion()接口进行实现。

这样说太抽象,写个伪代码:


// AnimationClip.BakeInXXX = 勾选 = 将动画中的位移信息保留在动画中 | 不勾选 = 运用到 RootMition 中
// Animator.ApplyRootMotion = 运用到 RootMition 中的 Transform 信息,会影响实际的 GameObject 的 Transform
// AnimatorScript = 挂载了mono脚本,并且实现了 OnAnimatorMove 的函数,会取消 RootMition 的影响,即 AnimatorScript == !Animator.ApplyRootMotionClass ModelAnimator
{enum PlayType{NoneRotation,       // 原地动画,没有旋转NonePositionY,      // 原地动画,Y轴位移NonePositionXZ,     // 原地动画,XZ轴位移ClipRotation,       // 动画剪辑带旋转,但是GameObject没有实际旋转ClipPositionY,      // 动画剪辑带Y轴位移,但是GameObject没有实际Y轴位移ClipPositionXZ,     // 动画剪辑带XZ轴位移,,但是GameObject没有实际XZ轴位移ObjRotation,        // 由GameObject的Transform.ratation被动画曲线影响,动画剪辑本身不产生旋转ObjPositionY,       // 由GameObject的Transform.position.Y被动画曲线影响,动画剪辑本身不产生Y轴变化ObjPositionXZ,      // 由GameObject的Transform.position.XZ被动画曲线影响,动画剪辑本身不产生XZ轴变化}PlayType _playType;void Update(){SetPlayType(Animator.ApplyRootMotion && !AnimatorScript);DoPlayFrame();if (AnimatorScript) OnAnimatorMove();}void SetPlayType(bool applyObj){_playType |= AnimationClip.BakeInRotation ? PlayType.ClipRotation   : (applyObj ? PlayType.ObjRotation   : PlayType.NoneRotation  );_playType |= AnimationClip.BakeInPosY     ? PlayType.ClipPositionY  : (applyObj ? PlayType.ObjPositionY  : PlayType.NonePositionY );_playType |= AnimationClip.BakeInPosXZ    ? PlayType.ClipPositionXZ : (applyObj ? PlayType.ObjPositionXZ : PlayType.NonePositionXZ);}void DoPlayFrame(){if (!(_playType & PlayType.NoneRotation))   rotation    = CalculateAnimationRotation();if (!(_playType & PlayType.NonePositionY))  position.Y  = CalculateAnimationPositionY();if (!(_playType & PlayType.NonePositionXZ)) position.XZ = CalculateAnimationPositionXZ();if (_playType & PlayType.ObjRotation)       gameObject.transform.rotation   = rotation;if (_playType & PlayType.ObjPositionY)      gameObject.transform.position.Y = position.Y;if (_playType & PlayType.ObjPositionXZ)     gameObject.transform.position.XZ= position.XZ;}void ApplyBuiltinRootMotion(){SetPlayType(true)DoPlayFrame()}
}// 业务层
Class AnimatorScript:MonoBehaviour
{void OnAnimatorMove(){Debug.Log(gameObject.transform);    // 原数据gameObject.GetComponet<Animator>().ApplyBuiltinRootMotion();Debug.Log(gameObject.transform);    // 位移后数据}
}

下面升级一下,当我们导入的时候,一般不会让每个人直接去调整导入资源的参数,也不会让每个人去从头到尾走一遍预制和组件的设置流程,所以,就有了自动化。自动化的流程有很多,根据项目具体情况而定。但是一般都会有:自动化资源导入参数设置、自动化预制创建、自动化动画系统(Animator)创建,自动化动画控制器(AnimatorController)创建与状态机设置、自动化动画剪辑创建(AnimationClip),以及导入过程中的其他需要的自动化流程处理。

自动化

资源文件

当导入一个模型及其动画,到其自动化可用的最小集合,一般包括:

  • model_name.fbx(模型文件)
  • model_name@animation_name.fbx(模型的动画文件,动画名最好按前面提到的规则)
  • model_name.prefab(模型的预制文件)
  • model_name.controller(动画控制器文件)
  • animation_name.anim(动画剪辑文件,这个文件,在导入中是内置的,但是一般我们会独立Copy出来,方便以后修改)

如果想要完整,当然还会有其他的,比如材质、贴图文件,如果使用Humanoid类型,就还会有avatar相关的资源需要规整,所以先要规划好目录,具体怎么规划,那就是项目具体情况而定了。

自动化导入

使用 AssetPostprocessor 类,继承这个类,并使用 OnPreprocessModel 接口进行处理模型与动画文件导入,用 OnPostprocessAllAssets 接口处理预制、动画等内容。当然还有其他接口,不过这里是一个方案罢了,下面列下可能会用到的参考,代码就不放了:

  • 资源工作流程 - Unity 手册
  • 资源审核 - Unity 手册
  • 刷新资源数据库 - Unity 手册
  • AssetPostprocessor-OnPostprocessAllAssets(string[],string[],string[],string[]) - Unity 脚本 API
  • EditorUtility-CopySerialized - Unity 脚本 API
  • PrefabUtility-LoadPrefabContents - Unity 脚本 API
  • Unity之如何从fbx提取Animation clip文件 - 孤独の巡礼 - 博客园
  • Unity3D开发之遍历检查AnimatorController里面所有部件_lihandsome的专栏-CSDN博客
  • 预制创建可能遇到的坑

再扩展一下,由于模型动画,根据项目的不同,经常会需要一些独特的表现,这些表现,并不是依靠模型动画本身制作出来的,还是程序在运行时,根据模拟物理计算出来的表现,以让表现更加真实或独特。比如 反向动力学、动态骨骼、布娃娃这些,提一下,让大家知道,还有些什么。

插件

反向动力学

再扩展一下,IK,反向动力学,也就是说,动画是在导入的动画基础之上(正向动力学),在游戏中通过与场景元素的交互,实时调整动画状态。

如果我们要使用IK,Unity的Humanoid类型,是内置了IK API的,但是实现完全依赖于自身,所以除非自己的项目需要攻克这一部分,大概率是使用其他的IK插件了,这里推荐一下FinalIK,这个插件比较全,基本上常用的行走、看向这些IK都是可以一键搞定的。也支持Generic和Humanoid类型。

  • 官方IK:反向动力学 - Unity 手册
  • FinalIK:Final IK | Animation Tools | Unity Asset Store

动态骨骼/布料

Dynamic Bone,Obj Cloth 也就是比如

Unity快速入门之四 - Unity模型动画相关相关推荐

  1. Unity快速入门之二 GUI Transform 详解

    Unity快速入门之一 3D基础概念.Camera.Canvas RenderMode的几种方式对比_翕翕堂 Unity快速入门之二 GUI Transform 详解_翕翕堂 Unity快速入门之三 ...

  2. Unity快速入门之三 脚本与事件

    Unity快速入门之一 3D基础概念.Camera.Canvas RenderMode的几种方式对比_翕翕堂 Unity快速入门之二 GUI Transform 详解_翕翕堂 Unity快速入门之三 ...

  3. Unity快速入门之一 3D基础概念、Camera、Canvas RenderMode的几种方式对比

    最近要给公司的小伙伴做Unity入门,针对几个常用的知识进行快速入门介绍. Unity快速入门之一 3D基础概念.Camera.Canvas RenderMode的几种方式对比_翕翕堂 Unity快速 ...

  4. 视频教程-Unity快速入门系列课程(第1部)-Unity3D

    Unity快速入门系列课程(第1部) 二十多年的软件开发与教学经验IT技术布道者,资深软件工程师.具备深厚编程语言经验,在国内上市企业做项目经理.研发经理,熟悉企业大型软件运作管理过程.软件架构设计理 ...

  5. 视频教程-Unity快速入门系列课程(第2部)-Unity3D

    Unity快速入门系列课程(第2部) 二十多年的软件开发与教学经验IT技术布道者,资深软件工程师.具备深厚编程语言经验,在国内上市企业做项目经理.研发经理,熟悉企业大型软件运作管理过程.软件架构设计理 ...

  6. Unity Shader 卡通渲染 实时模型动画描边的研究

    前言 卡通渲染也叫非真实感渲染(英文简写:NPR),"描边"在图形学和数字图像里都叫边缘检测.因此你可以在很多文献网站上面找到很多这类文献,但最后我发现基于图形学使用的方式基本都是 ...

  7. Netty系列(2)快速入门Netty线程模型、Netty入门程序、Netty任务队列

    文章目录 1 Netty线程模型 1.1 传统阻塞 I/O 服务模型 1.2 Reactor线程模型 1.2.1 单 Reactor 单线程模型 1.2.2 单Reactor多线程 1.2.3 主从 ...

  8. 【自动驾驶模拟器AirSim快速入门 | 03】模型训练

    这是机器未来的第20篇文章 写在前面: 博客简介:专注AIoT领域,追逐未来时代的脉搏,记录路途中的技术成长! 专栏简介:掌握基本的自动驾驶概念.模型训练.推理仿真. 面向人群:零基础编程爱好者 专栏 ...

  9. Unity 游戏入门 九、 精灵动画 Sprite Animation

    1.Animator 为了在游戏对象上有动画,需要添加一个组件Animator. 在工程窗口中,双击Robot  预制体. 如图所示,添加Animator组件. 2.Creating a New Co ...

最新文章

  1. cdev_alloc和cdev_init 的使用
  2. Jetson Nano 改成国内源(中科大源)
  3. Android进阶你必须要了解的知识:ThreadLocal
  4. pycharm中无法import已经安装的ros中的库
  5. 记一次Hbase数据迁移和遇到的问题
  6. 安装Bootstrap3源码版本
  7. WIN7通过mount挂载nfs配置root权限,解决不可写的问题
  8. 文学类容易发表的期刊或者学报有哪些?
  9. 仿QQ登录界面UI设计
  10. 《加密与解密》笔记五(二)
  11. jQuery DOM操作
  12. 【观察】帆软:扎根于BI,收获于未来
  13. 云直播SDK核心功能对比|腾讯云、阿里云、声网、即构等SDK厂商对比
  14. PHP计算中文文字个数
  15. sudo unable to resolve host test : Name or service not known
  16. SSH登录异常(someone is doing something nasty)
  17. android cs,《CS反恐精英》Android版 经典游戏再现
  18. 以下关于python函数说法错误的是def_以下关于Python函数的描述中,错误的是()
  19. GAMS系列分享14——综合能源系统——CHP机组运行区域
  20. 全国每年计算机专业毕业生有多少,计算机专业国内就业分析

热门文章

  1. Ansible动态Inventory格式
  2. 人生经验:热闹还是要看?
  3. 苹果IOS14版本自建服务器无法下载解决方法
  4. dellr710服务器添加硬盘步骤,DELL R710服务器在线扩硬盘
  5. iOS 常用快捷键 摆脱菜鸟!!
  6. 与君初相识之Linux与Java SE
  7. oracle remap语句格式,impdp 中的remap方式
  8. viterbi 中文分词-超简单版
  9. Blend for Visual Studio 概述
  10. 分享一个用了很久的免费国外空间,适合用于测试