找回密码
 立即注册
查看: 295|回复: 0

Unity2D 入门教程

[复制链接]
发表于 2022-2-3 12:46 | 显示全部楼层 |阅读模式
Unity2D 入门教程

    常用操作
      通用操作
        游戏状态进行保存
      使用 TileMap 绘制地图实现碰撞体效果
        移动 Bug 的修复
      实现人物控制动画系统镜头控制
        脚本控制Cinemachine
      添加物品
        制作预制体

    代码理解

教程来源:B 站 Up 主的课程:Unity教程 入门第一款游戏制作
以下都是基于 2D 游戏

常用操作

通用操作

游戏状态进行保存

在游戏运行时修改 Inspector 中组件的参数,点击组件右上角,选择 Copy Componpent,
游戏运行结束后,点击组件右上角,选择 Paste Component Values,可以实现保存运行时的参数
使用 TileMap 绘制地图

TileMap 创建:Hirerachy > 右键 > 2D Object > TileMap
创建调色板:Window > 2D > Tile Palette
    将图片拖到调色板中即可变成 Tile 文件,然后可以用调色板的工具绘制地图
    Tile 文件可以存在 Environment 下新建一个 map 目录
每单位像素数 (Pixels Per Unit):选中精灵资源在 Inspetor 面板里会看到,表示在一个 Unity 单位中一行或一列有几个像素点
    如果瓦片拖到界面上后,瓦片之前有间距,可以调整这个参数
切割图集:选中一张精灵图片资源,将 SpriteMode 从 single 改为 mutiple,可制作成图集,再点击 SpriteEditor 可进行切割。
切割有三种形式:自动,按像素切割,按行列切割
    对于一张比较大的精灵图,我们拖到 Scene 上看似占用比较大的空间,其实只占用了一个格子,为了让它的实际占用很看起来一样大,需要将这张图切割成图集对于这种看似比较大的图片,使用按行列切割,切割成一个个小格子
实现碰撞体效果

Rigidbody:刚体组件,使游戏物体能获得重力,接受外界的受力和扭力功能的组件
BoxCollider:碰撞器组件,使游戏物体具有跟挂载刚体组件的游戏物体发生碰撞能力的组件
实现碰撞效果:给人物添加 Rigidbody 2D 和 Box Collider 2D 组件,给 Tilemap 添加 Tilemap Collider 2D 组件
不允许旋转效果:Rigidbody 2D > Constraints > Freeze Rotation
移动 Bug 的修复

如果给整个人物添加方形的 Collider,移动时会卡住,解决方案是下半身使用圆形的 Collider


实现人物控制

输入按键设置:Edit > Project Settings > Input Manager,这里可以更改各个轴向映射的按键
GetAxis获取 [-1, 0], [0, 1] 之间的小数:
  1. float horizontalMove =Input.GetAxis("Horizontal");
复制代码
GetAxisRaw 获取的是 -1, 0, 1 中的某个值
  1. float faceDirection =Input.GetAxisRaw("Horizontal");
复制代码
GetButton 可以检测到用户按下某个功能键,如 Jump - 跳跃
  1. if(Input.GetButton("Jump")){
  2.   rb.velocity =newVector2(rb.velocity.x, jumpForce *Time.deltaTime);}
复制代码
动画系统

打开动画面板:Window -> Animation -> Animation
    动画面板用于制作动画,将一系列图片拖进去做出动画效果
打开动画器面板:Window -> Animation -> Animator
    动画器面板用于关联各个动画之间的状态转换
添加动画效果
1、给游戏组件添加 Animator 组件
2、创建一个存放动画的文件夹,在文件夹里创建一个 Animator Controller,用于控制动画
3、将 Animator Controller 拖到 Animator 组件上
4、选中游戏组件,在动画面板,创建一个 idle 动画,并将动画图片拖入
实现跑动动画
1、创建一个 run 动画
2、在动画器面板,run 和 idle 之间创建过渡(make transition)
3、Parameters 中添加参数 running,float 类型
4、idle -> running 的过渡,将 Has Exit Time 去掉,Transition Offset 设为 0,Conditions 为 running > 0.1
running -> idle 同理,Conditions 为 running < 0.1
5、根据上面给过渡设置的 Conditions,在代码中用 animator.SetFloat() 给 running 赋值,来控制跑动动画
实现跳跃和降落动画
1、创建 jump 动画、fall 动画
2、在动画器面板,各个动画之间创建过渡(make transition)


3、Parameters 添加参数 jumping、falling,Bool 类型
4、过渡的 Inspector 中,将 Has Exit Time 去掉,Transition Offset 设为 0
往 jump 过渡的 Conditions 为 jumping = true;往 fall 过渡的 Conditions 为 falling = true
5、根据 Conditions,编写代码
  1. publicRigidbody2D rb;// 刚体publicBoxCollider2D coll;// 碰撞体publicAnimator animator;// 动画器publicLayerMask ground;// 地面图层...// 检查并切换动画状态voidSwitchAnim(){// 处于跳跃状态if(animator.GetBool("jumping")){// y轴的力没有了if(rb.velocity.y <0){
  2.       animator.SetBool("jumping",false);
  3.       animator.SetBool("falling",true);}}// 处于降落状态, 碰撞了地面elseif(coll.IsTouchingLayers(ground)){
  4.     animator.SetBool("falling",false);
  5.     animator.SetBool("idle",true);}}
复制代码
6、代码中的 public LayerMask ground 指的就是游戏物件所处的图层:


为了实现检测碰撞地面,需要给 Tilemap 设置一个图层 Group,并在代码中获取:


镜头控制

脚本控制

这个方法就是给 Main Camera 添加一个脚本,让它的 Transform 的 x、y 时刻与 player 保持一致即可
关于 y 是否需要保持一致主要看游戏需求,例如超级马里奥跳起来镜头不会动,恶魔城跳起来镜头就会跟随
  1. publicclassCameraController:MonoBehaviour{publicTransform player;voidUpdate(){
  2.         transform.position =newVector3(player.position.x,0,-10f);}}
复制代码
Cinemachine

首先在 Package Manager 中安装 Cinemachine,然后顶部菜单会多一个 Cinemachine
背景跟随
1、Cinemachine > Create 2D Cinemachine,创建一个 CM vcam 1 对象
2、将要跟随的游戏对象拖到 CM vcam 1 > Inspector 中的 Follow
Inspector 中的一些参数:
    Lens > Orthographic Size:调整镜头大小
    Body > Dead Zone:镜头不会跟随的一段区域,超出这个区域则会自动跟随

给背景限定区域
    CM vcam 1 > Inspector > Add Extension > Cinemachine Confiner
    需要给上面的组件指定一个 Collider,给 Background 添加 Collider(勾选 isTriger)
    这里使用 Polygon Collider
    CM vcam 1 > Inspector > Cinemachine Confiner > Bounding Shape 2D 指定为 Background 的 Collider
添加物品

在界面上添加游戏物件的方法
    创建一个 Sprites,将物品素材拖给它,记得修改对应的层级
给物品添加的动画效果
    给物体添加 Animator 组件,在文件夹中创建一个 Animate Controller 并拖到物体身上的 Animator 中在动画面板中创建动画效果
给物品添加碰撞销毁事件
    给物品添加 Box Collider 2D 组件,并勾选的 isTrigger
    不勾选 isTrigger 则像墙一样撞不动,勾选后可以进行一些触碰事件(配合 OnTriggerEnter2D 函数)
    给物体设置 Tag 为 Collection
  1. // 碰撞事件privatevoidOnTriggerEnter2D(Collider2D collision){// 如果碰撞到的物体标签是Collection,则销毁if(collision.CompareTag("Collection")){Destroy(collision.gameObject);}}
复制代码
制作预制体

创建一个 Prefabs 文件夹,将做好的 Cherry 物品拖到该文件夹中,后面就做好的物品为模版,反复创建其他物品(功能相同)
如果不使用 Prefabs,则每次新增一个物品都需要反复执行大量重复操作,有 Prefabs 只需要复制即可

代码理解

Time.deltaTime 代表两帧之间的时间差。
    脚本中的 update() 方法虽然是每帧运行,但实际运行时两帧之间的时间间隔不一定相等。
对于 Rigidbody、Collider 这种,几乎每个游戏物件身上挂载后是不会变的,因此可以不声明为 pubilc,再通过 Unity 中拖拽赋值,
可以直接声明为 private,并在代码中赋值。
[SerializeField] 可以使得 private 变量也显示在 Unity 中。
  1. [SerializeField]privateRigidbody2D rb;
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2025-5-12 09:15 , Processed in 0.135132 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表