Unity初学2——瓦片的制作以及世界的交互(2d)

这篇具有很好参考价值的文章主要介绍了Unity初学2——瓦片的制作以及世界的交互(2d)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

该文来自学习chutianbo老师的笔记,链接b站第56P至71P

1.瓦片地图的制作

右键点击主界面Sence➡GameObject➡2D Object➡Tilemap➡Rectanglar(这样是创建了一个RPG式的视角)
创建tiles文件夹 将素材拖入右上角打开的紫色按键TIle Palette,将素材拖入
或者直接在文件夹中创建
2.素材过大需要分割怎么办
回到素材更改Sprite Mode为Multiple
进入Sprite Editor 选择左上角Slice 选择Grid By Cell Size
3.瓦片不符合边框
回到素材找到Pixels Per Unit将其改为64符合边框
4.关于瓦片盖住了角色
回到Hierarchy下的Grid下的tilemap找到右边的TIlemap Renderer更改order in layer为-10(图层放到后面去)
5.关于规则瓦片
在tile文件夹中右键Create➡2D➡Tiles➡Rule TIle(如果没有大概率是没有插件,直接寻找其他文章有教)
6.如何快速制作规则类似的瓦片
如上,选择rule Overring tile
7.如何使瓦片的碰撞体连在一起(原本我们制作好的瓦片都是单独的一个碰撞体)
在第四部中的tilemap中加入Composite Coillider 2D组件
在TIlemap Collider 2D中勾选 used by Compite即可;
8.关于规则类似瓦片的继承
直接继承规则类似瓦片的话,那么碰撞体是否也是继承的,所以如果存在碰撞体不同的情况下需要重新制作
9.伪透视的实现

在 2D 游戏中,场景里的 “前后” 是由 Y 轴决定的,需要让 Unity 根据游戏对象的 y 坐标来绘制游戏对象
Y 轴 y 坐标值越小,越靠前,应该遮挡 y 坐标值较大的游戏对象,也就是 y 坐标较小的游戏对象后绘制,就会位于上层
在游戏中,如果要设置 2D 伪透视试图,需要在项目设置中进行更改:
Edit > Project Settings > Graphics > Camera Settings > Transparency Sort Mode = Custom Axis > Transparency Sort Axis x = 0 / y = 1 / z = 0

所以我们使用的素材也要在Sprite Mode下的Sprite Edito中将轴心(个人认为是遮盖点)放在人物的脚底。

2 关于碰撞的实现

一个物体如果需要碰撞那么他一定拥有刚体组件即Rigidbody 2d(2d游戏中是这个)
同样的他如果需要和别的物件发生交互,那么他还需要碰撞体组件Box Collider 2D
2.1添加两个组件之后角色直接飞速下落
关闭刚体组件下的Gravity Scale(重力),将其设定为0即可;
2.2在2dRPG中为了透视效果最好将碰撞盒子设定在脚附近左右(大概身体1/3左右)

3为我们的角色增添生命系统

这十分的简单,在我们上节中为角色控制加入的脚本中加入

 public int maxHealth = 5;
  public int currentHealth;
      void Start()
    {
        //获得当前游戏对象的刚体组件
        rigidbody2d = GetComponent<Rigidbody2D>();
        //初始化当前生命值
        currentHealth = maxHealth;

    }

3.1直接将我们游戏运行中重要的生命数值暴露出来是十分危险的,这种数值不应该直接被外部调用
所以我们需要对currentHealth进行封装。即用属性去保护其内部的字段

int currentHealth;
  public int Currenthealth
  { get { return currentHealth; } }
  //set { currentHealth = value; } }

这样我们就做好了简易的生命系统

4 世界的交互

在有了生命系统之后,生命会因为玩家的操作而进行变更,所以我们要加入玩家生命变更的函数

public void changehealth(int amount)
  {
      //限制生命值在0到maxhealth之间
      currentHealth = Mathf.Clamp(currentHealth + amount, 0, maxHealth);
      Debug.Log("当前生命值:" + currentHealth + "/" + maxHealth);
  }

这里我们使用了unity自带的Math.Clamp函数,这样可以将血量限制在0到最大血量之间
链接官方文档:Math.Clamp
4.2那么在有了这个函数之后,我们就可以在创建的世界上设置血瓶或者掉血的陷阱了,那么下面的代码实现了吃掉一个血瓶为玩家回一滴血,同时在满血时不吃血瓶,以及吃掉血瓶之后血瓶消失的功能

  public class Healthcollable : MonoBehaviour
{
 //记录碰撞次数
 int collideCount;
 public int amount=1;
private void OnTriggerEnter2D(Collider2D other)
 {
     collideCount += 1; 
     Debug.Log($"和当前物体发生碰撞的是{other},第{collideCount}此碰撞");
     //获取Ruby对象
     RubyController rubyController = other.GetComponent<RubyController>();
     //检测是谁碰撞了血瓶
     if (rubyController != null)
     {
     //如果Ruby不是满血
         if (rubyController.Currenthealth < rubyController.maxHealth) {
             rubyController.changehealth(amount);
             //消失血瓶
             Destroy(gameObject);
         }
         else
         {
             Debug.Log("Ruby不需要加血");
             Debug.Log("当前生命值:" + rubyController.Currenthealth + "/" + rubyController.maxHealth);
         }
     }
     else
     {
         Debug.Log("非Ruby对象");
     }
 }
}

OntiggerEnter2D函数是进入时只触发一次的函数;
4.3那么同理我们在设置一个碰到会掉血的区域

public class Damageable : MonoBehaviour
{
 
 //掉血量
 public int DamageNum = -1;
 //进入范围触发一次
 private void OnTriggerStay2D(Collider2D collision)
 {
     RubyController rubyController = collision.GetComponent<RubyController>();
     if (rubyController != null)
     {

         rubyController.changehealth(DamageNum);

     }
     else
     {
         Debug.Log("非Ruby对象");
     }
 }
 //每一帧都会触发

}

OnTriggerStay2D是在碰撞体中每一帧都会触发的函数,这样子我们会发现角色掉血量太快了,几乎在瞬间血量就清空了。
所以我们给角色添加一个收到伤害后短暂无敌的功能

 //设置无敌间隔
 public float timelnvincible = 2.0f;
 //设置是否无敌
  bool islnvincible;
 //定义变量,无敌进行时间(计时器)
 float invincibleTimer;

在update中加入对无敌的检测(事实上个人认为每一帧都对这个函数进行检测好像不太合理)

  void Update()
 {
     //无敌时刻进入倒计时
     if (islnvincible)
     {
         invincibleTimer -= Time.deltaTime;
         if (invincibleTimer < 0)
         {
             islnvincible = false;
         }

     }
 }

在上面写的更改生命的函数中加入无敌的代码段

 //更改生命值
 public void changehealth(int amount)
 {
     if (amount < 0)
     {
     //如果无敌,那么直接跳出函数,否则玩家进入无敌,计时开始
         if (islnvincible)
         {
             return ;
         }
         islnvincible = true;
         invincibleTimer = timelnvincible;
     }
     //限制生命值在0到maxhealth之间
     currentHealth = Mathf.Clamp(currentHealth + amount, 0, maxHealth);
     Debug.Log("当前生命值:" + currentHealth + "/" + maxHealth);
 }

本文仅是个人记录初步学习unity所用
链接老师的文档:瓦片世界文章来源地址https://www.toymoban.com/news/detail-408718.html

到了这里,关于Unity初学2——瓦片的制作以及世界的交互(2d)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • unity的2d屏幕坐标转3d世界坐标

    1.使用ScreenToWorldPoint将获取的屏幕位置直接转成世界坐标:      坑1:获取的屏幕坐标Input.mousePosition是一个2d坐标,z轴值为0,这个z值是相对于当前camera的,为零表示z轴与相机重合了,因此给ScreenToWorlfdPoint传值时,不能直接传Input.mousePosition,否则获取的世界坐标永远只有一个

    2024年02月17日
    浏览(41)
  • UNITY—2D游戏制作入门!

    Unity作为当今最流行的游戏引擎之一,受到各大厂商的喜爱。 像是炉石传说,以及逃离塔克夫,都是由unity引擎开发制作。 作为初学者的我们,虽然无法直接做出完成度那么高的作品,但每一个伟大的目标,都有一个微不足道的开始。让我们从一个2D小游戏入手,来学习Unit

    2024年02月04日
    浏览(52)
  • Unity 关于制作一个2D的小地图

    实际效果:   需求:1.实现右上角小地图,实现同步本地地图           2.实现小地图内的角色图标和实际角色同步 实现原理: 1.在所需要的地图上划分为一下结构 图层Tilemap6_Minimap的Layer为Minimap 同时这里说一个问题,在同层级的图片,序列越晚渲染越上层 2.使用另一个摄像

    2024年02月14日
    浏览(39)
  • Unity学习笔记(7) Unity2D骨骼动画制作流程

    用骨骼动画最大的好处就是方便之后做换装系统。 无论对3Dor2D游戏都是这样的。 这篇博文记录一下2D骨骼动画的制作流程,参考b站麦扣的系列教程: https://space.bilibili.com/370283072/channel/seriesdetail?sid=211996 用PS做一个将人物各个部件(骨骼)都分解开来的人物模型。 导出时注意

    2023年04月09日
    浏览(54)
  • Unity制作Live2D(一)模型导入

    目录 序言 前期准备  导入模型 在许多游戏当中,Live2D展现出来了优秀的游戏体验,通过Live2D效果,让平面的游戏人物看起来更加生动,玩家也会感受到更多乐趣。 前往Live2DCubism官网下载Unity需要的SDKCubismForUnity,导入资源包到Unity中,可以不导入Sample样例。下载想要使用的

    2024年02月04日
    浏览(38)
  • unity+live2d制作galgame框架

    安装unity【free版即可】 unity下载 下载live2d for unity的sdk cubism-sdk下载 unity创建2d项目并导入sdk(直接奖sdk拖入package并点击import) 默认的2d模板只有一个主相机,我们可以先增加两个cavas,作为前景和背景的画板 live2d的模型由sdk自己绘制,不需要新增canvas 两个canvas分别命名为Canva

    2024年02月05日
    浏览(40)
  • 使用Unity3D制作2D游戏的重点做法

    官网上有提供一个 2D游戏的教学范例 ,这个游戏只不过把镜头摆放在横向位置跟随角色移动,游戏内物件运动时固定一个轴不动,使他像横轴式的2D游戏来玩,本质上其实还是个3D游戏,所以如果没有3D建模的话不就没办法做2D游戏了?其实这些并没有定论,就看制作者如何运

    2024年02月11日
    浏览(58)
  • 在Unity中简单地制作一张2D地图并随机生成资源

    这个作业属于哪个课程 软件工程2022年春-F班 这个作业要求在哪里 软件工程实践总结个人技术博客 这个作业的目标 课程回顾、个人技术总结 其他参考文献 《构建之法》 1.1 技术使用场景   你不满足于别人提供的现成的地图,想要利用原有的素材来将你自己的想法实现吗?

    2023年04月08日
    浏览(43)
  • 【unity】制作一个角色的初始状态(左右跳二段跳)【2D横板动作游戏】

            hi~ 大家好!欢迎大家来到我的全新unity学习记录系列。现在我想在2d横板游戏中,实现一个角色的初始状态-闲置状态、移动状态、空中状态。并且是利用 状态机 进行实现的。         本系列是跟着视频教程走的,所写也是作者个人的学习记录笔记。如有错误请联系

    2024年02月04日
    浏览(46)
  • 【unity实战】随机地下城生成4——小地图的制作(2d,3d通用)(含源码)

    参考原视频链接: 【视频】:https://space.bilibili.com/370283072 注意 :本文为学习笔记记录,推荐支持原作者,去看原视频自己手敲代码理解更加深入 新建一个摄像机,用来查看小地图,我们分个图层只能新建的摄像机才可以拍摄到 如果对摄像机和渲染纹理还不理解的,强烈推

    2023年04月21日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包