接口,一开始我一直把接口、抽象类、委托、事件视为非常深奥的东西,从来没有在Unity脚本中使用过。 其实在实际使用过一次之后,我开始发现这些东西其实很简单。
想必很多人都了解接口的语法,但是必须强调一下,C#只能继承一个类,但是可以有多个接口。 该界面易于使用,但请勿滥用。
脚本名+分号+继承类+接口
用最简单的例子来说明接口的使用。
在游戏场景中,我们通常会遇到一种不可破坏的物体和另一种可破坏的物体,比如盒子一击就碎,油桶一碰就爆炸。 那么使用unity来实现游戏交互时我们应该怎么做呢? 一般来说,打击有两种方式:射线或碰撞。 对于我来说unity射线检测检测不到物体,我较少使用射线(因为它消耗大量性能,所以我尽量不使用射线。如果使用它们,它们基本上是永久场景射线游戏角色,而不是不断生成的射线),所以我使用碰撞。 我们的子弹或者剑是通过附加Collider来与敌人碰撞的,那么我们如何让子弹或者剑检测到它们碰撞的物体呢?
我用得最多的写作方法:
获取标签是否为Enemyunity射线检测检测不到物体氛围,然后获取脚本EnemyMove
这是我之前做碰撞检测用得最多的写法。 你能想到这里有什么问题吗? 先想一想,然后再往下看。
如果我的场景中只有两个物体,玩家和敌人,那么毫无疑问,这种写法其实很好,但问题是,如果以后我想添加更多的物体该怎么办? 比如刚才提到的油桶和盒子,我们还需要继续写更多的标签==“油桶/盒子”吗? 如果将来需要添加更多对象怎么办? 这样会消耗大量写代码的时间,需要大量新的对象(敌人需要新对象,油桶需要对象,盒子也需要对象),对内存不友好。 这时,碰撞器是否可以只需要检测到一件东西,就可以触发碰撞物体的各种效果呢? 现在我们需要使用该接口。
新建一个脚本:名称任意,但接口名称不能任意。
接口必须严格为 I+文件名
然后定义一个方法Damage,这样简单写完接口后就可以在EnemyMove脚本中引用它了。
在 EnemyMove 脚本下添加 Damege 方法。 注意:需要与接口中定义的方法完全相同。
接下来就可以在方法中详细写出敌人被攻击的逻辑了。
敌人反应有点大,不需要参考
那么重点就在进攻方了。 因为我用的是刀,所以只需要触发刀的伤害即可。
你不再需要创建一堆对象,你只需要知道对象上是否有IDamage接口即可。
这样就可以避免重复编写一堆代码,也可以集中精力处理继承的IDamage对象的伤害逻辑。 玩家不再需要根据不同的敌人一一触发。
玩家还可以继承界面,让不同的敌人对玩家造成不同的伤害。
该界面很好地将玩家与外部对象解耦,无需将逻辑细节绑定到玩家。
有关内容,请参阅 Youtube 上的 Code Monkey。 有兴趣的话可以看看大师提供的详细例子。
B站有交通。
来源知乎专栏:游戏开发那些事