Unity2D | 初学笔记

本文记录了一个Unity新手在制作2D像素游戏过程中的关键技术和遇到的问题,涉及Tilemap使用、动画管理、Cinemachine应用、物品收集、敌人消灭、角色物理、UI交互、AI设计、音频处理、2D光效及代码优化。作者分享了实用技巧和待改进之处,供后来者参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一次接触Unity,并且跟着视频资料做出了第一款2D像素游戏,因为还有很多不懂的地方,以及在学习过程中感觉有待优化的地方,所以想要通过这篇文章对自己进行一个总结,内容其实都是写给以后的自己。😜

在学习过程中呢,有收获,也遇到问题,这些呢,有可以分为编写代码类,和Unity使用类的


毕竟是初学,感觉还是收获满满的,在这里会选出个人感觉很实用很关键的方法,或者是在之后Unity学习过程中重复使用的方面,所以大多是很基本的知识,以扎实的过程记录。

这是一款简单的2D像素横板游戏,可以收集物品,消灭敌人,在移动上实现站立,跑动,下蹲,跳跃。
演示

Unity使用

1.Tilemap

  • 场景中的Tilemap如果有缝隙,调整Grid的CellSize,把X和Y都改成0.99
  • 如果想实现,地图上有的元素,例如草,标识牌等不需要碰撞体,那么可以创建多个Tilemap,分别画出地形,以及丰富地图的元素,前者正常添加Tilemap Collider2D,后者就不需要。
  • 实现单向平台。新建Tilemap,画出希望的单向平台,添加Tilemap Collider2D和Platform Effector 2D组件,同时勾选上Tilemap Collider2D中的Used By Effector

2.Animation

  • 添加组件Animator -> 创建AnimationController,拖动添加到Animator -> 打开Animation窗口,Create -> 拖动动画素材到在Animation窗口下,Smaples 设置动画速率 -> 若只执行一次动画,则点击动画,勾选Loop Time
  • 动画与动画之间的转换,去掉Has Exit Time(如果勾选了这一项,在动画转换时会等待当前动画播放完毕之后才转换到下一个动画,在这里是立即转换,所以不勾选),Transition Duration过度持续时间 (过度有多长)设置成 0

3.Cinemachine

  • 添加插件window-PackageManager-Cinemachine,请添加图片描述Dead Zone:图中最中间的矩形,锁定的人物会以一个黄点标记出,最终黄点会稳定在这个区域内
    Soft Zone:中部蓝色的区域,人物移动到这个区域内,镜头会缓慢跟随移动,尽量使人物回到中间的Dead Zone
  • 镜头的移动,不能超过地图的边界。对背景添加碰撞器:Polygon Colider2d (多边形),勾选isTriger防止角色和背景碰撞,摄像机添加扩展:Add Extension-Cinemachine Confiner,填入Polygon

4.收集物品

  • 2D Objec -> Sprite,修改Tag为收集物品的Tag,添加Box Collider 2D,勾选上is Trigger在代码中识别,如果任务触碰的碰撞器的标签是收集物品,则销毁游戏项目:Destroy(collision.gameObject);

5.消灭敌人

  • 与收集物品同理,需要添加消灭敌人的条件,即踩到敌人头上,(处在下落状态,碰到碰撞器的标签是敌人),在这里实体化一个Enemy类,调用里面的JumpOn()函数,播放敌人死亡的音效,打开死亡的开关,播放死亡动画,在动画的最后加入事件帧,在调用函数,销毁该敌人的游戏项目

6.角色摩擦

  • 因为创建了两个碰撞器,上部Box Collider 2D,下部Circle Collider 2D,如果是只有上部的碰撞器和地面的碰撞器接触,在给一个方向的力,就会有摩擦力。例如下图
    请添加图片描述所以需要新建一个物理材质Create -> Material,将其中的摩擦Friction设置为0,并添加到Box Collider 2D中

6.UI

  • 包括开始菜单,游戏暂停菜单,音量音效滑动条,编写脚本,挂载到Canvas上,比如按钮,On Click选择点击后的函数,在Menu中找到编写的函数
public void PauseGame()
    {
   
   
        pauseMenu.SetActive(true);
        //时间比例
        Time.timeScale=0f;
    }
  • 再比如音量的滑动条,修改最大和最小值[-80,0], Value Changed选择改变的值,在Menu中的Dynamic float选择编写的函数,这样改变的值就是当前Inspector中的Value
public void SetVolume(float value)
    {
   
   
        audioMixer.SetFloat("MainVolume",value);
    }

7.AI

  • 仅实现了敌人在规定范围内的活动。以青蛙为例,青蛙会在规定好的左右范围内进行反复运动,具体实现是给青蛙对象添加左右两个Object作为节点,当青蛙移动超过左右结点时,则会进行转向。

8.Audio Source
新建GameObject,重命名为SoundManager

  • BGM,添加模块Audio Source,将选定的BGM拖入AudioClip;在Project下新建AudioMixer;选择AudioSource的Output为Matser(新建的AudioMixer会自创建);打开AudioMixer窗口,选中Master,右键Volume,选择Expose ‘Volume (of Master)’ to script将该值修改为代码可以调用的参数,在Exposed Parameters中可以右键重命名该变量
  • 音效,添加模块Sudio Source,用来统一管理所有人物音效(受伤,跳跃,收集物品),编写脚本,添加各种音效为AudioClip,编写播放对应音效的函数,因为这是不同的脚本,为了函数调用的方便,将类实例化,就可以用实体直接访问类中的函数。
    public static SoundManager instance;
    public void Awake() 
    {
   
   	
        instance=this;
    }

例如:人物脚本中调用音效

	SoundManager.instance.CollectionAduio();

接着是在Audio Mixer中新建Groups,选择为音效的Output

9.2D光效
使用的是2018版本,如果是高版本的可以使用Universal RP

  • 首先是需要为地图添加材质,使地图变暗,可以接受并衍射光,这样添加光源之后,就可以实现照亮的效果,以地图为例,在Tilemap Renderer中可以选择预置的Default-Diffuse
  • 对于我们操控的人物,收集物品,敌人等,这些每次添加的2D项目渲染出来都是一个Sprites。需要新建材质,Creat -> Material -> Shader -> Sprites -> Diffuse 新建完成。拖进Sprites Renderer中的Material中,这样添加光源之后,人物等也会被照亮。
  • 如果有的光源失效,在Project Settings -> Quality -> Rendering ->Pixel Light Count 控制光源的数量,可以适当调整

C#代码

1.Update()和FixedUpdate()

  • FixedUpdate,是在固定的时间间隔执行(0.02s),不受游戏帧率的影响,通常在处理Rigidbody等物理有关的
  • Update,是在每次渲染新的一帧时会调用,这个更新的频率和当前设备的性能有关以及被渲染的物体,这样同一游戏在不同的机器上效果不一样。

2.跳跃(可适用多数2D横版游戏)

using UnityEngine;

public 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值