首页 > 其他分享 >Unity基础笔记(5)—— Unity渲染基础与动画系统

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

时间:2022-09-18 13:34:23浏览次数:79  
标签:动画 游戏 角色 渲染 基础 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);
    }
}

标签:动画,游戏,角色,渲染,基础,Unity,组件
From: https://www.cnblogs.com/dukenone/p/16704670.html

相关文章

  • c++基础入门自学笔记总结2---C++入门(下)
    今天,我们就来进行指针的知识总结。说句题外话,这部分可以说是c和c++重要基础,在初次接触时也感觉有点难度,即使在学后几天了对指针的运用还不是很熟练,但也不必太着急,毕竟学东......
  • Redis基础
    一、Redis入门1.认识NoSQL1.1 什么是NoSQLNoSQL最常见的解释是"non-relational",很多人也说它是"NotOnlySQL"NoSQL仅仅是一个概念,泛指非关系型的数据库区别于关系......
  • Flink基础概念入门
    Flink概述什么是Flink    ApacheApacheFlink是一个开源的流处理框架,应用于分布式、高性能、高可用的数据流应用程序。可以处理有限数据流和无限数据,即能够处理......
  • mysql基础命令
    MySQL数据库入门——常用基础命令  1、使用帮助信息  登陆数据库就不介绍了哦  比如说想做创建的数据库的操作,不知道命令,就可以查看帮助信息 mysql>......
  • java的数组基础练习题
    A建立一个50元素组成的数组把1-100的所有偶数放在数组里并显示。packagefuxi;publicclassw091604练习题数组{publicstaticvoidmain(String[]args){ //TO......
  • NLP 基础知识
    NLP基础知识ñ自然语言处理(NLP)是人工智能的一个子集,它处理计算机如何处理和理解自然语言或人类语言。它用于以语音或文本的形式处理人类语言,以便计算机可以使用它......
  • 基于SqlSugar的开发框架循序渐进介绍(1)--框架基础类的设计和使用
    在实际项目开发中,我们可能会碰到各种各样的项目环境,有些项目需要一个大而全的整体框架来支撑开发,有些中小项目这需要一些简单便捷的系统框架灵活开发。目前大型一点的框架,......
  • 基础部分之numpy 调整数组维度 resize
    调整数组维度resize用法resize(numpy.ndarray,axes=[])axes:必须参数,修改维度,给出每个维度的长度实例:IPython交互>>>importnumpyasnp>>>a=np.arange(16)......
  • 如何在基础镜像中安装指定python版本
    背景由于规范要求要使用指定的镜像版本,但是由于该镜像中的python与我使用的版本有差异,怕引起一些不必要的兼容问题,所以我需要自己按基础镜像基础上安装对应版本的python。......
  • 图片的基础操作
    #安装pillow#pipinstallpillowfromPILimportImage#图片的读取显示与保存defdemo1():im=Image.open('../file/python.png')im.show()im.s......