unity5.x游戏开发指南——4、5、6章

来源:互联网 发布:淘宝内部优惠卷软件 编辑:程序博客网 时间:2024/06/06 11:37

第四章 3D基础知识

4.1 Camera摄像机

参数:clear flag : skybox, solid color, depth only,don’t clear
background 背景色
culling mask 摄像机将看到勾选的层,忽略未被勾选的层
projection 投射方式 透视 正交
filed of view:透视模式的视野范围
size:正交模式摄像机视口大小
clipping planes:剪裁平面,Near Far
viewport Rect:视口矩阵
depth:用于控制多个摄像机的渲染优先级,数值越大,摄像机的优先级越高,优先级高的摄像机会覆盖在优先级低的摄像机上面
Rendering path:渲染路径
Use Player Settings
Forward 快速渲染,对所有游戏对象将按每种材质一个通道的方式来渲染
Deferred 延迟渲染,先对所有游戏对象进行一次无光照渲染,再进行光照渲染
Legacy Vertex Lit:顶点光照
Legacy Deffered:旧的延迟光照
Target Texture:目标纹理,将摄像机画面输出到一张贴图而不是屏幕
Occlusion Culling:是否剔除物体背向摄像机的部分
HDR 高动态光照渲染,该项将启用摄像机的高动态范围渲染功能

4.2 3D模型

4.2.1mesh网络模型

4.2.2贴图

4.2.3material 材质

4.2.4对应组件

4.2.5骨骼动画

第五章 创建场景

5.1场景场景

设置场景,雾设置,环境设置,其他设置

5.2地形编辑器

  1. 升降地形工具
  2. 绘制高度工具
  3. 平滑地形工具
  4. 绘制地形工具
  5. 放置树木工具
  6. 绘制细节工具
  7. 地形参数设置

5.3风域

第6章 创建人物

如果说场景是游戏画面表现力的基础,那么人物的外观及动作操作流畅度则决定了游戏画面是否有足够的动感。本章将对unity的mecanim动画系统进行系统的讲解,包括模型导入、状态机、动画混合、反向动力学以及人体动画等功能。

6.1 Mecanim系统

Mecanim系统是unity在4.0版本开始引入的新动画系统,它提供了以下几个功能:
1. 为人形角色提供了简单的设置和制作流程,包括Avatar的创建和对Muscle definitions肌肉定义的调节
2. 动画的复用性,主要通过动画重定向实现,可以非常方便地把动画从一个角色模型应用到具有相同骨骼结构的其他角色模型上。
3. 通过可视化的工具可以方便地创建、预览动画或者管理不同状态的切换。
4. 身体逻辑,如下身在执行跑步动作的同时,上半身在执行开枪动作。
一般来说,整个人物的创建分为以下3个阶段:
1. 资源准备和导入阶段,资源如网络模型和贴图等通常是由美术人员通过3d max,maya等建模软件和Photoshop绘图软件提供的,我们需要导入他们并设置正确的格式;
2. 状态机阶段,在此阶段我们设定该人物有哪些状态及对应的动作,如跑、跳等。
3. 脚本阶段,根据输入操作人物和控制摄像机。

6.2 导入模型

6.2.1模型导入设置

选中导入的fbx模型,在inspector视图中看到模型的导入设置,有模型设置、骨骼设置、动画设置这3个部分,下面我们就逐一讲解
1. 模型设置
模型的基本设置,主要的是以下6个:
(1)Scale Factor:缩放比例。因为在建模工具中一般一个单位代表1厘米,而在unity中一个单位代表1米,所以0.01是默认的缩放比例。
Mesh compression:模型压缩,off 不压缩,Low 低,Medium中,High搞,压缩比越高,在游戏包中占用的空间越小,但对顶点信息的损失就越高,看默认是off
(2) Read/Write Enable:是否可以改变网格信息
(3)Optimize mesh:是否优化网格
(4)Generate Collider:是否生成mesh collider,也可以手动添加
(5) Import Materials:是否导入材质

  1. 骨骼设置
    模型中的骨骼设置包括3个:
    (1)Animation Type:None, Legacy, Generic,Humanoid
    None 不导入骨骼信息,自然也不会导入骨骼动画
    Legacy 导入为传统的动画文件
    Generic 导入为一般的动画文件
    Humanoid 导入为人体动画 在网格模型中的实际的骨骼节点和Mecanim所识别的人体骨骼结构间有一种对应关系叫Avatar
    (2)Avatar Definition:人物的Avatar是全新生成,还是从其他地方指定
    (3)Optimize GameObject:是否优化游戏对象

  2. 动画设置
    Animation在2中设置为了humanoid,Avatar Definition设置为了从本模型生成,mecanim会尝试将网格模型中的骨骼与Mecanim所使用的人体骨骼结构Avatar进行匹配,匹配成功,则在“configure”左边出现一个勾,表面Avatar配对成功。
    生成的Avater名字为原pfx名字+“Avatar”且不能更改。

6.2.2Avatar的设置

Mapping
Muscles

6.3状态机

用于状态管理和状态切换

6.3.1 Animator

Layer
State entry是初始状态,创建state,设置名称,添加对应的动作文件

6.3.2 添加碰撞体

Add Component,添加character controller与人物模型对齐

6.3.3 添加摄像机

using UnityEngine;using System.Collections;public class ThirdPersonCam : MonoBehaviour{    //摄像机所跟随的对象    public Transform follow;    //摄像机在水平方向与对象的距离    public float distanceAway;          //摄像机在垂直方向与对象的距离    public float distanceUp;    //过渡速度    public float smooth;                    //摄像机的目标速度    private Vector3 targetPosition;         //在LateUpdate中执行摄像机操作,确保在对象的操作完成之后    void LateUpdate ()    {        //计算目标位置        targetPosition = follow.position + Vector3.up * distanceUp - follow.forward * distanceAway;        //对当前位置进行插值计算        transform.position = Vector3.Lerp(transform.position, targetPosition, Time.deltaTime * smooth);        //使摄像机观察对象        transform.LookAt(follow);    }}

6.3.4动作混合与控制

  1. 动作混合
    Animator窗口,左侧点击Parameters签页,创建名为Direction的float参数,之后在设置BlendTree混合树的时候会用到。再创建float类型的speed参数,该参数在之后的idle和run状态切换时会用到。最后创建bool参数Jump,该参数在之后从Run到Jump的状态间切换时会用到。
    下面创建BlendTree(不同动画的混合),选中Run状态,点击鼠标右键,create new BlendTree in state。看到在inspector视图中motion一栏不再是Run动画,而是blendTree。双击Run状态进入blendTree,点击+->Add Motion Field按钮添加动作,并将RunLeft动画文件指定到motion,然后继续添加RUn和RUnRIght。Parameter参数一栏通过右侧的三角形下拉菜单选择之前创建的Direction参数,该参数决定着动作如何混合,在这里可理解为角色是向左跑还是向右跑。-1为向左,0为向前,1为向右。当为之间的值时,是向前跑和向右跑的混合。
  2. 动作控制
    主要通过Input.GetAxis()和Animator.SetFloat()这两个接口
    Input.getAxis()返回的值域是-1到1,float x = Input.GetAxis(“Horizontal”);
    Animator.setFloat()设置Animator的float参数, SetFloat(string name, float value, float dampTime, float deltaTime),那么为参数的名称,value为参数的值,dampTime为参数达到该值所需要的时间,deltaTime为上一帧消耗的时间。
public class PlayerManager_1 : MonoBehaviour {    private Animator animator;    void Awake()    {        animator = GetComponent<Animator>();    }    void Update ()     {        //得到Joystick水平轴向输入的值        float h = Input.GetAxis("Horizontal");          //将该值传递至animator的Direction参数        animator.SetFloat("Direction", h, 0.25f, Time.deltaTime);       }}