前置笔记(由浅入深)

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. ODOO13之 八:Odoo 13开发之业务逻辑 – 业务流程的支持

    在前面的文章中,我们学习了模型层.如何创建应用数据结构以及如何使用 ORM API 来存储查看数据.本文中我们将利用前面所学的模型和记录集知识实现应用中常用的业务逻辑模式. 本文的主要内容有: 以单据 ...

  2. 改变用户体验:Whirl动画加载库的无限可能

    哈喽!欢迎来到程序视点.今天小二哥要分享的不是 Animate.js,也不是 Move.js,而是能提供108种加载动画的库:Whirl. 让加载动画变得丰富多彩! 最省力的加载动画 话不多说,直接来 ...

  3. C#/.Net的多播委托到底是啥?彻底剖析下

    前言 委托在.Net里面被托管代码封装了之后,看起来似乎有些复杂.但是实际上委托即是函数指针,而多播委托,即是函数指针链.本篇来只涉及底层的逻辑,慎入. 概括 1.示例代码 public delega ...

  4. 从隐私保护到AI隐私保护:隐私隐私保护的跨隐私保护治理框架实践案例

    目录 标题:<从隐私保护到AI隐私保护:跨隐私保护治理框架实践案例> 背景介绍 随着人工智能技术的广泛应用,隐私保护问题也日益突出.数据隐私泄露.算法歧视等问题引发了公众的担忧和不满.为了 ...

  5. Python运维开发之路《文件处理》

    一.python字典操作 1.字典的定义 字典一种key-value的数据类型,类似于json串. 2.字典的特性 key:value 字典不可变,key唯一 key的定义规则: 1.不可变,数字.字 ...

  6. Kafka 如何保证消息不被重复消费?或者说,如何保证消息消费的幂等性?

    如何保证消息不被重复消费?或者说,如何保证消息消费的幂等性? >幂等性,通俗点说,就一个数据,或者一个请求,给你重复来多次,你得确保对应的数据是不会改变的,不能出错. kafka 的机制:  K ...

  7. Seal AppManager v0.2 发布:进一步简化应用部署体验

    经过近3个月的研发,Seal AppManager v0.2 已正式发布. Seal AppManager 是一款基于平台工程理念的应用统一部署管理平台,于今年4月首次推出.在上一版本中,我们已经释出 ...

  8. Codeforces Round #771 (Div. 2) A-E

    A 代码 #include <bits/stdc++.h> using namespace std; using ll = long long; int p[507]; bool solv ...

  9. 使用C#编写.NET分析器(三)

    译者注 这是在Datadog公司任职的Kevin Gosse大佬使用C#编写.NET分析器的系列文章之一,在国内只有很少很少的人了解和研究.NET分析器,它常被用于APM(应用性能诊断).IDE.诊断 ...

  10. Oracle分区表设置详解

    Oracle分区表详解 Oracle建议单表超过2G就需要进行分表,一万数据大概3MB,单表最多分区为1024*1024-1个分区,我感觉够我们使用了哈 废话不多说,上示例,Oracle分表具体sql ...