Unity基础笔记(5)—— Unity渲染基础与动画系统

Unity渲染基础与动画系统

Unity渲染基础

一、摄像机

1. 摄像机概念
  • 和现实中的摄像机很接近,Unity 中 Camera 组件负责将游戏画面拍摄然后投放到画面上
  • Camera 拍摄到的画面决定了 Game 面板的画面
  • 创建场景的时候,Unity 会默认创建一个摄像机,所以我们点击 Game 面板才有画面
  • 在游戏中摄像机一般是会移动的,比如第一人称游戏中摄像机会一直跟随我们的操作,摄像机的移动效果其实也是基于摄像机游戏物体的 Transform 来实现的
2. 摄像机常用设置
  1. BackGround:背景颜色,前提是不使用 Skybox

  2. Culling Mask:可以看到哪些游戏物体

  3. Field Of View:视野大小

  4. Clipping Planes:画面拍摄的最小距离以及最大距离

  5. 摄像机快速定位:我们在 Scene 面板中使用漫游的方式找到一个合适的视角,希望摄像机同样是这个视角。

    GameObject -> Align With View

    快捷键:Ctrl + Shift + F

  6. 绝大多数情况下,我们开发游戏主要会控制摄像机的移动、旋转来达到摄像机跟随、移动等效果,摄像机本身的属性一般是一开始就设置好的,所以我们现阶段不在代码中测试相机的属性修改。

二、灯光

1. 灯光的概念
  • 和现实中灯光的概念一致,灯光主要影响明暗程度以及阴影
  • 现实中存在很多种不同的光源,比如太阳、手电筒、电灯、萤火虫等等,Unity中模拟了现实中不同光源发射的灯光并将其内置成了组件的形式的存在,这就是灯光组件。
2. 灯光设置
  • 因为灯光属于常用游戏资源,在层级面板中右键 -> 创建 -> 灯光,可以选择多种类型的灯光

  • Directional:平行光,类似太阳,整个游戏世界都会被照亮。平行光的位置不会对 光影造成影响,反而是旋转会影响阴影位置。

  • Spot:聚光灯

  • Point:点光源

  • Area:面积光源,比较特别,必须烘培、只对静态物体有效。

    灯光烘培操作:Window -> Rendering -> Lighting

  • 静态物体:Game 场景中不会变化、渲染上不会实时计算的游戏物体

  • 灯光烘培:提前渲染好的,之后不再改变

3. 灯光常用属性
  1. Type:灯光类型

  2. Range:灯光范围

  3. Mode:渲染模式

    • 实时:动态的计算灯光
    • 烘培:一开始就确定好灯光,后面游戏物体走过来身上不会有光
    • 混合:静态物体一开始也确定好灯光,后面游戏物体走过来身上也会有光
  4. Intensity:灯光强度

  5. Shadow Type:阴影类型

    • No Shadows:无阴影

    • Hard Shadows:硬阴影,边角更分明,没有过渡层

    • Soft Shadows:软阴影,边缘会虚化

      (下面两个常用属性只在硬阴影和软阴影类型下才会出现)

      • Strength:阴影强度
      • Bias:倾斜,阴影与实际物体的偏移

三、Shader 概念

1. 渲染管线

渲染管线实际就是“渲染的流水线”,Unity 中主要有:

  • Builder-In Render Pipeline(内置渲染管线):默认的渲染管线
  • Universal Render Pipeline(通用渲染管线):性能较好
  • HD Render Pipeline(高清渲染管线):以画面为主,偏向高端机器和影视的渲染管线

目前阶段不需要深刻理解,可以粗暴地理解成有几种**“渲染模式**即可。

2. Shader 介绍
  • Shader 是渲染管线的算法片段,用于告诉图形硬件如何计算和输出图像
  • Shader 的制作一般基于某个渲染管线,不具备通用性
  • Shader 可以让模型展现出不同的效果,比如风格化、水等等

Shader入行并不是必需知识,但是对这些名词一定要有概念,知道其作用以及如何使用即可。

3. Shader 下载和使用

Shader 可在 Asset Store 中下载

使用方式:我们可以将 Shader 附加给材质球,然后材质球附加给网格渲染器。

Unity 本身也内置了一些基本 Shader

四、粒子系统

1. 粒子介绍

游戏中,下雨、下雪、法球以及一些技能效果都是基于粒子完成的。

游戏开发中,大多数情况下由特效师来完成粒子的制作。

我们重点要学习的是如何使用美术提供的粒子,而不是制作粒子。

2. 粒子常用属性

在层级面板中,右键 -> Effects -> Particle System,可以创建一个粒子游戏物体

这个游戏物体身上有一个 Particle System组件,基于这个组件可以完成粒子的创作,这个组件里面的大多数知识我们都不需要学习,但是有几个重要的参数,我们要关注一下:

  • Duration:持续时间,指多少秒后就不再发射粒子,但是不会导致已经发射的粒子消失
  • Looping:是否循环
  • Start Lifetime:粒子发射出去后,这颗粒子的存活时间
  • Play On Awake:是否立刻播放粒子
  • Stop Action:结束事件,选择 Destory 则播放完毕销毁自己

Unity动画系统

一、动画系统介绍

1. 游戏动画

游戏中的动画,一般指的其实是模型的动作,而动作主要是服务视觉,我们在数据计算上一般并不依赖动作,实际的攻击计算等一般还是使用碰撞体。

重点学习的是,如何给角色配置动作、如何切换动作、代码控制动作等等。

2. Unity 动画
模型和动作
  • 非人形角色,比如一个章鱼怪,它的动作基本上是完全为了这一个模型来设计的,无法复用到其他模型
  • 人形角色,符合标准的都可以复用,基于 Avatar
角色动作组成
  • 游戏物体上挂载 Animator 动画组件
  • Animator 组件上持有 Controller(动画控制器),Controller 上配置好动作以及动作切换逻辑
  • 利用 Animator 组件来播放动画以及切换动画

二、Unity内制作动画

选择一个具备 Animator 组件的游戏物体后切换到 Animation 面板,点击录制按钮,对物体的各方面属性进行操作,即可进行简单动画的制作。

在这里插入图片描述

在编辑具有 Animator 组件的父物体时,可以同时编辑子物体来实现动画的同步,而不需要单独修改子物体的动画。

三、Animator Controller

Animator Controller 是一个配置文件

  • 动画片段设置

    点击动画文件后,检查面板中可以设置该动画片段的参数。

    • Loop Time:动画是否循环播放
    • Loop Pose:是否循环姿势,让头尾连接更平滑
  • Animator 面板

在这里插入图片描述

  • 状态面板

    当我们选择一个状态后,检查面板中会出现这个状态的一些参数

    • Motion:这个状态具体要播放的动画文件
    • Speed:动画的播放速度,float类型
    • Mirror:镜像动画,动画左右相反
    • Transitions:该状态参与的状态转换
      • Solo:当两个状态之间有多个条件时仅此一条生效
      • Mute:禁用
  • 状态切换

  • 参数面板

    状态之间的连线,点击具体某根线后,检查面板中可以设置状态切换的具体参数。

    • Has Exit Time:播放完毕才能切换
    • Conditions:条件参数,也就是这条线什么时候起效果
  • 代码控制

    游戏运行之后,动画会自行从入口开始执行,但是我们可以获取 Animator 组件后修改参数,使动画切换。

    • 修改参数的值:SetInteger("Run", 1),对应的还有 SetBool、SetTrigger、SetFloat
    • 获取参数的值:`GetInteger(“Run”),对应的还有 GetBool、GetFloat
    • Speed:整体的播放速度
    private Animator animator;
    void Start()
    {
        animator = GetComponent<Animator>();
    }
    
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            animator.SetTrigger("跳");
        }
    }
    

四、模型资源与动画设置

大多情况下,我们需要使用美术人员提供的模型以及动画资源。在学习过程中,可以在Unity官方商店下载来使用。

Unity常用模型格式:fbx

大多数模型是先建好白模,然后贴上有贴图的材质球,最后放到project面板中变为预制体来使用的。

五、人形动画的复用性

人形角色的骨骼结构是一致的,所以具备动作的复用性。

但是这种复用是有条件的,也就是:

Avatar 映射文件:人形动作中才使用,映射人体的位置对应什么游戏物体,这样动作文件从才能正确的工作,基于此可以让动作复用

六、动画事件

自建动画:在 Animation 中添加事件

模型动画:在模型中找到动画片段,添加事件

七、角色控制器组件

1. 角色控制器概述

目前所学到的角色移动方式,主要是基于 Transform 以及 Rigidbody.MovePostion.

但 Transform 不具备物理特性,而 Rigidbody 却不稳定,很容易被弹开、穿模。

利用角色控制器组件实现角色移动是第三种方式,也是最容易上手的角色移动方式。

2. 常用属性
  • Slope Limit:控制角色最大的爬坡斜率
  • Step Offset:控制角色可以迈上最大的台阶高度
  • Skin Width:在角色的外围包裹一层”皮肤“,这层皮肤的厚度,就相当于角色身上透明的衣服,如果 Skin Width 设置为1米,那么角色当然就会“浮空”1米,一般保持默认即可。
  • Min Move Distance:最小移动距离,默认是1毫米,如果该数值过大但代码中单位移动速度很慢,角色就不会动
  • Center / Radius / Height:角色控制器组件在 Scene 面板中体现为一个“胶囊碰撞器”的形状,这也导致其他的碰撞体我们并不需要,Center 为胶囊中心点位置,Radius 为半径,Height 为高度。
3. 角色控制器控制角色移动
  • 角色控制器组件所在的游戏物体身上不需要碰撞体和刚体
  • 常用属性
    • isGrounded:是否在地面上
  • 常用方法
    • Move(Vector3 dir):和 Transform.Translate 雷同,没有重力,需要传递的是一个方向,数值的大小影响移动速度,所以需要乘上 Time.deltaTime.
    • SimpleMove(Vector3 speed):会应用重力,需要传递的是一个速度,并且本身就是按照时间来计算的,数值大小虽然也会影响移动速度,但是不会被帧率影响,所以不需要乘 Time.deltaTime.

八、案例:3D角色移动

使用角色控制器组件来控制角色位移,并且播放正确的待机或移动动画。

public class CharacterMoveTest : MonoBehaviour
{
    private CharacterController characterController;
    private Animator animator;

    void Start()
    {
        characterController = GetComponent<CharacterController>();
        animator = GetComponent<Animator>();
    }

    void Update()
    {
        //Demo1();
        Demo2();
    }

    // 实现基于自身坐标系的移动,不考虑旋转
    void Demo1()
    {
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");

        if (h != 0 || v != 0)
        {
            animator.SetBool("IsWalk", true);
        }
        else
        {
            animator.SetBool("IsWalk", false);
        }

        Vector3 dir = new Vector3(h, 0, v);
        // 返回以transform为参考的方向,得到角色自己的前方
        dir = transform.TransformDirection(dir);
        characterController.SimpleMove(dir);
    }

    // 实现了旋转,但没有向后转身的操作,且该方法只适合固定相机在角色背后的情况
    private void Demo2()
    {
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");

        if (h != 0 || v != 0)
        {
            animator.SetBool("IsWalk", true);
        }
        else
        {
            animator.SetBool("IsWalk", false);
        }

        Vector3 dir = new Vector3(0, 0, v);
        // 返回以transform为参考的方向,得到角色自己的前方
        dir = transform.TransformDirection(dir);
        characterController.SimpleMove(dir);

        transform.eulerAngles = new Vector3(0, transform.eulerAngles.y + h * Time.deltaTime * 120, 0);
    }
}
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值