- 精华
- 阅读权限
- 90
- 好友
- 相册
- 分享
- 听众
- 收听
- 注册时间
- 2010-1-8
- 在线时间
- 小时
- 最后登录
- 1970-1-1
|
本帖最后由 bfdz49 于 2025-2-27 14:04 编辑
在《远征OL》中,打怪物显示伤害的代码逻辑主要涉及以下几个方面:
1. 伤害计算公式《远征OL》的伤害计算公式较为复杂,涉及多种属性和加成。以下是其核心逻辑:
(1)攻击力计算攻击力由以下部分组成:
- 基础攻击力(物理或法术攻击)。
- 状态、技能、装备、五行、三魂、镶嵌等附加攻击
(2)防御力计算防御力的计算方式与攻击力类似,也是基于基础防御力加上各种加成
(3)伤害公式伤害计算公式为:
- 真实伤害 = 攻击力 × 技能系数 × (1 - 免伤系数)
- 免伤系数 = 防御力 / (防御力 + C)
- C 是一个常量,与技能系数和攻击力有关
2. 伤害显示逻辑当玩家攻击怪物时,伤害值的显示需要经过以下步骤:
(1)战斗进程战斗进程会生成攻击方和防守方的状态记录实例(#battle_status),并通过这些实例计算伤害
伤害计算
- 战斗进程会检查攻击距离、技能冷却时间等条件。
- 计算双方的持续效果(buff)和技能效果。
- 根据伤害公式计算最终伤害[color=var(--rag-color)][backcolor=var(--rag-bg-color)]。
(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();
复制代码
|
|