前置笔记(由浅入深)

Unity 游戏开发、01 基础篇

2 场景操作

3D场景

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

窗口布局

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

3 全局光照

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

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

4 3D物体

原生3D

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

增量移动

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

顶点对齐

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

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

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

物体多选

  • 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 曲线手柄等

动画事件

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

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


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

Unity - Scripting API: AnimationEvent (unity3d.com)

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键完全显示所有状态

状态过渡

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

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

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

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

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

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

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

脚本修改状态参数

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 先于条件检测发生

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物体)

造山

挖坑

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

Unity 游戏开发、02 基础篇 | 知识补充、简单使用动画、动画状态机的更多相关文章

  1. Unity游戏开发面试基础知识

    面试第一次知识总结: 一.Unity基本操作 1.unity提供哪几种光源? 点光源.平行光.聚光灯.区域光. 2.物体发生碰撞的必要条件什么? 两个物体必须有碰撞体Collider组件,一个物体上必 ...

  2. 【unity3d游戏开发之基础篇】unity3d射线的原理用法以及一个利用射线实现简单拾取的小例子

    原地址:http://www.cnblogs.com/xuling/archive/2013/03/04/2943154.html 最近开始研究U3D,它的强大就不多说了, 今天研究了研究射线相关东西 ...

  3. 【Unity游戏开发】浅谈Lua和C#中的闭包

    一.前言 目前在Unity游戏开发中,比较流行的两种语言就是Lua和C#.通常的做法是:C#做些核心的功能和接口供Lua调用,Lua主要做些UI模块和一些业务逻辑.这样既能在保持一定的游戏运行效率的同 ...

  4. 喵的Unity游戏开发之路 - 推球:游戏中的物理

    很多童鞋没有系统的Unity3D游戏开发基础,也不知道从何开始学.为此我们精选了一套国外优秀的Unity3D游戏开发教程,翻译整理后放送给大家,教您从零开始一步一步掌握Unity3D游戏开发. 本文不 ...

  5. 喵的Unity游戏开发之路 - 多场景:场景加载

    如果丢失格式.图片或视频,请查看原文:https://mp.weixin.qq.com/s/RDVMg6l41uc2IHBsscc0cQ 很多童鞋没有系统的Unity3D游戏开发基础,也不知道从何开始 ...

  6. C# Unity游戏开发——Excel中的数据是如何到游戏中的 (二)

    本帖是延续的:C# Unity游戏开发——Excel中的数据是如何到游戏中的 (一) 上个帖子主要是讲了如何读取Excel,本帖主要是讲述读取的Excel数据是如何序列化成二进制的,考虑到现在在手游中 ...

  7. C# Unity游戏开发——Excel中的数据是如何到游戏中的 (四)2018.4.3更新

    本帖是延续的:C# Unity游戏开发--Excel中的数据是如何到游戏中的 (三) 最近项目不算太忙,终于有时间更新博客了.关于数据处理这个主题前面的(一)(二)(三)基本上算是一个完整的静态数据处 ...

  8. 喵的Unity游戏开发之路 - 玩家控制下的球的滑动

  9. 喵的Unity游戏开发之路 - 轨道摄像机

    前言        很多童鞋没有系统的Unity3D游戏开发基础,也不知道从何开始学.为此我们精选了一套国外优秀的Unity3D游戏开发教程,翻译整理后放送给大家,教您从零开始一步一步掌握Unity3 ...

  10. 喵的Unity游戏开发之路 - 在球体上行走

    很多童鞋没有系统的Unity3D游戏开发基础,也不知道从何开始学.为此我们精选了一套国外优秀的Unity3D游戏开发教程,翻译整理后放送给大家,教您从零开始一步一步掌握Unity3D游戏开发. 本文不 ...

随机推荐

  1. 如何使用C++ 在Word文档中创建列表

    列表分类是指在Word文档中使用不同格式排序的列表,来帮助我们一目了然地表达出一段文字的主要内容.比如,当我们描述了某个主题的若干点,就可以用列表把它们一一表达出来,而不是写成完整的段落形式.同时,列 ...

  2. 文档在线预览(三)使用js前端实现word、excel、pdf、ppt 在线预览

    @ 目录 实现方案 一.docx文件实现前端预览 1.docx-preview 2.Mammoth 二.PDF文件实现前端预览 1.pdf.js 2.pdfobject.js 3.vue-pdf 4. ...

  3. Kubernetes(k8s)健康性检查:livenessprobe探测和readinessprobe探测

    目录 一.系统环境 二.前言 三.Kubernetes健康性检查简介 四.创建没有探测机制的pod 五.添加livenessprobe探测 5.1 使用command的方式进行livenessprob ...

  4. Java(包机制、doc、Scanner对象)

    包机制 本质:文件夹 用于区别类名的命名空间 一般利用公司域名倒置作为包名 import与通配符* 导入包 例: import java.util.Scanner; import com.xxx.xx ...

  5. ffuf的使用

    ffuf:模糊测试 使用 ffuf 进行枚举.模糊测试和目录暴力破解 安装 https://github.com/ffuf/ffuf 建议:https://github.com/danielmiess ...

  6. 某表格常用api

    这是一个神奇的网站,可作为免费的数据存储平台,已白嫖多年 通过调用接口可以方便的实现增删改查.修改www前缀为vip,还能嫖vip服务器 我常常用来写入程序的日志记录,记录/更新一些关键key 不需要 ...

  7. MySQL中都有哪些锁?

    MySQL中都有哪些锁 为什么需要锁 在计算机系统中,锁(Lock)是一种同步机制,用于控制对共享资源的访问.它确保在任何给定时间内只有一个线程能够访问受保护的共享资源,从而避免了由并发访问导致的数据 ...

  8. 前端下拉框组件CCDropDownFilter下拉框 筛选框 仿美团下拉筛选框

    快速实现下拉框 筛选框 仿美团下拉筛选框, 请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id=12421 效果图如下:   # 下拉框使用方法 ...

  9. TheTransformerPlaybookforNLPandLanguageUnderstanding

    目录 2.1 基本概念解释 2.2 技术原理介绍 2.3 相关技术比较 3. 实现步骤与流程 3.1 准备工作:环境配置与依赖安装 3.1.1 准备工作:环境配置与依赖安装 3.1.2 核心模块实现 ...

  10. 构建高可用性的 SQL Server:Docker 容器下的主从同步实现

    摘要:本文将介绍如何在 Docker 环境下搭建 MS SQL Server 的主从同步,帮助读者了解主从同步的原理和实现方式,进而提高数据的可靠性和稳定性. 一.前言 在当今信息化的时代,数据的安全 ...