bfdz49 发表于 2025-2-27 12:49:08

远征ol打怪显示伤害逻辑

本帖最后由 bfdz49 于 2025-2-27 14:04 编辑

在《远征OL》中,打怪物显示伤害的代码逻辑主要涉及以下几个方面:
1. 伤害计算公式《远征OL》的伤害计算公式较为复杂,涉及多种属性和加成。以下是其核心逻辑:
(1)攻击力计算攻击力由以下部分组成:

[*]基础攻击力(物理或法术攻击)。
[*]状态、技能、装备、五行、三魂、镶嵌等附加攻击
(2)防御力计算防御力的计算方式与攻击力类似,也是基于基础防御力加上各种加成
(3)伤害公式伤害计算公式为:

[*]真实伤害 = 攻击力 × 技能系数 × (1 - 免伤系数)
[*]免伤系数 = 防御力 / (防御力 + C)
[*]C 是一个常量,与技能系数和攻击力有关
2. 伤害显示逻辑当玩家攻击怪物时,伤害值的显示需要经过以下步骤:
(1)战斗进程战斗进程会生成攻击方和防守方的状态记录实例(#battle_status),并通过这些实例计算伤害
伤害计算

[*]战斗进程会检查攻击距离、技能冷却时间等条件。
[*]计算双方的持续效果(buff)和技能效果。

[*]根据伤害公式计算最终伤害。
(3)结果广播计算完成后,战斗进程会更新双方状态,并将伤害结果广播到客户端,显示在怪物头顶
3. 法宝伤害计算《远征OL》中的法宝伤害计算采用减法公式:

[*]法宝伤害 = (法宝威力 - 相应抗性) × 伤害系数
[*]法宝威力高于抗性时,伤害呈线性提升;若低于抗性,伤害可能为零
4. 伤害显示优化为了提升玩家体验,伤害数字的显示方式可以通过客户端设置调整,例如:

[*]开启或关闭伤害数字显示:/console floatingCombatTextCombatDamage 1
[*]调整伤害数字的大小和显示方向
5. 代码逻辑示例以下是简化的伪代码,展示如何计算和显示伤害:
// 伤害计算函数
float CalculateDamage(float attack, float defense, float skillMultiplier, float C) {
    float damage = attack * skillMultiplier;
    float damageReduction = defense / (defense + C);
    float finalDamage = damage * (1 - damageReduction);
    return finalDamage;
}

// 战斗流程
void Battle(Player attacker, Monster defender, Skill skill) {
    float attack = attacker.GetAttack();
    float defense = defender.GetDefense();
    float skillMultiplier = skill.GetMultiplier();
    float C = skill.GetConstant();

    float damage = CalculateDamage(attack, defense, skillMultiplier, C);

    // 更新怪物血量并广播结果
    defender.TakeDamage(damage);
    BroadcastDamage(damage);
}
[*]创建显示预制体(Prefab):

[*]建立一个空物体作为父物体(如HitReport),并添加两个子物体,每个子物体添加Text Mesh组件用于显示信息。

[*]为父物体编写脚本,控制文字的显示、渐隐和移动效果。


[*]脚本实现:

[*]using UnityEngine;

public class Hit : MonoBehaviour
{
    public TextMesh yellow;
    public TextMesh black;
    float startTime;
    float currentTime;
    public float lifespan = 2.0f; // 文字显示时间
    public float fadeTime = 1.0f; // 渐隐开始时间
    public float fadeSpeed = 0.5f; // 渐隐速度
    public float maxSize = 1.5f; // 最大尺寸
    public float speed = 5.0f; // 上升速度
    public string text;

    void Start()
    {
      startTime = Time.fixedTime;
    }

    void Update()
    {
      currentTime = Time.fixedTime - startTime;

      if (currentTime > lifespan)
      {
            Destroy(gameObject);
      }

      if (currentTime > fadeTime)
      {
            float fade = (fadeTime - (currentTime - fadeTime)) * (1 / fadeSpeed);
            Color tempColor = yellow.color;
            tempColor.a = fade;
            yellow.color = tempColor;

            tempColor = black.color;
            tempColor.a = fade;
            black.color = tempColor;
      }

      if (transform.localScale.x < maxSize)
      {
            transform.localScale = new Vector3(1.0f, 1.0f, 1.0f) * (0.01f + currentTime) * 3.0f;
      }
      transform.position += (Vector3.up * Time.deltaTime * speed);
      transform.LookAt(Camera.main.transform.position);

      yellow.text = text;
      black.text = text;
    }
}实例化显示效果:在攻击函数中,生成并显示伤害数字

[*]Transform tm = (Transform)Instantiate(hitReport, (target.position + new Vector3(0.0f, 1.6f, 0.0f)), Quaternion.identity);
tm.gameObject.SetActive(true);
Hit tmHit = tm.GetComponent<Hit>();
tmHit.text = ((int)(Mathf.Abs(damage))).ToString();



蜀黍鼠 发表于 2025-2-27 13:43:56

感谢大佬的分享   但是没源码啊

鑫垚 发表于 2025-2-27 13:52:31

::
页: [1]
查看完整版本: 远征ol打怪显示伤害逻辑

本站内容如若侵犯到您的权益,请来电来函告知,我们会尽快处理!
联系QQ:1953150286,2251387361,123784736,免责申明