学它丫的游戏引擎

前言

做此笔记,记录一下Unity的学习过程,也算是一种变相的监督。

Unity简介

一个跨平台的游戏引擎,使用C#编写游戏逻辑,内置物理引擎(碰撞、刚体、布料)。

资金或年收入20w美金以下的开发者(企业)使用personal版本是免费的。

竞品有最近比较火热的开源引擎Godot

Unity官方有不少免费教程(或者收费教程也有),这里我将学这个入门 Ruby’s Adventure:2D 初学者

img

专有名词

  • Texture Type:纹理类型,比如Sprite(2D and UI)就是一种纹理类型
  • Sprite:精灵,通常是一张图片经由Unity处理后得到的一个可绘制的对象

主要组成

编辑器

  • Scene:实时的场景编辑器,支持拖拉拽。
  • Hierarchy:与Scene联动,它将Scene中的所有游戏对象以目录树方式展现出来。
  • Project:管理当前项目中的所有Resource,包括图像、音频、scene、C#脚本等。
  • Console:看运行日志的地方。
  • Game:可以理解为预览,玩家视角。
  • Inspector:管理游戏对象、Resource等的属性的面板。
  • Animator:在这里编排动画

Sprite

精灵是在游戏中绘制的图像。Unity 无法使用你直接为 Ruby 导入的 .png 图像文件,而是需要将此文件转换为可使用的格式。

image-20250621105418651

精灵可以选择sprite mode,用single或者multiple(还有个polygon不知道是啥),选multiple的时候可以在Sprite Editor中自由裁剪图像而产生多个sprite

Input Manager

Unity帮忙封装了一下input,将键盘、鼠标、手柄等设备输入的信号封装成可以直接使用的UnityEngine.lnput对象。

核心概念:

  1. 输入轴(Input Axes)

    将物理输入(如键盘按键、手柄摇杆)映射为逻辑上的“轴”,输出一个 [-1, 1] 范围内的值,渐进的

  2. 输入类型

    按键 Key:键盘上的物理键,比如空格键、shift键

    按钮 Button:手柄、触摸屏上的按键

    鼠标/摇杆轴 Mouse/:连续输入

image-20250621163926416

Tilemaps - 瓦片地图

世界设计。瓦片地图将世界作为一个网格,你可以在其中为每个网格单元格设置不同的精灵

image-20250621224357244

Tile Palette

美taɪl 美ˈpælət

瓦片调色板,一个可视化工具,管理瓦片,可以用它来绘制Tilemap。

可以根据自己喜好,调整Tile Palette的布局(即绘制调色板,注意不是绘制tilemap)

image-20250623222000604

Order in Layer

层显示优先级

可以通过修改sprite renderer的该属性来控制game object的显示优先级,数值越大,优先级越高,与其他低优先级的game object重叠时覆盖在上方。

如果game object的layer order相同呢?

这时候根据Camera Settings来决定谁覆盖谁,比如下面配置是根据game object的y轴(垂直方向)来绘制,也就是谁y属性值更小,谁更应该在“前方”。

image-20250623230534960

那么问题又来了,这个y属性值怎么来的,它的参考系是?

有两种方案,一个是取sprite的center,另一个是取sprite的pivot(轴心)

image-20250623231130017

pivot默认是取底部中心,当然也可以自定义pivot位置。通过sprite editor可以直接修改。

image-20250623231518484

预制件

Game Object也可以拖到Assets里,作为预制件。即一个Game Object模板,可以快速创建同类型的对象。

如果需要批量修改,只需要编辑这个预制件就行!所有Game Object会一起更改!

比如我修改了预制件的scale,三个Game Object都一起变肥了。

image-20250625220724604

物理系统

Rigidbody

  • Mass 质量
  • gravity 重力
  • Linear Drag 线性阻力(空气阻力),直线运动阻力
  • Angular Drag 角阻力,旋转运动阻力

Box Collider 2D

定义一个长方形碰撞器,刚体!

也可以设置Is Trigger,碰撞时只产生事件不产生碰撞效果,以此达到陷阱效果。

甚至连Tilemap也可以添加Box Collider!

Animator

用于控制Game Object的动画,给Game Object添加Animator组件后,可以让其获得动起来的能力。

关系:Game Object → Animator Component → Animator Controller → Parameters & Blend Tree → Motion(Animation Clips) → 可以用Sprite制作由一帧帧图片组成的动画

还可以在C#脚本中,获取animator组件对象,并且修改其定义的Parameters,以此控制动画。

1
2
animator = GetComponent<Animator>();
animator.SetFloat("move x", 0);

Parameter控制Blend Tree

在Blend Tree(状态树)中,可以有多个Motion(运动),2D的Animation里有Pos X和Pos Y两个坐标,可以选取自定义的Parameter与之绑定,如下图:

image-20250702225913449

定义过渡(转变时机)

可以在Animator中定义不同Blend Tree之间转换时的过渡动画,即下方白色的箭头线。

image-20250702230400666

比如C#中控制Game Object由Idle转变为Moving状态时,会经历一次Idle→Moving的过渡动画。

或者直接在过渡动画中用Parameters设定Conditions,当满足条件时,会触发Blend Tree切换。如果Conditions是空,那应该会直接切换。

image-20250702230857044

Cinemachine

普通的Camera对象是一个静态摄像机,如果需要镜头追随,则需要使用Cinemachine包。

image-20250703224439855

在Scene中添加新的Cinemachine后,会自动给Main Camera添加一个CinemachineBrain组件,并关联到Cinemachine对象。

可以添加多个Cinemachine对象(其实都是virtual camera),然后设定其Status为Live或standby。

Cinemachine可以设置边界(绑定一个Collider 2D对象),需要注意给它设置一个不会跟其他Game Object冲突的Layer层。

C#

跟Java很类似,都是面向对象编程。

public暴露的参数,除了基础类型的变量,也可以传入Game Object,比如给玩家sprite传入一个武器prefab,然后在脚本中就可以直接动态实例化该prefab了。

controller

UnityEngine

  • transform:对应游戏对象的Transform组件,可以控制对象的位置

MonoBehaviour

  • Start():仅在首次调用Update方法前调用。
  • Awake():创建对象时会立即调用。
  • Update():每一帧都会调用
  • FixedUpdate():调用的时间频率是固定的(默认0.02秒一次),独立于帧率。
  • OnCollisionEnter2D:当此碰撞器/刚体开始接触时调用(仅限 2D 物理)

对象销毁

Destroy方法

image-20250629224347006