RPG 游戏开发(11)CSharp 继承
大家好啊,上个文章我们做了个基本的碰撞触发事件,但是只是输出了个 Debug.Log 那么这一章我们将详细地说怎么去实现一些效果,比如打开箱子获得物品。
那么首先我们就需要到我们的 Atlas 图块里把箱子的像素图切出来。打开 Sprite Editor,开始干活!首先,我们把之前弄好的褐色木箱子改名为 crate,而找到宝箱,他有六个图,我们选两个(一个空的,一个满的)使用即可。将满的命名为 chest_0,另一个为 1。裁剪好了之后点击 Apply。
然后将 chest_0 图块从 Project 面板拖到游戏场景 Scene 中随便一个位置(注意,不要贴着墙壁,因为墙面有 Collider 演示的时候会造成混淆),这时候你会发现只有一个框框,宝箱没看见。这是因为它的 Sorting Layer 在 Default,被地板当着了,所以我们新建一个 Sorting Layer 命名为 Interactable,将他的位置放在 Floor 和 Actor 之间,也就是在视觉效果里,看见该箱子在地板之上,在角色之下。
我们给 chest_0 添加一个 BoxCollider2D,然后把 Collidable 脚本也给他套上。这样当我们靠近箱子的时候,Console 就会源源不绝地显示出 player_0。测试好了之后,我们将挂在 chest_0 的 Collidable 脚本给去掉(右键,Remove Component)。
然后在 Script 文件夹里,创建一个新的 C# Script,将其命名为 Chest。然后双击打开
编程概念:继承
打开源文件之后,我们发现代码上写的一行 public class Chest : MonoBehavior
这是 Unity 提供的库,它包含了我们现在用的 RigidBody2D、Collider2D、GetComponent<>() 等一系列不是原生 C# 的代码。MonoBehavior 可以理解为 Unity 的核心架构。所以所有的脚本都继承 MonoBehavior 才能和 Unity 引擎进行交互。
在 Visual Studio 里,我们双击 MonoBehavior 这行字,然后点击 F12 就可以找到它的源码,然后检查里面所包含的函数和其他信息。然后发现 MonoBehavior 也继承了 Behavior,Behavior 也继承了 Component……。就是这一层层的继承,才能让你在开发中使用那么多不是原生 C# 的函数和对象。
在这里,我们需要将 Chest 原本继承的 MonoBehavior 改为我们写的 Collidable 类。所以现在的层级关系为:Chest < Collidable < MonoBehavior……
现在,我们清空我们的代码段,使其成为这样:
using System.Collections; |
将 Chest 脚本插入 chest_0 游戏物件里。
现在运行游戏,会发现拥有 Chest 脚本的箱子也会在玩家靠近时触发 Collidable 的代码。
那么我们是可以对这个 Debug.Log 进行改变的。因为我们在 Collidable 类里声明了 protected virtual OnCollide 函数,virtual 修饰符让你有机会覆盖重写该函数。
当我们在 Visual Studio 中输入 protected override 然后他就会自动提示你可以覆盖重写的函数。我们选择 OnCollide 函数,系统就会自动帮你补齐代码。
补齐的代码中,出现一行 base.OnCollide(collider); 语句,base 关键字指向的是父类,也就是说当调用这个函数的时候,可以调用父类声明的 OnCollide 函数。这里我们把这行语句删掉,然后直接写下箱子被角色碰撞到需要的行为。作为继承测试,我们先写上这么一句。然后运行,就会发现:Console 面板中输出的是我们覆盖重写之后的信息了。
using System.Collections; |
那么本章就聊到这里。主要讲解了 C# 的继承机制,以及概念。这篇比较深奥,有问题的小伙伴在下方评论区留言,我将会给予答复。