Unity回合制游戏持续多回合的技能该如何实现?

#战斗逻辑
AB阵营最多各5名英雄(也可以不足5名)。每回合根据出手速度决定出手顺序,当所有角色都出手后进入下一回合。

问题1:在技能系统中,持续特定回合技能如何实现?
例如A对B造成200%伤害,并在接下来的3个回合内分别造成150%的伤害?

我的思路是在战斗系统里,创建一个释放持续掉血技能的委托,在每个回合开始时就调用。
如果释放的技能为持续掉血技能时,就注册该委托。当前战斗回合在技能持续最大回合内,就执行相应效果的算法。如果超出最大回合,就注销改委托。

由于执行该委托的算法需要传入施法目标,作用目标,持续最大回合数,效果数值4个参数。这4个参数不知道从哪里存储,如何读取。并且如果该回合有n个角色要释放持续回合技能。如何让委托方法与角色的委托参数一一对应?

问题2:如果同一技能效果给多个目标释放,或者叠加给同一目标。如果施加给其中一个目标的技能效果到达最大回合数,执行了注销事件方法。那其他调用相同事件但并未到达最大回合的事件是不是也被注销了,这样就无法满足需求。

可能我的实现思路是错的,请有经验的朋友指导!多谢!

TechWhizKid参考GPT回答:

首先,你的思路并没有错,你已经在正确的方向上。我可以提供一个稍微详细的方式,但它也会基于你的基本思想。关于你的两个问题,我提出以下解决方案:

实现方法

  1. 创建一个“Buff”或“Debuff”类。这个类包含你提到的所有属性:施法目标,作用目标,持续最大回合数,效果数值。此外,它应该有一个方法(例如:ApplyEffect),用于在每个回合开始时应用效果。

  2. 在每个角色中,添加一个“BuffList”或“DebuffList”。当一个角色被赋予一个新的持续性技能效果时,就在这个列表中添加一个新的Buff或Debuff对象。

  3. 在每个回合开始时,遍历每个角色的Buff/Debuff列表。对于每个Buff/Debuff,调用其ApplyEffect方法,并减少其剩余的回合数。如果剩余回合数减为0,那么从列表中移除这个Buff/Debuff。

这样,你就能处理多个角色同时受到多个持续性技能效果的情况。如果同一技能效果给多个目标释放,或者叠加给同一目标,它们都是独立的Buff/Debuff对象,所以当其中一个到达最大回合数并被移除时,不会影响到其他的Buff/Debuff。

这只是一个基本的解决方案,你可能需要根据自己的游戏特性进行一些调整。但是,这个方案应该能为你提供一个开始实现持续性技能效果的地方。

要实现Unity中持续多回合的技能,可以使用以下步骤:

创建技能脚本:首先创建一个技能脚本,用于管理技能的持续效果和回合数。

定义技能属性:在技能脚本中定义技能的属性,例如回合数、每回合造成的伤害等。

运行技能效果:在技能脚本的Update函数中,根据当前回合数来执行技能的效果。可以使用计时器或者回合数变量来控制技能的持续时间。

调用技能:在游戏中的适当位置调用技能脚本,例如角色攻击时。

更新回合数:在每个回合结束时,更新技能的回合数,使技能效果持续下去。可以使用计时器或者回合数变量来计算回合数。

结束技能效果:当技能的回合数减到0时,结束技能的效果。可以在Update函数中检查回合数,如果为0,则停止技能的效果。

通过以上步骤,你可以在Unity中实现一个持续多回合的技能。记得在游戏中适当地调用技能脚本,并在每个回合结束时更新回合数。

1.你可以为每个角色创建一个列表,用来存储他们身上的持续技能效果。每个持续技能效果可以用一个类或结构体来表示,当一个角色释放一个持续技能时,就在作用目标的列表中添加一个持续技能效果的实例。当每个回合开始时,就遍历每个角色的列表,执行相应的效果,并更新当前回合数。如果当前回合数等于最大回合数,就从列表中移除该效果
2.基于第一个思路实现的
如果你要给同一目标叠加掉血效果,你可以先判断该目标的列表中是否已经有掉血效果的实例。如果有,你可以选择更新其效果数值或者延长其最大回合数。如果没有,你可以直接在该目标的列表中添加一个掉血效果的实例

问题1:实现持续多回合的技能可以采用委托和事件的方式。你的思路是正确的,创建一个委托来处理技能的效果,并在每个回合开始时调用。下面是一个简单的示例:

首先,在角色类中定义一个委托和事件:

public delegate void SkillEffectDelegate(Character caster, Character target, int maxRounds, float damageMultiplier);
public event SkillEffectDelegate OnSkillEffect;

然后,在技能类中触发委托事件,并传递相关参数:

public void TriggerSkillEffect(Character caster, Character target, int maxRounds, float damageMultiplier)
{
    if (OnSkillEffect != null)
    {
        OnSkillEffect(caster, target, maxRounds, damageMultiplier);
    }
}

在战斗系统中,注册委托并在每个回合开始时调用:

void StartRound()
{
    foreach (Character character in characters)
    {
        // 注册持续技能的委托
        character.OnSkillEffect += ApplyContinuousEffect;
    }
}

void ApplyContinuousEffect(Character caster, Character target, int maxRounds, float damageMultiplier)
{
    // 执行持续技能的效果,例如造成伤害
    float damage = CalculateDamage(caster, target) * damageMultiplier;
    target.TakeDamage(damage);

    // 检查是否超过最大回合数,如果是则注销委托
    if (target.roundsAffected >= maxRounds)
    {
        caster.OnSkillEffect -= ApplyContinuousEffect;
    }
    else
    {
        target.roundsAffected++;
    }
}

问题2:如果多个目标或同一目标受到相同技能效果的影响,可以在技能类中设置一个字典来存储每个目标的受影响回合数。这样可以保持不同目标之间的独立性。示例代码如下:

public class SkillEffect
{
    public Character target;
    public int roundsAffected;

    public SkillEffect(Character target, int roundsAffected)
    {
        this.target = target;
        this.roundsAffected = roundsAffected;
    }
}

public class Skill
{
    private Dictionary<Character, SkillEffect> skillEffects = new Dictionary<Character, SkillEffect>();

    public void TriggerSkillEffect(Character caster, Character target, int maxRounds, float damageMultiplier)
    {
        if (!skillEffects.ContainsKey(target))
        {
            skillEffects.Add(target, new SkillEffect(target, 0));
        }

        SkillEffect effect = skillEffects[target];
        if (effect.roundsAffected < maxRounds)
        {
            // 执行持续技能的效果,例如造成伤害
            float damage = CalculateDamage(caster, target) * damageMultiplier;
            target.TakeDamage(damage);

            effect.roundsAffected++;
        }

        if (effect.roundsAffected >= maxRounds)
        {
            skillEffects.Remove(target);
        }
    }
}

通过使用字典来跟踪不同目标的受影响回合数,可以确保技能效果在不同目标之间独立,并且不会因为一个目标的效果结束而影响其他目标。

希望这些示例能帮助你解决问题!如果还有其他疑问,请随时提问。

源于chatGPT仅供参考

对于回合制游戏中持续多回合的技能,下面是一种可能的实现思路来解决您提出的问题:

问题1:实现持续特定回合技能
- 在技能系统中,为每个技能定义一个数据结构或类,包含技能的基本属性以及持续效果的相关信息(例如,持续回合数和每回合造成的伤害比例)。
- 在每个角色身上添加一个技能效果列表,用于存储当前角色所受到的技能效果。
- 当角色受到该技能释放时,将该技能的效果信息添加到角色的技能效果列表中,并记录开始生效的回合数。
- 在每个回合开始时,遍历每个角色的技能效果列表,执行相应的效果逻辑。可以根据技能效果的类型进行相应的处理,如造成伤害、治疗等。
- 每回合结束时,更新技能效果列表中的回合数,判断是否达到持续回合数,并移除已经结束的技能效果。

问题2:处理多目标和叠加效果
- 对于同一个技能要施加给多个目标的情况,可以在技能系统中定义每个效果的目标列表,并在技能释放时,将技能效果分别添加到不同的目标身上。
- 对于叠加效果的情况,可以在目标的技能效果列表中进行判断和处理。如果已经存在相同技能的效果,则更新该效果的回合数和数值,而不是重复添加新的效果。

这种实现思路可以通过数据结构和逻辑控制来管理技能的持续效果,并确保每个技能效果针对具体角色的委托参数一一对应。同时也能够处理多目标和叠加效果的情况。

请注意,这只是一种可能的实现思路,您可以根据具体需求和项目架构进行调整和优化。实现过程中还需要考虑其他方面的细节,如技能优先级、技能中断等。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7515890
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:问题:同一个进程中,先后对同一个文件描述符进行写入 / 读取 操作,读写指针的位置导致读取内容失败
  • 除此之外, 这篇博客: 【大学物理·静止电荷的电场】静电场中的导体中的             对于具有尖端的带电导体,由于尖端处电荷面密度极高,其周围的电场强度特别强, 空气中的残留离子受到这个强电场的作用与空气其他分子剧烈碰撞而产生大量的离子.其中和导体上电荷异号的离子,被吸引 到尖端上,与导体上的电荷相中和,而和导体上电荷同号的离子, 则被排斥而离开尖端.这种使得空气被“击穿”而产生的放电现象称为尖端放电。避雷针就是根据尖端放电的原理制造的,当雷电发生时,利用尖端放电原理使强大的放电电流从和避雷针连接并接地良好的 粗导线中流过,从而避免了建筑物遭受雷击的破坏。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

                在出现电晕现象的电场 中,不仅有离子在运动,大气中的中性微尘由于有离子附着在它
    们上面而带电,也能在电场中作定向运动.“静电喷漆”就是利用电晕原理使漆雾微粒带电而喷射到工件上.在工厂中也利用这个原理制成除尘器来除去大气中的有害粉尘。


                   导体放在静电场中后,静电感应的结果只是使导体中的电荷重新分布, 而并没有失去或得到电子,因此,从整体看,感应出来的正负电荷量仍旧相等.
                    静电场中的导体,在静电平衡条件下,尽管导体表面分布有不同的电荷,但 并没有电荷的移动,这就是因为导体是一等势体,表面是一等势面.
                     将电场中的导体分开为两部分,这就破坏了原来的静电平衡,分开的两部分 重新建立了自己的静电平衡状态,但一部分导体带正电,另一部分导体带负电, 它们的电势不再相等.

                    孤立导体球带有均匀分布的电荷Q时,球外任一点的电场方向或者沿 径向(Q>0),或者沿径向相反的方向(Q<0),导体球表面附近的电场强度方向也不例外.
                    当把另一带电体移近这个导体球时,整个空间的电场分布将会发生变化,导体球表面的电荷分布也将发生变化,不再是均匀的了.球表面附近的电场强度将是导体球的电场与另一带电体的电场的叠加,叠加后的电场强度方向将依然垂直于导体球表面,根据导体球所带电荷的正负,电场强度的方向或者沿径向 (Q>0),或者沿径向相反的方向(Q<0).于整个空间的电场E发生了变化,导体球的电势V_{R}=\int_{R}^{\infty }E\cdot dl自然也就不同.不过此时导体球还是处于新的静电平衡状态,其电势虽然会发生变化,但 依然是一等势体,其表面是也依然是等势面.在静电平衡状态下,导体内任一点 的电场强度总是零,所以即使把另一带电体移近这个导体球,球体内的电场强度 也还是零,没有变化.


  • 您还可以看一下 李月喜老师的企业微信开发自建内部应用开发篇课程中的 开发文档如何阅读,如何寻求帮助,如何找到同行小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    问题1:在技能系统中,如何实现持续特定回合的技能效果?

    为了实现技能的持续效果,可以使用委托和事件机制来处理回合制游戏中的效果。以下是一个示例实现:

    首先,创建一个名为SkillEffectDelegate的委托类型,用于定义技能效果的委托方法:

    public delegate void SkillEffectDelegate(Character caster, Character target, int maxRounds, int effectValue);
    

    然后,在角色类中定义一个委托事件,用于触发技能效果的委托方法:

    public event SkillEffectDelegate SkillEffectActivated;
    

    接下来,在技能类中,创建一个用于触发技能效果的方法,该方法会调用SkillEffectActivated事件,并传递技能效果相关参数:

    public void ActivateSkillEffect(Character caster, Character target, int maxRounds, int effectValue)
    {
        if (SkillEffectActivated != null)
        {
            SkillEffectActivated(caster, target, maxRounds, effectValue);
        }
    }
    

    然后,在战斗系统中创建一个委托方法来处理技能效果的持续效果。每个回合开始时,调用该方法并检查技能效果的持续回合数。如果超过最大持续回合数,则将该技能效果从委托事件中注销:

    public void HandleSkillEffect(Character caster, Character target, int maxRounds, int effectValue)
    {
        if (target.HasEffect("持续掉血")) // 判断目标是否已经有持续效果
        {
            target.TakeDamage(effectValue); // 造成持续的伤害
            target.DecreaseEffectDuration("持续掉血", 1); // 持续回合数减少1
        }
        else
        {
            target.ApplyEffect("持续掉血", maxRounds, effectValue); // 添加持续效果到目标
        }
    
        if (target.GetEffectDuration("持续掉血") >= maxRounds) // 判断是否超过最大持续回合数
        {
            target.RemoveEffect("持续掉血"); // 移除持续效果
            SkillEffectActivated -= HandleSkillEffect; // 注销委托方法
        }
    }
    

    最后,在战斗系统中注册技能效果的委托方法,并在每个回合开始时调用它:

    SkillEffectDelegate skillEffectDelegate = new SkillEffectDelegate(HandleSkillEffect);
    SkillEffectActivated += skillEffectDelegate;
    
    // 每个回合开始时调用技能效果委托方法
    foreach (Character character in characters)
    {
        SkillEffectActivated?.Invoke(character, targetCharacter, maxRounds, effectValue);
    }
    

    通过这个实现,可以实现技能的持续效果。每个回合开始时,会检查技能效果的持续回合数,并根据需要执行相应的业务逻辑。

    问题2:如果一个技能效果同时作用于多个目标,或者叠加到同一目标上,当其中一个目标的技能效果达到最大持续回合数并执行注销事件方法时,其他目标的相同效果是否也会被注销,从而无法满足需求。

    对于同时作用于多个目标的技能效果以及叠加到同一目标上的情况,可以采用以下方法来满足需求:

    1. 增加技能效果的持续效果管理器:为每个技能效果创建一个持续效果管理器,用于保存每个目标的持续效果信息。

    2. 在技能效果类中添加一个注册方法,用于将目标指定为该技能效果的受影响目标,并将持续效果信息添加到持续效果管理器中。

    3. 修改持续效果管理器,使其能够管理多个目标的持续效果。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^