Unity2D游戏制作

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部分组成,具体步骤可参考这个文章

相关推荐
nnsix2 小时前
Unity 动画 Avatar 笔记
笔记·unity·游戏引擎
拾忆丶夜3 小时前
unity 热力图学习
学习·unity·游戏引擎
小贺儿开发4 小时前
Unity3D 旋钮交互视频控制系统 1.0
unity·人机交互·视频·配置文件·videoplayer·输入系统·角度
资源分享助手5 小时前
飞车端游26年5月最新马年限定车单机版下载和教程(含最新至尊踏月皮肤/创世女娲/T3机甲)
游戏
winlife_5 小时前
在 Unity Editor 里跑 HTTP MCP server:主线程边界与请求 marshal 的实现要点
http·unity·游戏引擎·多线程·mcp
阿松爱学习9 小时前
【Unity开发】Rigidbody中Body Type属性
unity·游戏引擎·unity开发
winlife_10 小时前
AI 怎么验证 Unity PlayMode 行为:截图 + 输入模拟的完整闭环
人工智能·unity·游戏引擎·ai编程·claude·playmode
数智工坊11 小时前
【深度学习RL】DQN:深度强化学习的里程碑——让AI从像素中学会玩Atari游戏
论文阅读·人工智能·深度学习·游戏·transformer
2601_9560028112 小时前
gta侠盗猎车手5 2026最新绿色破解版免费下载 pc版 手机版通用
游戏·智能手机·游戏程序·团队开发·游戏美术·数字雕刻·关卡设计