Unity学习笔记

并不完全的Unity学习笔记~~

摘录自Unity中文课堂 (u3d.cn) – Joker独游计划合集

Unity主要框架

Scene场景

Scene记录游戏中各元素并显示,为.unity的配置文件。

GameObject游戏物体

场景中的一切都为游戏物体。

游戏物体的编辑一般通过Hierarchy、Inspector面板。

不同的组件赋予游戏对象不同的功能。

Component组件

组件为一个或多个功能的容器。

组件化设计有利于维护拓展,简化继承树。

Unity中任务游戏物体都有Transform组件。

Project窗口

Project窗口是一个开发时使用的项目资源管理器,为文件夹结构。

Inspect窗口

可查看游戏物体的属性设置

GameObject

任何物体身上都有一个gameObject属性,代表所在的GameObject。

主要属性

  • name:名称
  • tag:标签
  • layer:层分类

主要行为

  • SetActive:是否显示
  • AddComponent:添加组件
  • GetComponent:获取组件
  • GetComponents:获取多个组件
  • GetComponentInChildren:获取子物体上的组件
  • GetComponentInParent:获取父物体上的组件

组件的生命周期

在Unity中生命周期指一个组件从创建到销般的所有阶段,这些阶段肯定要做一些事情,这些事情就是生命周期函数。注意:官方一般称为“事件函数”。

关键生命周期函数

Awake(针对GameObject):始终在任何 Start函救之前GameObject创建后调用此函数。

OnEanble(针对自身):在启用对象后立即调用此函数。

Reset:调用 Reset 可以在脚本首次附加到对象时以及使用 Reset 命令时初始化脚本的属性。

OnValidate:每当设置脚本的属性时都会调用 OnValidate,包括反序列化对象时。

Start(针对自身):仅当启用脚本实例后,才会在第一次帧更新之前调用 Start

OnApplicationPause:在帧的结尾处调用此函数(在正常帧更新之间有效检测到暂停)。在调用OnApplicationPause之后,将发出一个额外帧,从而允许游戏显示图形来指示暂停状态。

FixedUpdate:调用 FixedUpdate 的频度常常超过 Update。如果帧率很低,可以每帧调用该函数多次;如果帧率很高,可能在帧之间完全不调用该函数。在 FixedUpdate 之后将立即进行所有物理计算和更新。在 FixedUpdate 内应用运动计算时,无需将值乘以 Time.deltaTime。这是因为 FixedUpdate 的调用基于可靠的计时器(独立于帧率)。

Update(针对自身):每帧洞用一次 Update。这是用于帧更新的主要函数

LateUpdate(针对自身):在LateUpdate完成后执行一次

OnDisable(针对自身):被禁用或处于非活动状态时,调用此函数

OnDestroy(针对GameObject):对象存在的最后一帧完成所有顿更新之后,调用此函数(可能因为Destroy函教或在场景关闭时销数该对象)

针对GameObject:指就算组件被禁用也能调用

Unity输入系统

监听键盘输入

键盘的输入有三种状态:按下的瞬间、持续按下中、弹起的瞬间

下方三个函数返回都是bool类型、参数都是KeyCode枚举类型

1
2
3
Input.GetkeyDown(KeyCode.A)
Input.Getkey(KeyCode.A)
Input.GetKeyUp(KeyCode.A)

监听鼠标输入

和键盘差不多,不过0是鼠标左键、1是鼠标右键、2是鼠标中键

1
2
3
Input.GetMouseButtonDown(0);
Input.GetMouseButton(0);
Input.GetMouseButtonUp(0);

InputManager

Unity提供了一种常见且方便的使用方式:

大多游戏中键盘A和D,是控制玩家在水平方向上进行移动,这里提供一个函数:

如果玩家按下A,函数的返回值会偏向-1

如果玩家按下D,函数的返回值会偏向1

如果玩家不按A和D,函数的返回值会偏向0

为什么叫“偏向”,因为会缓动效果,比如按下A后,数值慢慢减到-1,如果不按,慢慢回到0,按下D,慢慢到D,刚好可以模拟出启动、惯性的效果

1
2
Input.GetAxis("Horizontal");
Input.GetAxisRaw("Horizontal"); // 不进行缓动,只有三种可能 -1,0,1

“Horizontal”是在Project->InputManager中配置

Unity2D动画

Animator:动画组件(组件)

用来持有AnimatorController的组件,注意可以多个Aniamtor持有一份AnimatorController

AnimatorController:动画控制器(文件)

动画控制器相当于是一个配置文件,配置的是一个角色有那些动画,动画和动画之间如何跳转

状态:当前角色处于的状态,状态会持有具体的AniamtionClip

条件:动画之间的切换基于什么条件

参数:条件基于参数来判断是否满足,满足则切换

  • int、float、bool和代码中的类似
  • Trigger:触发一次,bool相当于是一种状态,但是Trigger是一个一次性使用的条件

Has Exit Time:即使条件满足也需要等待当前状态的播放完毕才能进行切换

参数:提供给脚本去访问、修改的“值”,这些值变化则状态变化,则动画发生改变

CrossFadeInFixedTime:此函数无视是否有条件(也就是不拉线也能强行切换动画状态)

AniamtionClip:动画片段(文件)

动画片段,就是动画文件,记录了每一帧的信息,Unity内可以制作动画,但是从其他建模类软件导入的情况也比较多(尤其是3D动画)

2D动画也分为帧动画和骨骼动画

  1. 帧动画就是通过切换图片形成动画

  2. 而骨骼是通过旋转、缩放、移动关节点进行变化的动画

动画事件

1.在Animation窗口对AnimationClip添加事件

2.选择Animator所在游戏物体的某个脚本函数(必须是公开方法)

常见组件

Transform组件

任何物体身上都有一个transform属性,代表所在的GameObject上的Transform组件。

2D物理系统

碰撞体

决定物理单位的形状,是矩形,还是圆形,或者说自定义的多边形

刚体

物理单位的物理特性,也就是定义物理单位怎样受到物理的控制,如重力等等

事件

碰撞事件:当两个物理单位相撞时会调用的逻辑

触发事件:当两个物理单位其中一个碰撞体设置为触发器时调用的逻辑

主要属性

position:坐标

rotation:旋转 四元数格式

eulerAngles:旋转 欧拉角格式

localScale:缩放

其中position、eulerAngles、localScale都可用 Vector3三维向量 类型表示

localPosition、localRotation、localEulerAngles:是相对父物体的坐标与旋转

parent:父物体的transform

childCount:子物体的数量

root:自身的根节点(父的父的父到最上层)

主要行为

GetChild:获取第X个子物体

SetParent:设置自身为某个游戏物体的子物体

Find:查找子物体,参数是路径,填写方式类似文件夹”A/B/C”

Translate(Vector3 translation, Spave relativeTo):移动

其中translation为位移的量,relativeTo指基于什么坐标空间移动(World:世界坐标,Self:自身朝向)

SpriteRender

Sprite

Sprite “精灵图” 一词首次作为图形术语出现,是在德州仪器的9918(A)视频显示处理器上。使用“精灵图”作为术语,是因为精灵图并不是帧缓冲中位图数据的一部分,而是“悬浮”于帧缓冲中数据之上,不影响其中数据,就像精灵飘在上面一样。^^

在Unity中:png/jpg等常规图片,一般不在Unity中直接使用,而是转为Sprite

SpriteRender为用来渲染Sprite的渲染器

属性 功能
Sprite 定义该组件应渲染的精灵纹理。单击右侧的小圆点可打开对象选择器窗口,然后从可用精灵资源列表中进行选择。
Color 定义精灵的顶点颜色,用于对精灵的图像进行着色或重新着色。使用拾色器设置渲染的精灵纹理的顶点颜色。请参阅此表下方的颜色部分以查看示例。
Flip 沿选定的轴翻转精灵纹理。这不会翻转游戏对象的变换位置。
Sorting Layer 设置精灵的排序图层 (Sorting Layer),此图层用于控制渲染期间的精灵优先级。从下拉框中选择现有的排序图层,或创建新的排序图层。
Order In Layer 设置精灵在其排序图层中的渲染优先级。首先渲染编号较低的精灵,编号较高的精灵叠加在前者之上。
Sprite Sort Point 在计算精灵和摄像机之间的距离时,在精灵中心 (Center) 或其轴心点 (Pivot Point) 之间进行选择。

注:scale中x值改为相反数等于x轴翻转

音频系统

AudioClip

常见的音频格式Unity都支持,在Unity内都被包装为AudioClip类型

AudioListener

没有任何可以设置属性的,其代表音频的接受者,也就是听见声音的地方,因为声音是可以有空间感的,所以这个组件一般在相机上,这样声音结合画面符合玩家的体验。

AudioSource

音频源头,也就是发生声音的组件

  • Audio Clip:要播放的音频文件
  • Mute:是否静音
  • Play On Awake:在启动时是否立刻播放,如果禁用则脚本中使用Play()函数进行播放
  • Loop:是否循环播放
  • Volume:音量
  • Spatial Blend:3D引擎对声音的影响,如果0则是完全的2D音效,1则是3D音效,也就是声音是否具有空间感。