首页 > 其他分享 >Unity 游戏开发、02 基础篇 | 知识补充、简单使用动画、动画状态机

Unity 游戏开发、02 基础篇 | 知识补充、简单使用动画、动画状态机

时间:2023-09-12 22:12:03浏览次数:60  
标签:02 动画 贴图 物体 状态机 Animation 节点

前置笔记(由浅入深)

Unity 游戏开发、01 基础篇


2 场景操作

3D场景

  • Q 手型工具(鼠标中键):上下左右移动场景
  • ALT + 鼠标左键:以视图为中心旋转
  • 鼠标右键:以观察者为中心旋转
  • SHIFT + Gizmo方块:Y轴归位
  • 物体节点 + F:观察者定位至物体

窗口布局

3D项目一般窗口布局如下

image-20230912110529498

3 全局光照

全局光照GI(Glballlumination)(编辑模式下才能生成)

  • Window | Rendering | Lighting Setting
  • 光照强度因子 Intensity Multiplier
  • Generate Lighting,生成一份光照数据(在场景目录)

4 3D物体

原生3D

  • Plane、Quad 仅单面可见
  • 用于度量
  • 用于占位(原型设计)

增量移动

按住CTRL(默认0.25单位增量)

image-20230912113632998

顶点对齐

一个物体的顶点(Vertex)与另外物体的顶点重合

选择一个物体按住 V 拖动一个顶点至其他模型的顶点上

打开 shaded wireframe 可以看到各个模型的顶点

image-20230912114122870

物体多选

  • Hierarchy窗口,按CTRL或SHIFT
  • Scene窗口,按CTRL选择
  • Scene窗口,鼠标框选

5 材质

材质

球形预览:材质包含了 光照计算,光线不同角度照射时,显示效果不同

不同贴图的功能

  • Albedo 反照率贴图,用于表现本体颜色
  • Metallic 金属度贴图,用于表现哪些部位,更有金属光泽
  • Normal Map 法线贴图,用于表现凹凸细节
  • Specular 镜面贴图,用于表现镜面反射

着色器

着色器是一个程序,一个算法。会综合考虑以下因素

  • AIbedo 物体本来的颜色
  • 入射光的角度、颜色、强度
  • Metallic / Specular / Normal Map / Hight Map 等

决定物体表面的实际显示效果,着色(上色、染色)。默认材质选择的是标准着色器算法

标准着色器算法里确定了顶点坐标与贴图对应关系(不同三角面对应贴图中的不同位置)


天空盒

天空盒也是一种材质

  • 将贴图的 Wrap Mode 设为 Clamp 模式
  • 创建 Material,选择 Shader:Skybox 6 Sided
  • 设置对应的贴图 Front/Back/Left/Right/Up/Down
  • 由六张贴图组成的一个无穷大正方体

6 物体运动

转向轴心投影位置

public  GameObject target;
void Start()
{
    Vector3 pos = target.transform.position;
    pos.y = 0;
    transform.LookAt(pos);
}

模型调整

导入Unity后,模型的 Axis、Pivot、Size 都是确定的,最好在建模软件中修改,也可以用空节点套子节点,调整子节点模型方向与空节点Z轴对齐


7⭐动画

类别

  • 旧版的,Legacy ,对应 Animation 组件
  • 新版的,状态机动画 ,对应 Animator 组件,适合角色动画

旧版

  1. 创建 Animation | 检查器选项 | Debug模式 | 勾选 Legac

  2. 拖动至物体节点,添加 Animation 组件

  3. 选中动画物体节点,在 Animation 窗口(Window | Animation | Animation )添加属性

    可以添加子节点的属性

  4. 进入录制模式,插入关键帧,调整节点属性

细节

  • 非关键帧部分属性是插值计算出来的
  • Animation 窗口每 60 帧相当于 1 秒
  • 动画播放时间长度与游戏帧率无关

动画曲线

默认插值计算的动画曲线不是直线(匀速运动),Animation | Curves 看到各属性字段对应的曲线变化

  • F键完全显示所有曲线
  • CTRL + 滚轮(横轴缩放)
  • SHIFT + 滚轮(纵轴缩放)

修改曲线过渡

  1. 进入 Recording Mode

  2. 左侧选中 Position.x,仅显示 x 属性的曲线

  3. 编辑关键帧,右键 Both Tangent | Linear 改为线性(匀速运动)

    其他操作:添加、删除关键帧,Tangent 曲线手柄等

image-20230912170849026

动画事件

当播放到某一帧时,触发一个回调方法

在时间轴下灰色部分右键 | Add Animation Event (左侧按钮)

image-20230912173216121 image-20230912173347896

事件调用的函数可以获取一个参数

Unity - Scripting API: AnimationEvent (unity3d.com)

image-20230912173906477
public void DropOnGround(float time)
{
        Debug.Log(time);
}

如果不自动播放,可以通过API获取Animation组件手动播放动画列表

private void Start() => GetComponent<Animation>().Play();

8⭐动画状态机

状态机

Mecanim 一个基于状态机控制的动画系统

状态机:用算法控制一个有多种状态的事物或系统,在各种状态间切换的机制

一个人物模型可能有以下几种状态:idle、walk、jump、swim、attack,不同的状态有不同的动作

  1. 创建 Animator Controller 文件,拖动至物体节点,创建 Animator 组件
  2. 双击动画状态机文件,打开编辑窗口
  3. F键完全显示所有状态

状态过渡

image-20230912181323420

Entry是状态的起点,默认状态显示为橙色

  1. 选择节点,右键添加过渡
  2. 将动画(不是Legacy) 绑定到各节点上的 Motion

利用 状态参数 控制状态机的运行

  1. 添加状态参数(左侧面板)
  2. 修改路径触发条件(检查器窗口)

路径属性 Has Exit Time (退出时间)

当前路径若同时设置退出时间与条件,时间到时会先检查条件,条件满足再退出,不满足的话当前路径会失效,后续再满足条件也不会走这条路

  • Exit Time (秒、轮)
  • Fixed Duration(勾是秒、不勾是轮)
image-20230912181852662

脚本修改状态参数

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

private void Update()
{
    	// animator.SetBool("isDancing", Input.GetKey(KeyCode.Space));
        if (Input.GetKeyDown(KeyCode.Space))
        animator.SetBool("isDancing",
                !animator.GetBool("isDancing"));
}

状态机行为

进入状态、每次Update、退出状态时的回调;状态节点 | Add Behaviour

Has Exit Time 触发 OnStateExitOnStateExit 先于条件检测发生

image-20230912185700581
override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
    Debug.Log("进入了 Dancing 状态");
}
override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
    animator.SetBool("isDancing",false);
}

控制物体移动

  1. 可以通过获取状态机的变量值进行判断
  2. 访问状态机当前层次正在播放的状态节点
  3. 添加一个新的状态变量,在关键节点利用状态机行为修改
public float walkSpeed = 0;
public float rollSpeed = 0;

private Animator anim;

private void Awake()
{
    anim = GetComponent<Animator>();
}

private void Update()
{
    if (anim.GetBool("Walk_Anim"))
    transform.Translate(0,0,walkSpeed * Time.deltaTime);

    bool flag = anim.GetCurrentAnimatorStateInfo(0).IsName("closed_Roll_Loop");
    if (flag)
        transform.Translate(0,0, rollSpeed * Time.deltaTime);
}

9 地形

地表

  1. Create | Terrain Layer

  2. 指定 Diffuse 主帖图;Normal 法线贴图

  3. Terrain 组件 | Paint Terrain | Edit Terrain Layers

    第一个表面是默认表面


花草

Grass Texture 自动扭转对准摄像机,远了不渲染

  • Terrain 组件 | Paint Details | Edit Details
  • SHIFT 消除;CTRL 消除当前类型花草

植树同理(预制体,3D物体)


造山

image-20230912212240225

挖坑

地表最低海拔为0,要挖坑必须先抬高地势


标签:02,动画,贴图,物体,状态机,Animation,节点
From: https://www.cnblogs.com/linxiaoxu/p/17697950.html

相关文章

  • 【小沐学Unity3d】3ds Max 骨骼动画制作(Mixamo )
    1、简介官网地址:https://www.mixamo.com/#/使用Mixamo上传和装配AdobeFuseCC3D人物、自定义3D人物,或者利用Mixamo库中的人物开始操作。<fontcolor=blue>Mixamo支持3种文件格式上载:FBX,OBJ,ZIP。确保FBX文件的“嵌入媒体”已打开,以上传纹理。OBJ文件不包含纹理,使字......
  • test20230912
    写在前面的话考场估分\(100+100+20+30=250\),实际得分\(0+90+20+30=140\)。这是停课以来挂分最为严重的一次,值得深思。挂分的原因也比较令人头疼,就是数组开大导致的\(\text{MLE}\)。所以我决定以后的每一次考试都要测试使用的内存大小:fprintf(stderr,"%.3lfMB",(&Med-&Mbe......
  • 2023/9/12
    今天上午学习了数据结构,对算法有了更进一步的认识,开始了线性表的学习,进行了线性表的顺序表示和链式表示的学习,学习到了线性表的增删改查,重新温习一部分链表知识。第二节课学习了马克思主义基本原理,开始了世界的物质性及发展规律的学习,对第一节世界的多样性与物质统一性进行了具体......
  • 日常记录--day2--2023-9月12日--周二
    日程:今天只有上午有课,7点起床,上午是数据结构和马原,上数据结构的第一节课有一点困,不过撑住了,第二节课精神不错(早八真是害死人),下午午休有点过头了,休息到头昏脑胀。晚上7-9点学了会Java,完成了力扣每日一题。学了什么:下午简单学习了Java,晚上写了一道链表,一道哈希表,小有收获。PS:不想......
  • 基于vue制作的动画组件loading起来
    ......
  • 20230912
    今天碰到客户一个bug,应该是properties.settings.default出了问题,找了半天,路径是"C:\Users\hayilee\AppData\Local\Autodesk,_Inc\DefaultDomain_Path_0neuf4231rcmba5oqyptv1by4uxhr5mr\R24.1.51.0.0\user.config",打开一看,确实结构不完整,补完整了,重启cad就好了......
  • 123.jpg 蓝牛相片摄影时间更改助手是一款绿色免费的照片批量修改摄影日期时间,让您的相
     蓝牛相片摄影时间更改助手是一款绿色免费的照片批量修改摄影日期时间,让您的相片一目发然相片摄影时间 软件全自动一键操作,再也不必一个一个手动修改了更新日志:2023年9月12日V2.00 支持自定义图片类型 升级核心代码2023.04.25V1.50优化代码提高速度修复BUG 本地......
  • 2023.9.12
    今天学习了数据结构的顺序表和链表。学习了顺序表的基本原理和创建,学习了顺序表的初始化和取值,主要判断输入的数据是否合理在继续查找,查找功能类似取值功能。接着学习了比较重要的单链表,学会了单链表的基本原理,主要是节点储存数据和下一个节点的地址值,学会了单链表的初始化,只保留......
  • day02
    一、where子句select字段from表名where子句;​在where子句中可以使用关系运算符、逻辑运算符,当子句的条件为真的数据才会显示对应的字段数据where子句可以是关系运算符=!=><>=<=注意:因为在SQL中无需、也不能定义变量,因此=运算符只能用来判断关系是否相等......
  • 2023/09/12
    今天了解了数据结构中的线性结构中的队列的两种不同存储方法:顺序表和链表的实现。顺序表是通过申请一段连续的空间对数据进行存储,数据表中需要记录的数据就是顺序表的表头的位置和顺序表的长度,由于存储的空间连续,顺序表可以直接通过表头地址加某个不超过表长-1的数据对表中的数......