前置笔记(由浅入深)

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. nas盒子内网穿透

    2023年5月27日星期六 -------------------------------------------------------------------------------------- ...

  2. Python潮流周刊#4:Python 2023 语言峰会

    你好,我是猫哥.这里记录每周值得分享的 Python 及通用技术内容,本期是特别加更版,聚焦于 Python 官方 2023 年语言峰会的系列博客. 博客原文:https://pythoncat.to ...

  3. 小技巧 | 使用 mv 重命名文件无需两次键入文件名称

    使用过 Bash 的童鞋都知道 mv 是一个可以用于文件改名的命令,而且使用这个命令修改文件名时我们需要输入两次文件名(旧名字和新名字). 如果有一种情况是只需要你改动文件名中的一个字母,而文件名又特 ...

  4. kotlin 函数格式大赏

    fun main() { // 一个有引用的lambda表达式 val f11: (Int, Int) -> Unit = {n1, n2 -> println("f11 is ...

  5. Python潮流周刊#6:Python 3.12 有我贡献的代码!

    你好,我是猫哥.这里记录每周值得分享的 Python 及通用技术内容,部分为英文,已在小标题注明.(标题取自其中一则分享,不代表全部内容都是该主题,特此声明.) 首发于我的博客,https://pyt ...

  6. CHAT-GPT初使用

    拿chatgpt去试验了一下,一个挺小的需求,但是前后还是更改了三次,体验就是它可以不断改进之前实现的代码,但需要提需求的人比较清楚需求内的细节,差不多类似于,我有想法,它来实现,还是可以提高不少效率 ...

  7. HCL实验6:静态路由

    拓扑图 步骤: 连线,路由器与路由器通过S端口连接 配置好PC 配置路由器端口IP 配置路由器的下一跳地址(静态路由) 详细步骤 连线情况可见拓扑图 配置好PC 端口IP R1 [R1]int g0/ ...

  8. 一文了解 io.Copy 函数

    1. 引言 io.Copy 函数是一个非常好用的函数,能够非常方便得将数据进行拷贝.本文我们将从io.Copy 函数的基本定义出发,讲述其基本使用和实现原理,以及一些注意事项,基于此完成对io.Cop ...

  9. linux内核编译基础知识储备 --- 过渡篇(四)

    文章目录 一. 一种makefile中定义函数的方式 二. makefile之if函数 三. MAKE变量 四. $(quiet) 4.1 quiet = 空 与 quiet=quiet_ 的区别 4 ...

  10. Redis理论

    什么是Redis Redis(Remote Dictionary Server)是使用C语言编写的,开源的(BSD许可)高性能非关系型(NoSQL)的键值对数据库. Redis可以存储键和五种不同类型 ...