/// <summary> /// 处理命中时的伤害变化 /// </summary> private void ProcessDirectDamage() { Assert.Should(m_tempTargeters != null); // 直接伤害:直线 if (BulletTypeUtil.IsLine(Entity.model.bulletType)) { foreach (var tar in m_tempTargeters) { var pos = tar.GetCurrentPosition(); var targeters = FindTargetersLine(pos.x, pos.y, 0.8f); // REMARK:这里直线宽度暂时设置为0.8个格子大小(可以适当调整) GameDamageManager.ProcessDamageMultiTargeters(targeters, Entity.model, Entity); } } // 直接伤害:扇形(包括360度环形) else if (Entity.model.attackAngle > 0) { foreach (var tar in m_tempTargeters) { var pos = tar.GetCurrentPosition(); var targeters = FindTargetersInAngle(pos.x, pos.y, Entity.model.attackAngle); GameDamageManager.ProcessDamageMultiTargeters(targeters, Entity.model, Entity); } } // 直接伤害:其他形状 else { GameDamageManager.ProcessDamageMultiTargeters(m_tempTargeters, Entity.model, Entity); } }
private void ProcessExplode(bool fly) { // 伤害处理(溅射范围为0则针对单个目标,否则根据溅射范围计算。) if (Entity.model.splashRange > 0) { // 飞天陷阱根据body计算位置、普通陷阱获取自身位置。 Vector2 p; if (fly) { var currPosition = Entity.view.body.position; p = new Vector2(currPosition.x, currPosition.z); } else { p = Entity.GetCurrentPositionCenter(); } GameDamageManager.ProcessDamageMultiTargeters(FindTargetersInSplash(p.x, p.y), Entity.model, Entity); } else { GameDamageManager.ProcessDamageOneTargeter(m_currTraceTargeter, Entity.model, Entity); } // 爆炸显示效果 GameEffectManager.Instance.AddEffect(Entity.model.hitEffectName, fly ? Entity.view.body.position : Entity.view.transform.position); // 自身死亡 Entity.Die(); // 改变数据 Entity.buildingVO.trapBuildingVO.broken = true; }
/// <summary> /// 处理技能范围伤害 /// </summary> /// <param name="skillModel"></param> /// <param name="hitX"></param> /// <param name="hitY"></param> public void ProcessAoeDamage(EntityModel skillModel, float hitX, float hitY) { var targeters = GetEntitiesByRange(null, OwnerType.Defender, hitX, hitY, skillModel.splashRange, 0.0f); if (targeters.Count == 0) { return; } GameDamageManager.ProcessDamageMultiTargeters(targeters, skillModel); }
public void SetUp(MonsterUnit unit, int uniqueID, MonsterStats monsterStat, MapGrid mapGrid, GameDamageManager gameDamageManager) { this.unit = unit; this.monsterStat = monsterStat; this.mapGrid = mapGrid; this._gameDamageManager = gameDamageManager; this._uniqueID = uniqueID; if (!AttackTimeDict.ContainsKey(uniqueID)) { AttackTimeDict.Add(uniqueID, 0); } }
/// <summary> /// [回调] 子弹命中目标 或 子弹命中目标点 /// </summary> /// <param name="bullet"></param> private void OnBulletHitted(GameBullet bullet) { // TODO:如果子弹命中回调时自身已经挂了的情况是否需要考虑?? //if (this.Entity.IsDead()) // return; Vector2 hitPos = Vector2.zero; float randomRadius = 0.0f; switch (bullet.bulletType) { case EntityBulletType.Point: // 对地点伤害 { Assert.Should(bullet.targetEntity == null); ProcessDamagePoint(bullet.targetPosition); hitPos = bullet.targetPosition; randomRadius = 0.3f; // REMARK:打目标点的按照半格计算 } break; case EntityBulletType.Target: // 对目标伤害 { Assert.Should(bullet.targetEntity != null); if (Entity.model.splashRange > 0) { ProcessDamagePoint(bullet.targetEntity.GetCurrentPositionCenter()); } else { GameDamageManager.ProcessDamageOneTargeter(bullet.targetEntity, Entity.model, Entity); } hitPos = bullet.targetEntity.GetCurrentPositionCenter(); randomRadius = Mathf.Max(0.3f, bullet.targetEntity.blockingRange / 6.0f); } break; default: Assert.Should(false, "invalid bullet type..."); break; } // 命中效果(范围内随机设置个命中点) if (randomRadius > 0) { hitPos.x = BattleRandom.Range(hitPos.x - randomRadius, hitPos.x + randomRadius); hitPos.y = BattleRandom.Range(hitPos.y - randomRadius, hitPos.y + randomRadius); } GameEffectManager.Instance.AddEffect(Entity.model.hitEffectName, new Vector3(hitPos.x, 0, hitPos.y)); }
public void UpdateGameObjects() { gamePlayerController = null; gameDamageManager = null; if (gamePlayerController == null) { gamePlayerController = gameObject.FindTypeAboveRecursive <GamePlayerController>(); } if (gameDamageManager == null) { gameDamageManager = gameObject.GetOrSet <GameDamageManager>(); gameDamageManager.UpdateGameObjects(); } }
public void HandleApplyDamage(GameObject go) { if (damageManage == null) { damageManage = go.GetComponent <GameDamageManager>(); } if (damageManage != null) { if (damageManage.gamePlayerController != null && gamePlayerController != null) { if (damageManage.gamePlayerController.uniqueId == gamePlayerController.uniqueId) { return; } } damageManage.ApplyDamage(Damage); } }
/// <summary> /// 针对地点进行伤害处理 /// </summary> /// <param name="pos"></param> protected void ProcessDamagePoint(Vector2 pos) { List <TileEntity> targeters = FindTargetersInSplash(pos.x, pos.y); if (targeters.Count == 0) { return; } int targeterCount = 0; foreach (TileEntity targeter in targeters) { // REMARK:溅射伤害系数修正 if (++targeterCount <= Constants.SPLASH_FULL_DAMAGE_MAX) { GameDamageManager.ProcessDamageOneTargeter(targeter, Entity.model, Entity); } else { GameDamageManager.ProcessDamageOneTargeter(targeter, Entity.model, Entity, Constants.SPLASH_PARTIAL_DAMAGE_RATIO); } } }
public void LoadAsset() { if (containerAssets == null) { return; } if (isActionCodeSave) { return; } if (assetCode != BaseDataObjectKeys.none && lastAssetCode != assetCode) { lastAssetCode = assetCode; if (gameCharacter == null) { return; } assetAnimationNameIdle = gameCharacter.data.GetAnimationsByTypeIdle().code; assetAnimationNamePlay = gameCharacter.data.GetAnimationsByTypeStart().code; GameObject go = AppContentAssets.LoadAssetLevelAssets( gameCharacter.data.GetModel().code); if (go != null) { containerAssets.DestroyChildren(); go.transform.parent = containerAssets.transform; go.TrackObject(containerAssets); if (isActionCodeAttack || isActionCodeDefend) { // Add game damage Collider goCollider = go.GetOrSet <Collider>(); if (goCollider != null) { gameDamageManager = goCollider.gameObject.GetOrSet <GameDamageManager>(); gameDamageManager.audioHit = "attack-hit-1"; gameDamageManager.effectDestroy = "effect-explosion"; gameDamageManager.enableObjectRemove = false; gameDamageManager.HP = hitPoints; gameDamageManager.UpdateGameObjects(); } } AssetAnimationReset(); } } }