Unity可扩展、灵活的战斗框架实现3 GameplayTag

在GAS中,对所有战斗相关的实例(效果,buff,技能,状态)都有一个或多个gameplaytag,这个标签的作用是用于区分实例是否是同一个配置来源。

由于我们希望实现的目的是所有的技能、效果等都是可配置的,而目前来说一个效果的配置是存储在scriptableObject中,多个效果实例在代码层面上,都是一个类型,仅仅是读取的配置项不同。而为了区分它们,以便对同一效果进行区分对待,比如有的技能多次命中会刷新时间eg:大部分的眩晕技能),有的技能多次命中则叠加层数(eg:小鱼人的敏捷偷取),这里就抽象出一层标签。

其实使用约定好格式的字符串或者枚举类也可以达成这个目的。但是这一层gameplaytag的封装,使得区分的方式更加多样,这就比枚举类要功能更强(可以在gameplaytag这个类中增加各种区分方法),并且更不容易因为约定的字符串写错或数量太大难以维护。

我们来看代码,代码非常简单。


using UnityEngine;


public class GameplayTagScriptableObject : ScriptableObject
{
    /// <summary>
    /// 父级标签
    /// </summary>
    [SerializeField]
    private GameplayTagScriptableObject parent;

    public GameplayTagScriptableObject Parent => parent;

    /// <summary>
    /// 是否另一标签的衍生标签
    /// </summary>
    /// <param name="other"></param>
    /// <param name="serchLimit"></param>
    /// <returns></returns>
    public bool IsDescendantOf(GameplayTagScriptableObject other, int searchLimit = 4)
    {
        int i = 0;
        GameplayTagScriptableObject tag = Parent;
        while (searchLimit > i++)
        {
            // tag will be invalid once we are at the root ancestor
            if (!tag) return false;

            // Match found, so we can return true
            if (tag == other) return true;

            // No match found, so try again with the next ancestor
            tag = tag.Parent;
        }

        // If we've exhausted the search limit, no ancestor was found
        return false;
    }
}

一个parent,可以为空,用于配置自己的父级,一个方法用于确认标签是否是另一个标签的衍生层级。

这样我们就有了一套分层级的标签结构,使用恰当的话在开发中就不需要对很多实例进行类型判断,开销也会小一些。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编写 Unity战斗框架需要考虑多个方面,包括战斗场景设计、角色属性管理、技能系统、伤害计算等等。以下是一个简单的战斗框架实现步骤: 1. 设计战斗场景。根据游戏需求设计出战斗场景,并在 Unity 中创建相应的场景。 2. 创建角色。在 Unity 中创建角色,包括角色的模型、动画和属性等。根据游戏需求选择不同的角色类型,例如战斗士兵、法师、弓箭手等。 3. 管理角色属性。为每个角色添加属性组件,包括生命值、攻击力、防御力等。在角色受到攻击时,根据攻击者的属性计算出受到的伤害值,然后减去生命值。 4. 设计技能系统。在 Unity 中创建技能系统,包括技能的触发条件、技能的效果和技能的消耗等。根据游戏需求设计出不同的技能类型,例如攻击技能、防御技能、治疗技能等。 5. 触发技能。在角色受到攻击或者主动释放技能时,触发相应的技能效果。根据技能的触发条件和效果,在角色身上添加相应的状态,例如冰冻、昏迷、中毒等。 6. 计算伤害。在技能效果中计算伤害值,并减去目标角色的生命值。根据游戏需求设计出不同的伤害计算方式,例如基于攻击力和防御力的计算、基于元素属性的计算等。 7. 处理战斗结果。在战斗结束时,根据游戏规则计算出胜负结果,并展示相应的结算界面。 以上是一个简单的战斗框架实现步骤。在实际开发中,还需要考虑各种异常情况的处理和优化性能等问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值