卡卷网
当前位置:卡卷网 / 每日看点 / 正文

用Unity做游戏,所有小兵怪兽单位共用一个脚本写好还是每个单位用不同的脚本?

作者:卡卷网发布时间:2025-01-07 17:07浏览数量:73次评论数量:0次

你这两种写法都是错误的,而且是大错特错。

我写游戏战斗逻辑这边相对较少,但是可以给你说一下游戏战斗实体这边的整体实现思路。

我们一般情况下会把一个战斗实体分成几个部分。

一.实体属性模块

第一个部分是战斗实体本身是一个实体,这样可以给它定义实体相关的属性,如血量,蓝量,能量,怒气,力量,敏捷,等等,所有实体都拥有这些属性枚举(不过不是所有实体都一定有这些属性,当没有这项属性的时候以获取到为0或者无效值的形式来实现就可以了)。

类似于

enumEntityPropMode{ emEntityPropNone=0,//未定义属性类型 emEntityPropHp=1,//生命值 emEntityPropMp=2,//法力值 emEntityPropAttack=3,//攻击力 //others. };

当我们获取这个实体的某项属性时,就直接通过一个GetEntityProp(EntityPropMode)这样的接口去获取属性,而不关注它的具体实体类型是什么(这里的实体类型有可能是Monster,Person,Pet,Tank等等不同类型,还会包含实体的阵营属性和是否可以攻击属性等等)

这里举几个较典型的Case:

(1)Monster

怪物是一种较普遍的实体单位,可以被玩家攻击,部分的Monster类型还可以相互攻击,这里就涉及到一个属性字段叫做阵营类型(CampType),以较经典的魔兽世界为例的情况下,通常我们会考虑将所有玩家的阵营类型设置为'部落'(1),'联盟'(2),'怪物'(3)。

假使说我们要设计出一些可以相互进行攻击的怪物该怎么处理呢,这个时候就要单划分出一个阵营类型如,'红怪物'(4),'亡灵怪物'(5),这样当他们发现某个单位与自己阵营不同时(或者是某个特定阵营时),就会对该阵营的单位发起攻击。

(2)Person

Person这里一般的常见理解是一种由玩家手动控制的Monster单位,当然这里要忽略一些的特殊养成,如背包,装备等等(我们一般考虑将装备等值为属性本身,就是当装备穿戴到玩家身上的时候,就直接给玩家这个实体添加属性,当然这里不是唯一实现)。

这样做的有一个好处是,如果我们要做自动战斗等等逻辑时,就可以将玩家直接作为一个Monster单位去处理,而不需要做太多的特殊处理去完成。

(3)Pet

Pet的特性是一般Pet的AI模式是由玩家决定,并且通常会跟随在玩家身边,虽然前文中有提到,但在这里进行明确叙述一下,决定游戏世界中,每个单位的行为不同的核心是游戏实体的AI,后文会明确叙述这一点,单从实体这个角度来说,Pet和Monster完全是一类单位。

(4)Collection

这里单说一下一类特殊的游戏实体,也就是采集物,我们可以考虑将魔兽世界中的矿石,药当作采集物,他们也是一类单的游戏实体,只不过和游戏实体相的是它们可能没有血量(部分游戏设计当中采集物也是有特殊血量的,也可以简单的讲魔兽世界中矿石理解为一个血量为3,不可以被攻击,当被挖矿的时候掉血的单位)。

这样的优势是当某一个矿石可以被特殊游戏单位攻击时,同样也不需要做特殊的代码逻辑就可以简单实现。

从上面的说法中可以明确的看出,所有的游戏单位都可以被定义为实体,区分他们的是属性不同(属性不同包含阵营类型,是否可以被攻击,是否可以交谈等等,这些都是组成属性的一部分)。

而当我们要设计一个怪物时(方说是像史莱姆这一类简单的怪物)就可以简单的定义为。

name="史莱姆"

prop_map[emapperence]=100024,//游戏模型

prop_map[emhp]=10,//生命

prop_map[emmp]=2,//法力

prop_map[emattack]=3,//攻击力

prop_map[emdefence]=1,//防御力

任何一个实体单位都可以被描述成一个这样的属性。

这里需要单拿出来说明的是,一个这样的属性是不包含攻击,被攻击这些东西的,这些我稍后具体论述是如何实现的。

二.技能模块

现在的RPG游戏通常都是有技能这一部分的,技能的这一部分的主要核心在于。

<>将技能进行抽象,把他们的共同点抽象出来作为一个可配置项。

技能对于整个游戏而言是一个非常复杂的,而且对于不同游戏而言可复用性可以说极差,一般会单为了这个游戏去设计和修改,这里单举几个简单的例子。

冰霜箭:施法时间2.5秒,冷却时间2秒,对目标造成100冰霜魔法伤害。

火球术:施法时间3.5秒,冷却时间3秒,对目标造成200火焰魔法伤害。

冰雨:引导8秒,每2秒对圆形区域内的敌人造成100冰霜魔法伤害。

对于如上几个技能进行抽象,我们就能得出来几个内容。

(1)施法时间。

(2)冷却时间。

(3)基础技能伤害。

(4)单体类型/圆形类型。

(5)施法法术/引导法术。

(6)伤害间隔。

就需要对于上面这些内容进行实现,而后面策划再去配置的时候就可以用已有的因素组合出。

火球爆发:施法时间3秒,冷却时间4秒,对目标圆形区域内造成1000火焰伤害。

所有的技能都是基于这些抽象上建立的特殊属性,具体的技能设计可以去找网上现成的配置,或者自己根据自己想要开发的技能进行抽象。

这一部分往往还包含了,UFF,效果这些特殊模块。

有了技能我们就可以设计出一个带技能的怪物,不过它仍然是不可以攻击的。

三.AI模块

AI是游戏实体的大脑,这一部分决策了游戏实体可以自己去做哪些事情,一般的AI实现会考虑使用决策树或者状态机,我个人使用决策树的方案会相对多一些(因为它相对来说好实现,理解和开发,但是在一些特殊情况下没有状态机灵活)。

这里以一只可以使用火焰法术,可以普通攻击,可以使用治疗法术的史莱姆为例,它的AI决策应该是这个样子的。

(1)如果血量在20%以下,逃离玩家。

(2)如果血量在50%以下,蓝量足够的情况下,使用治疗法术。

(3)蓝量足够的情况下,使用火球术。

(4)使用近战攻击。

这是一个简单的AI,不过考虑我们不可能的为每一只小怪单去写一个AI(某些副本怪物是需要单编写AI逻辑的),所以这里就需要一个通用AI。

(1)如果血量在20%以下,逃离玩家。

(2)如果血量在50%以下,蓝量足够的情况下,有治疗类型法术的情况下,使用治疗法术。

(3)蓝量足够的情况下,选择一个随机伤害型法术。

(4)使用近战攻击。

然后就可以用这个通用AI去做大部分怪物的大脑。

最后我们的一个怪物应该就需要以下配置就可以配置出来、

怪物表

史莱姆,100血,10蓝,5攻,1防,技能1火球术,技能2治疗术,通用AI类型,史莱姆怪物模型。

END

免责声明:本文由卡卷网编辑并发布,但不代表本站的观点和立场,只提供分享给大家。

卡卷网

卡卷网 主页 联系他吧

请记住:卡卷网 Www.Kajuan.Net

欢迎 发表评论:

请填写验证码