using System; using System.Collections; using System.Collections.Generic; using UnityEngine; namespace BF { public class BattleControlUnit : BattleControlBase { [System.NonSerialized] public int UnitType = 0; [System.NonSerialized] public float CacheX = 0.0f; [System.NonSerialized] public float CacheY = 0.0f; [System.NonSerialized] public float CacheZ = 0.0f; [System.NonSerialized] public int Direction = 1; [System.NonSerialized] public float BodyRadius = 0.0f; // 半径 [System.NonSerialized] public bool IsDead = false; [System.NonSerialized] public BattleManager BattleMgr; protected SphereCollider bodyCollider; [System.NonSerialized] public long ReuseFlag = 0; [System.NonSerialized] public bool IsInGroundState = false; [System.NonSerialized] public BattleControlUnit Target; [System.NonSerialized] public bool IsDisappear = false; protected Action luaOnHitTargetFunc; protected Action luaOnFinishAIMoveFunc; protected int targetTypeAI = 0; protected Vector3 targetPositionAI = Vector3.zero; protected bool keepUpdateTargetPositionAI = false; protected bool isCanAcrossTarget = false; protected float moveSpeedAI = 0.0f; protected bool isTeleport = false; protected int endTypeAI = 0; protected float endValueAI = 0.0f; protected int collisionTypeAI = 0; protected BattleHpBar hpBar; protected bool isHaveHpBar = false; [System.NonSerialized] public float HpBarAddY = 0.0f; protected bool IsHaveShadow = false; protected GameObject shadow; public virtual void OnDead() {} public virtual void Clear() {} public virtual void Reborn() {} public virtual void Revive() {} public virtual void MoveWithSkillAI(int target, int horizontal, float x, float z, int refresh, int across, float speed, int endType, float endValue, int collisionType) {} public virtual void PlayAirborne() {} public virtual void StopAirborne() {} public virtual void TowardToTarget() {} public virtual void ForceTowardToTarget() {} public virtual bool GetWhetherUseGroundSkill() { return false; } public virtual void BeHitBack() {} public virtual void EnterDisappear() {} public virtual void ExitDisappear() {} public virtual void RefreshHpBar(float percent) {} public virtual void InitHpBar() {} public virtual void RefreshShieldBar(float percent, bool visible) {} public void CachePosition() { var position = transform.position; CacheX = position.x; CacheY = position.y; CacheZ = position.z; } public void CacheLocalEulerAnglesY() { CacheY = transform.localEulerAngles.y; } public void InitCircleBody(float radius) { BodyRadius = radius; bodyCollider.radius = radius; } public void SetDisappear(bool isDisappear) { if (IsDisappear == isDisappear) { return; } IsDisappear = isDisappear; if (isDisappear) // 进入消失状态 { EnterDisappear(); } else // 取消消失状态 { ExitDisappear(); } } public BattleControlBoxCollider GetSkillBoxCollider() { var boxCollider = BattleMgr.PoolHelper.GetSkillBoxCollider(); if (ReferenceEquals(boxCollider, null)) { return null; } boxCollider.SetAdmin(this); return boxCollider; } public BattleControlSphereCollider GetSkillSphereCollider() { var sphereCollider = BattleMgr.PoolHelper.GetSkillSphereCollider(); if (ReferenceEquals(sphereCollider, null)) { return null; } sphereCollider.SetAdmin(this); return sphereCollider; } public BattleControlCollider GetSkillCollider(int rangeType, float collisionValue1, float collisionValue2, float x, float z) { if (rangeType == 1) { BattleControlBoxCollider box = GetSkillBoxCollider(); box.SetupCollisionBody(collisionValue1, collisionValue2, x, z); return box; } var sphere = GetSkillSphereCollider(); sphere.SetupCollisionBody(collisionValue1, x, z); return sphere; } public BattleControlColliderContainer UseSkillColliders(int aimSearchType, int rangeType, float interval, float duration, int skillId, int cloneIndex, int skillEffectIndex, bool unlimitCount, float delayAimTime, float aimFollowTime, float aimFollowSpeed, float collisionValue1, float collisionValue2, float x, float z, bool disposable) { BattleControlCollider collider; BattleControlColliderContainer colliderContainer = null; switch(aimSearchType) { case 1001: // 离自身最近的目标 var control = BattleMgr.GetNearestUnit(Side); if(ReferenceEquals(control, null)) { return null; } collider = GetSkillCollider(rangeType, collisionValue1, collisionValue2, x, z); collider.InitBase(); collider.SetLockTarget(control); collider.SetIsSearchByCollider(false); if (!disposable) { colliderContainer = BattleMgr.PoolHelper.GetColliderContainer(); colliderContainer.InitBase(); colliderContainer.Add(collider); colliderContainer.SetIsSearchByCollider(false); } collider.Search(aimSearchType, interval, duration, skillId, cloneIndex, skillEffectIndex, unlimitCount, delayAimTime, aimFollowTime, aimFollowSpeed, disposable); collider.AddCheckTargetList(control.gameObject); break; case 1002: // 所有敌人 if (!disposable) { colliderContainer = BattleMgr.PoolHelper.GetColliderContainer(); colliderContainer.InitBase(); } var unitsList = BattleMgr.GetUnitsList(Side); for (int i = 0; i < unitsList.Count; i++) { collider = GetSkillCollider(rangeType, collisionValue1, collisionValue2, x, z); collider.InitBase(); collider.SetLockTarget(unitsList[i]); collider.SetIsSearchByCollider(false); if (!disposable) { colliderContainer.Add(collider); colliderContainer.SetIsSearchByCollider(false); } collider.Search(aimSearchType, interval, duration, skillId, cloneIndex, skillEffectIndex, unlimitCount, delayAimTime, aimFollowTime, aimFollowSpeed, disposable); collider.AddCheckTargetList(unitsList[i].gameObject); } break; case 2001: // 离自身最近的目标所在的目标点 var control2 = BattleMgr.GetNearestUnit(Side); if(ReferenceEquals(control2, null)) { return null; } collider = GetSkillCollider(rangeType, collisionValue1, collisionValue2, x, z); collider.InitBase(); collider.SetTargetPosition(control2.transform.position); collider.SetLockTarget(control2); collider.SetIsSearchByCollider(true); if (!disposable) { colliderContainer = BattleMgr.PoolHelper.GetColliderContainer(); colliderContainer.InitBase(); colliderContainer.Add(collider); colliderContainer.SetIsSearchByCollider(true); } collider.Search(aimSearchType, interval, duration, skillId, cloneIndex, skillEffectIndex, unlimitCount, delayAimTime, aimFollowTime, aimFollowSpeed, disposable); break; case 2002: // 自身为原点,范围内的所有敌人 collider = GetSkillCollider(rangeType, collisionValue1, collisionValue2, x, z); collider.InitBase(); collider.SetTargetPosition(transform.position); collider.SetIsSearchByCollider(true); if (!disposable) { colliderContainer = BattleMgr.PoolHelper.GetColliderContainer(); colliderContainer.InitBase(); colliderContainer.Add(collider); colliderContainer.SetIsSearchByCollider(true); } collider.Search(aimSearchType, interval, duration, skillId, cloneIndex, skillEffectIndex, unlimitCount, delayAimTime, aimFollowTime, aimFollowSpeed, disposable); break; case 2003: // 自身为原点,且会跟随自身移动 collider = GetSkillCollider(rangeType, collisionValue1, collisionValue2, x, z); collider.InitBase(); collider.SetTargetPosition(transform.position); collider.SetLockTarget(this); collider.SetIsSearchByCollider(true); collider.SetUpdatePositionWithLockTarget(true); if (!disposable) { colliderContainer = BattleMgr.PoolHelper.GetColliderContainer(); colliderContainer.InitBase(); colliderContainer.Add(collider); colliderContainer.SetIsSearchByCollider(true); } collider.Search(aimSearchType, interval, duration, skillId, cloneIndex, skillEffectIndex, unlimitCount, delayAimTime, aimFollowTime, aimFollowSpeed, disposable); break; default: break; } return colliderContainer; } public void OnHitTarget(GameObject go, int skillId, int cloneIndex, int skillEffectIndex) { luaOnHitTargetFunc?.Invoke(skillId, cloneIndex, skillEffectIndex, go.GetInstanceID()); } public void AddLuaOnHitTargetFunc(Action luaFunc) { luaOnHitTargetFunc = luaFunc; } public void OnFinishAIMove() { luaOnFinishAIMoveFunc?.Invoke(); } public void AddLuaOnFinishAIMoveFunc(Action luaFunc) { luaOnFinishAIMoveFunc = luaFunc; } public BattleControlBoxBullet SendBoxBullet(int skillId, int cloneIndex, int skillEffectIndex, int bulletType, int bulletFinishType, int bulletOriginType, int searchType, float w, float h, float duration, float speed, float offsetX, float offsetZ) { var bullet = BattleMgr.PoolHelper.GetBoxBullet(); if (ReferenceEquals(bullet, null)) { return null; } bullet.SetAdmin(this); bullet.InitBoxBullet(skillId, cloneIndex, skillEffectIndex, bulletType, bulletFinishType, bulletOriginType, searchType, w, h, duration, speed, offsetX, offsetZ); return bullet; } public BattleControlSphereBullet SendSphereBullet(int skillId, int cloneIndex, int skillEffectIndex, int bulletType, int bulletFinishType, int bulletOriginType, int searchType, float radius, float duration, float speed, float offsetX, float offsetZ) { var bullet = BattleMgr.PoolHelper.GetSphereBullet(); if (ReferenceEquals(bullet, null)) { return null; } bullet.SetAdmin(this); bullet.InitSphereBullet(skillId, cloneIndex, skillEffectIndex, bulletType, bulletFinishType, bulletOriginType, searchType, radius, duration, speed, offsetX, offsetZ); return bullet; } public void InitShadow() { if (IsHaveShadow) { return; } IsHaveShadow = true; shadow = BattleMgr.PoolHelper.GetShadow(); shadow.transform.SetParent(transform, false); shadow.transform.localPosition = Vector3.zero; shadow.transform.localScale = Vector3.one*BodyRadius*2.0f; } } }