【Unity开发实战】—— 2D项目1 - Ruby‘s Adventure 游戏世界中各个对象的交互(3-1)

简介: 【Unity开发实战】—— 2D项目1 - Ruby‘s Adventure 游戏世界中各个对象的交互(3-1)

1)食用指南


①前言

本项目的完整开发流程在Unity官方项目的教学文档中编写了详细的教程文档,但是因为官方文档距离现在已经有一段时间了,个别地方有错误或者读者在使用自己机器上的Unity 编辑器进行操作的过程中,仍然遇到了零零散散的问题,无法再和官方教程相对应,本博客是对官网提供的项目的再补充以及个人心得复盘和经验分享。


本系列博客是来源于官方教程但是最终绝对会高于官方教程,让读者综合官方教程以及我自己的升华,能够独立开发出一个比官方教程更加完整可行的游戏。

最终的开发结果,使用资源也会开源在GitHub以及Gitee。


②官方教程地址

【官方文档 —— 6、世界交互 - 阻止移动】

【官方文档 —— 7、世界交互 - 可收集对象】

【官方文档 —— 8、世界交互 - 伤害区域和敌人】


③如何处理本系列博客和官方教程之间的关系


个人建议是先大致浏览本系列专栏的博客,对注意事项和要点有个初步印象,再跟着官方文档逐步操作


因为本系列博客是对官方教程的修订,补充,升华,而且本系列博客的内容篇幅不会特别冗长,完整看完大概需要5 — 7 分钟。

假如只看文章的目录,留意需要订正的地方,那么大致只是需要1分钟左右。


2)具体步骤详细剖析


前排温馨小提示:

第六节 《世界交互 - 可收集对象》的教程中,几乎不需要再补充,可以完完整整跟着操作。因为我之前自行添加了和规则瓦片相关的知识,故我也只是补充规则瓦片的一点知识。


2.1)《6-1.什么是物理系统?》注意事项


Unity已经内置了一个模拟现实生活中物体移动或者碰撞的物理系统,我们需要做的是通过挂接2D 精灵的刚体物理组件Rigidbody 2D来使用这套物理系统。


记住:为避免对我们游戏中的每个对象进行成本高昂的数学运算,Unity 仅对附有 Rigidbody 2D 组件的游戏对象执行这些计算。


① Rigidbody2D —— 2D游戏中,主要用于维护物理系统

脚本API —— Rigidbody2D


2.2)《6-7.解决Ruby的旋转+9.解决抖动问题》常识积累


② BoxCollider2D —— 2D游戏中,处理轴对齐的矩形碰撞体的相关碰撞事件

脚本API —— BoxCollider2D


2.3)《6-12.添加瓦片地图碰撞》再补充


教程中详细讲述了经过分割之后(没有挂接生成规则的瓦片)如何在为整体添加Tilemap Collider 2D组件之后,再手动筛选出不需要碰撞的瓦片并去除相应碰撞的操作。


我这里会补充规则瓦片地图的碰撞去除 —— 核心思想是将瓦片精灵挂接的Collider取消


① 对于规则瓦片 —— 将 Collider 挂接的组件从精灵Sprite 改为 None

微信图片_20221020202056.jpg

更改完的效果:

微信图片_20221020202114.jpg

② 对于规则覆盖瓦片 —— Rule Override Tile 是无法修改精灵的碰撞模式,建议删除重制

微信图片_20221020202148.jpg

③ 对于规则覆盖瓦片 —— Advance Rule Override Tile 可以自行修改碰撞模式

微信图片_20221020202218.jpg


2.3)《6-13.优化瓦片地图碰撞体》常识积累


这个优化确实很实在的,我最初是漏做了,然后瓦片地图会出现类似这种的情况

image.png

至于假如出现瓦片地图在一闪一闪的的情况。

微信图片_20221020202337.png

原因的详细解释在世界设计 - 瓦片地图的第六点《6.使瓦片精灵适应网格》。

简单来说,原因是这种的:

在需要用于绘制地图的瓦片的Inspector窗口中,有Pixels Per Unit属性。我们想要完美填充,主要需要对这里进行设置。

微信图片_20221020202403.png

Pixels per Unit主要是告诉Unity,在地图中,一个单位(场景绘制中的一个方格)内应该填充的像素的数量。比如我上图中写的64,那么就是一个方格,给64个像素。

微信图片_20221020202429.png


那么Pixels per Unit这一栏的数值应该怎么设置了,这里需要分情况讨论。

① 对于单一瓦片精灵 —— 高度/宽度像素是多少,就设置为多少

提供的瓦片精灵的规格一般都是2的n次幂,比如16 x 16 、 32 x 32 或者 64 x 64,或者 256 x 256。

此时,规格是多少,就设置为多少。比如我举例的瓦片精灵规格是64 x 64 ,那么我在Pixels per Unit这一栏就设置为64,就能够实现完美的填充。


② 对于瓦片集 —— 需要计算

微信图片_20221020202442.jpg

目前我总结的计算式子如下:

64/192 = (Pixels per Unit这一栏的数值)/瓦片集像素

目前测试出来的效果;

image.png

2.4)《7-4.添加函数来更改生命值》钳制功能积累


③ Mathf.Clampc ——钳制功能

脚本API —— 常用数学函数的集合Mathf

微信图片_20221020202604.png

currentHealth = Mathf.Clamp(currentHealth + amount, 0, maxHealth);

钳制功能 (Clamping) 可确保第一个参数(此处为 currentHealth + amount)绝不会小于第二个参数(此处为 0),也绝不会大于第三个参数 (maxHealth)。

因此,Ruby 的生命值将始终保持在 0 到 最大生命值maxHealth 之间。


2.5)《7-7.什么是触发器?》触发器概念理解


在游戏中,一般是碰撞某个物体,最终实现加血或者扣血等情况,正是利用触发器实现的。

触发器时一种特殊的碰撞体,它并不会阻止我们的移动的,但是Unity附带的物理系统会检查游戏角色是否和该碰撞体发生触碰。倘若发生触碰,就会处理触碰之后的逻辑,一般是增加游戏角色的血量。

  //处理碰撞的逻辑
  void OnTriggerEnter2D(Collider2D other)
    {
        Debug.Log($"此时与加血草莓触发器发生碰撞的对象是{other}");
    }

④ OnTriggerEnter2D —— 当另一个对象进入附加到该对象的触发碰撞体时调用

脚本API ——OnTriggerEnter2D

当另一个2D碰撞器 other 和 挂接包含OnTriggerEnter2D方法的脚本的游戏对象(草莓) 发生碰撞时,调用这个方法。


⑤ Destroy—— 销毁 GameObject、组件或资源

脚本API ——Destroy


Destroy 是 Unity 的一个内置函数,可销毁作为参数传递给这个函数的任何对象;在此示例中为gameObject。即,将脚本附加到的游戏对象(可收集的生命值包)。


6、世界交互 - 阻止移动以及7、世界交互 - 可收集对象的补充这里就结束啦~。对于自己心目中的游戏地图,在这里开始设计是最好的。

微信图片_20221020202724.jpg

3)总结


向游戏对象添加碰撞体 —— 重要

添加瓦片地图碰撞 —— 重要

游戏角色碰撞时候发生旋转以及抖动问题的解决 —— 了解

文章中提到的5个常用API —— 积累


相关文章
|
8月前
|
小程序 PHP 图形学
热门小游戏源码(Python+PHP)下载-微信小程序游戏源码Unity发实战指南​
本文详解如何结合Python、PHP与Unity开发并部署小游戏至微信小程序。涵盖技术选型、Pygame实战、PHP后端对接、Unity转换适配及性能优化,提供从原型到发布的完整指南,助力开发者快速上手并发布游戏。
|
编译器 vr&ar 图形学
从零开始的unity3d入门教程(五)---- 基于Vuforia的AR项目
这是一篇Unity3D结合Vuforia实现增强现实(AR)项目的入门教程,涵盖了环境配置、Vuforia账户注册、Target数据集创建、Unity项目设置、AR程序配置、Android环境配置以及最终在手机上测试运行的全过程。
从零开始的unity3d入门教程(五)---- 基于Vuforia的AR项目
|
设计模式 存储 人工智能
深度解析Unity游戏开发:从零构建可扩展与可维护的游戏架构,让你的游戏项目在模块化设计、脚本对象运用及状态模式处理中焕发新生,实现高效迭代与团队协作的完美平衡之路
【9月更文挑战第1天】游戏开发中的架构设计是项目成功的关键。良好的架构能提升开发效率并确保项目的长期可维护性和可扩展性。在使用Unity引擎时,合理的架构尤为重要。本文探讨了如何在Unity中实现可扩展且易维护的游戏架构,包括模块化设计、使用脚本对象管理数据、应用设计模式(如状态模式)及采用MVC/MVVM架构模式。通过这些方法,可以显著提高开发效率和游戏质量。例如,模块化设计将游戏拆分为独立模块。
1100 3
|
开发者 图形学 API
从零起步,深度揭秘:运用Unity引擎及网络编程技术,一步步搭建属于你的实时多人在线对战游戏平台——详尽指南与实战代码解析,带你轻松掌握网络化游戏开发的核心要领与最佳实践路径
【8月更文挑战第31天】构建实时多人对战平台是技术与创意的结合。本文使用成熟的Unity游戏开发引擎,从零开始指导读者搭建简单的实时对战平台。内容涵盖网络架构设计、Unity网络API应用及客户端与服务器通信。首先,创建新项目并选择适合多人游戏的模板,使用推荐的网络传输层。接着,定义基本玩法,如2D多人射击游戏,创建角色预制件并添加Rigidbody2D组件。然后,引入网络身份组件以同步对象状态。通过示例代码展示玩家控制逻辑,包括移动和发射子弹功能。最后,设置服务器端逻辑,处理客户端连接和断开。本文帮助读者掌握构建Unity多人对战平台的核心知识,为进一步开发打下基础。
1084 0
|
开发者 图形学 Java
揭秘Unity物理引擎核心技术:从刚体动力学到关节连接,全方位教你如何在虚拟世界中重现真实物理现象——含实战代码示例与详细解析
【8月更文挑战第31天】Unity物理引擎对于游戏开发至关重要,它能够模拟真实的物理效果,如刚体运动、碰撞检测及关节连接等。通过Rigidbody和Collider组件,开发者可以轻松实现物体间的互动与碰撞。本文通过具体代码示例介绍了如何使用Unity物理引擎实现物体运动、施加力、使用关节连接以及模拟弹簧效果等功能,帮助开发者提升游戏的真实感与沉浸感。
1015 1
|
API 开发工具 vr&ar
PicoVR Unity SDK⭐️一、SDK下载、项目设置与程序初始配置
PicoVR Unity SDK⭐️一、SDK下载、项目设置与程序初始配置
|
存储 JSON 关系型数据库
【unity实战】制作unity数据保存和加载系统——大型游戏存储的最优解
【unity实战】制作unity数据保存和加载系统——大型游戏存储的最优解
1094 2
|
人工智能 定位技术 图形学
【unity实战】制作敌人的AI,使用有限状态机、继承和抽象类多态 定义不同状态的敌人行为
【unity实战】制作敌人的AI,使用有限状态机、继承和抽象类多态 定义不同状态的敌人行为
1218 1
|
图形学 C++ C#
Unity插件开发全攻略:从零起步教你用C++扩展游戏功能,解锁Unity新玩法的详细步骤与实战技巧大公开
【8月更文挑战第31天】Unity 是一款功能强大的游戏开发引擎,支持多平台发布并拥有丰富的插件生态系统。本文介绍 Unity 插件开发基础,帮助读者从零开始编写自定义插件以扩展其功能。插件通常用 C++ 编写,通过 Mono C# 运行时调用,需在不同平台上编译。文中详细讲解了开发环境搭建、简单插件编写及在 Unity 中调用的方法,包括创建 C# 封装脚本和处理跨平台问题,助力开发者提升游戏开发效率。
1855 0
|
开发者 图形学 C#
揭秘游戏沉浸感的秘密武器:深度解析Unity中的音频设计技巧,从背景音乐到动态音效,全面提升你的游戏氛围艺术——附实战代码示例与应用场景指导
【8月更文挑战第31天】音频设计在游戏开发中至关重要,不仅能增强沉浸感,还能传递信息,构建氛围。Unity作为跨平台游戏引擎,提供了丰富的音频处理功能,助力开发者轻松实现复杂音效。本文将探讨如何利用Unity的音频设计提升游戏氛围,并通过具体示例代码展示实现过程。例如,在恐怖游戏中,阴森的背景音乐和突然的脚步声能增加紧张感;在休闲游戏中,轻快的旋律则让玩家感到愉悦。
1035 0