Unity2D
使用的Unity版本为2022.2.2f1c1
开始
1.下载unity并与visual studio配对
下载unity并创建project
下载visual studio选择unity组件
unity->Eidt->Preferences->Analysis->External Tools->External Script Editor:Microsoft Visual Studio 2022 配置unity编译器
unity恢复默认布局:Unity编辑器的最右边顶部标签栏(通常是"Layout"等标签),然后选择"Default"选项,即可恢复默认布局。
2.导入素材
下载或自制素材,可以直接将文件夹拖入unity下方project->Assets->新建文件夹 下面
Scene->Shading Mode (通常是环形或球形的图标) 选择 Shaded 为了看见素材
绘制人物和场景
1.多人物图集进行切割
选择图片,右侧Inspector里进行操作
(1)图片转换为像素风格
Sprite Mode选择 Multiple
Pixels Per Unit选择 16
Filter Mode选择 Point(no filter)(达成像素效果)
Compression选择 None
Apply 进行应用,Sprite Editor可以浏览图片
(2)切割图片
点击Sprite Editor->slice 选择切割方式
Tpye选择 Grid by Cell Count (按行列进行切割)(一般切人物等每个大小相同的物品)
Column & Row选择 C(列数) R(行数)(可以预览是否正确)
Pivot选择 Bottom(以脚底为锚点方便之后调整位置)
Slice 进行切割
2.场景图集进行切割和应用
选择图片,右侧Inspector里进行操作
(1)图片转换为像素风格 (与人物图一致)
Sprite Mode选择 Multiple
Pixels Per Unit选择 16
Filter Mode选择 Point(no filter)(达成像素效果)
Compression选择 None
Apply 进行应用,Sprite Editor可以浏览图片
(2)切割图片
点击Sprite Editor->slice 选择切割方式
Tpye选择 Grid by Cell Size (按大小进行切割)(一般切场景,大小不相同)
Pixel Size选择 X 16 Y 16
Pivot选择 Center
Slice 进行切割
(3)绘制场景
Window->2D->Tile Palette 调色盘
Create New Palette,取名(例:forest),create
位置选择 Assets->新建文件夹 Tilemap (专门放瓦片)->新建文件夹 palette (放场景调色盘)
将之前切好的场景图片拖入forest调色盘
位置选择 Assets->Tilemap (专门放瓦片)->新建文件夹 tiles
Hierarchy-> + ->2D Object->Tilemap->Rectangular 方形瓦片地图,取名 tilemap1
Tile Palette目标选择 tilemap1
用调色盘forest里的块在tilemap1进行绘制,有笔刷,橡皮,还可以在Edit->Tile Palette中增加镜像等功能
窗口名字后面有 * 意味着修改后没有保存:使用Apple或ctrl+s进行保存
3.人物场景的显示优先级
选择人物或场景可以在Sorting Layer 里选 Add sorting Layer 添加图层,Layer越大,优先级越高,每个图层也可以根据不同的Order in layer再分为多个层次,Order in layer 默认为0,越小优先级越低,越在后面
选择场景tilemap1->Tilemap Renderer 组件->Sorting Layer 选择图层,Order in layer 选择图层内顺序
选择人物char_1->Sprite Renderer 组件->Sorting Layer 选择图层,Order in layer 选择图层内顺序
在创建tilemap1时默认创建在Grid下,可以在Grid下创建更多Tilemap,用来画不同层次的场景
4.特殊场景的显示
(1)规则场景
在Assets->Tilemap->tiles下新建文件夹rule tiles
rule tiles中创建2D->Tiles->Rule Tile,命名(例:ground1),选择默认图片Default Sprite (有代表性的图片)
可以为需要创建规则的每一小块图片命名(例:ground1_1),方便查找
根据图片的相对位置设置规则,如下图:
优先级高的规则放前面

将规则ground1拖入调色盘forest,即可利用规则进行绘制
(2)动态场景
在Assets->Tilemap->tiles下新建文件夹animated tiles
animated tiles中创建2D->Tiles->Animated Tiles,命名(例:waterfall),选择动画图片数量,将需要动态的图片依次进行选择
可以为需要创建规则的每一小块图片命名,方便查找
将规则waterfall拖入调色盘forest,利用规则进行绘制
构建物理效果
1.设置人物组件
将之前切好的人物图片拖入Hierarchy,命名(例:player)
添加组件
(1)Rigidbody 2D
设置物体,在Constraints处选择冻结旋转:选择Z
(2)Capsule Collider 2D
设置胶囊碰撞体,选择Edit Collider调整胶囊大小和位置,使其包裹人物
解决人物贴在墙面的问题 :
在Settings->新建文件夹 PhysicsMaterial 并创建2D->Physics Material 2D,命名(例:Normal),将Friction摩擦设为0,在player->Capsule Collider 2D->Material 选择Normal
2.设置地面组件
选择Grid->tilemap1 (地面的那一层)
添加组件
(1)Rigidbody 2D
Body Type选择 Static 静态
(2)Tilemap Collider 2D
(3)Composite Collider 2D
返回Tilemap Collider 2D组件勾选 Used By Composite,使所有瓦片合为一个碰撞体
3.设置输入
在Edit->Project Settings->Player->Other setting->Configuration->Api Compatibility Level选择 .NET Frammework,Active Input Handling选择 Input System Package (New),重启Unity
然后在Window->Package Manager->Packages选择 Unity Registry,搜索Input System并下载
在人物player的组件中添加 Player Input,Create Actions,位置选择Assets->Settings->新建文件夹 Input System,命名(例:Player Input Control),这个System可以直接在代码中调用,所以移除player的 Player Input 组件,在 Player Input Control 中勾选 Generate C# Class
4.设置人物动画
(1)创建动画
在Assets->新建文件夹 Animations->新建文件夹 Player
Player中创建 Create->Animator Controller,命名(例:Player),人物player的组件中添加 Animator,并将新建的 Animator Controller 拖到 Controller 处
在Window->Animation下打开 Animation 和 Animator
选择 Hierarchy->player 在Animation窗口创建动画命名为 Idle,保存位置为Animations下的新建文件夹 Player,将切割的Idle图片拖入Animation窗口,选择合适的Samples,播放进行调整,Preview还原初始状态
(2)动画间的切换
在创建的两个动画(例:Idle和Run)之间进行切换,在Animator窗口中,从Idle到Run右键 Make Transition 连一个箭头,左侧Parameters按 + 创建切换条件,选择类型(例:float),命名(例:velocityX),数值设为0,有向箭头在Inspector处增加条件:Condition增加velocityX,Greater,0.1 (一个小数更容易判断),像素风格可以取消 Has Exit Time,并在 Transition During 和 Transition Offset 都选0 (取消动画之间转换的时间)
5.多种人物动画的切换
(例:人物的3种攻击切换)
(1)创建动画
利用图片进行切割,并创建3段动画,分别命名(例:Attack1, Attack2 , Attack3),在Animator窗口中的Layers下创建新的层,命名(例:Attack Layer),Weight设为1,右键 Create State 创建默认状态 New State,再将3个动画拖入,排布整齐
Animator->Parameters-> + 增加bool类型状态,命名(例:isAttack),增加Trigger触发器,命名(例:Attack)
按下图右键 Make Transition 连接箭头:
New State->Attack1 取消 Has Exit Time 勾选,Transition During 和 Transition Offset 都设为0,Condition增加 isAttack-true 和 attack
Attack1->Attack2,Attack2->Attack3 的 Has Exit Time 在Settings下设为0.9,Transition During 和 Transition Offset 都设为0,Condition增加 isAttack-true 和 attack
Attack1->Exit,Attack2->Exit,Attack3->Exit 的 Has Exit Time 在Settings下设为1,Transition During 和 Transition Offset 都设为0,无Condition
(2)添加攻击按钮
在Assets->Settings->Input System中选择PlayerInputControl,进行 Edit asset,在Action-> + 中增加Attack,按键设置为 J[Keyboard],Save Asset后关闭

(3)编写攻击代码
csharp
//控制player的行为的类
public class PlayerController : MonoBehaviour
{
//PlayerInputControl是InputSystem在C#的自带类名
public PlayerInputControl inputControl;
//PlayerAnimation是控制player动画的类
private PlayerAnimation playerAnimation;
//判断状态是否在攻击
public bool isAttack;
//在Start之前执行
private void Awake()
{
inputControl = new PlayerInputControl();
playerAnimation = GetComponent<PlayerAnimation>();
//检测到按攻击键则执行PlayerAttack方法攻击
//Player是Action Maps的名字,Attack是Action的名字,见上图
inputControl.Player.Attack.started += PlayerAttack;
}
private void PlayerAttack(InputAction.CallbackContext obj)
{
playerAnimation.PlayAttack();
isAttack = true;
}
}
csharp
public class PlayerAnimation : MonoBehaviour
{
private Animator anim;
private PlayerController playerController;
private void Awake()
{
anim = GetComponent<Animator>();
playerController = GetComponent<PlayerController>();
}
private void Update()
{
SetAnimation();
}
public void SetAnimation()
{
//将playerController中是否攻击的状态传给动画的条件判断
anim.SetBool("isAttack", playerController.isAttack);
}
public void PlayAttack()
{
//attack是(1)中Condition的触发器名字
anim.SetTrigger("attack");
}
}
(4)攻击动画完善
需要在攻击动作退出时( 进入Exit时 )将PlayerController中的 isAttack 改为false
选择Animator窗口中的Attack1,选择 Add Behaviour 添加新代码,命名为AttackFinish,其中已经写好了函数体,去除相应部分的注释,完善代码
csharp
override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
animator.GetComponent<PlayerController>().isAttack = false;
}
6.多段攻击判定
在Player下面创建 Create Empty,命名为Attack area, Attack area下再创建3个 Create Empty,分别命名:Attack1,Attack2,Attack3
在Attact1的组件中添加 Polygon Collider 2D 多边形碰撞体,勾选 Is Trigger,以动画中攻击的那一帧为参考编辑碰撞体形状 Edit Collider,在 Layer Overrides->Contact Capture Layers 选择Enemy
在Animation中选择Attack1动画,选择 Add Property->Attack area->Attack1->Game Object.ls Active,并在攻击的那一帧勾选,其他帧取消勾选,播放来检查是否正确
在Attact1的组件中继续添加 Attack脚本
Attack2,Attack3进行相同操作
创建UI
创建人物状态栏
在Hierarchy窗口创建UI->Canvas 画布,unity会自动创建EventSystem,选择EventSystem,在感叹号下选择 Replace with InputSystemUllnputModule,并在替换后的 Actions Asset 选择之前创建的输入系统 PlayerInputControl
在Game窗口的 Free Aspect 选择一个固定的比例(例:Full HD 1920*1080),选择刚创建的Canvas->Canvas Scaler,UI Scale Mode 选择 Scale With Screen Size,Reference Resolution 选择 X 1920 Y 1080,Reference Pixels Per 选择16
血条框和血条
Scene中进行缩小使画布在屏幕中,在Canvas下创建UI->Image,命名(例:Health Frame),点击Rect Transform下的方块,选择以左上顶点为参考点的方块,选择方块同时按Alt+Shift,即可将图片移到参考点,在Health Frame->Image->Source Image选择切割好的图片(自动切割,人工调整),选择表示血条框的图片,在 Rect Transform 下调整位置和长度Width,高度Height
用上面的方法创建新的Image显示血条,增加步骤:Image->Image Type选择Filled 填充,Fill Method选择Horizontal,使血条可以横向进行填充
为血条框和血条创建一个父类,命名(例:Health Bar),可以拖拽父类来同时移动其所有子类
头像
在Canvas下创建UI->Image,命名(例:Face Frame),按上面的方法创建一个头像框,Face Frame下创建子类Cut,Cut下再创建子类Face,Face选择人物图片,调整位置使人物头部位于头像框内,Cut添加组件Mask,勾选 Show Mask Graphic,即可从人物中切割出头像
Canvas下的一列Image有显示优先级:后创建的Image(在列表下面的位置)会优先显示,可以拖拽Image改变列表相对位置来改变优先级
常用功能
摄像机跟随
在Window->Package Manager->Packages选择Unity Registry,搜索Cinemachine,下载
在Hierarchy窗口创建Cinemachine->Virtual Camera,将Player拖入 Virtual Camera->CinemachineVirtualCamera 下的Follow和Look At
场景管理
1.在Package Manage: Unity Registry里下载Addressables,下载完成后在Window->Asset Management->Addressables->Groups打开,并Greate Addressables settings,可将所有Scene的addressable勾选,用于管理和打包,addressable也可打包预制体
背包系统
主要由3部分组成,具体步骤可参考这个文章
