using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Drawing; using System.Linq; using System.Reflection; using System.Threading.Tasks; using UnityEditor; using UnityEngine; using UnityEngine.UI; using UnityEngine.UIElements; using Debug = UnityEngine.Debug; using Image = UnityEngine.UI.Image; public enum Camp {/// /// 玩家 /// Player, /// /// 怪物 /// Enemy, /// /// 中立 /// Neutral } /// /// 角色基类,玩家处理事件 /// [ExecuteInEditMode] public class Role : Fun { [Header("Id")] public int id; [Header("阵营")] public Camp camp ; [Header("血量")] public float hp = 100f;//血量 private float maxHp; [Header(("死亡动画编号"))] public int dieIndex=-1; [Header("hp填充")] public Image Hpfiil; [Header("扣血填充")] public GameObject HpTextPrefab; [Header("自己的画布")]public Canvas _Canvas; public float Hp { get => hp; set { float temp = hp; hp = value; if (Hpfiil!=null) { Hpfiil.fillAmount = hp / maxHp; } if (HpTextPrefab != null&& hp().text= (temp - hp).ToString(); } if (hp <= 0) { die(); } } } [Header("掉落")] public float gold = 10f; public float Gold { [DebuggerStepThrough] get => gold; [DebuggerStepThrough] set => gold = value; } [Header("攻击力")] private float attack = 10f; public float Attack { get => attack; set => attack = value; } [Header("等级")] private int level = 1; public int Level { [DebuggerStepThrough] get => level; [DebuggerStepThrough] set => level = value; } [Header("物理护甲")] public int physicalArmor = 10;//物理护甲 [Header("魔法护甲")] public int magicArmor = 5;//魔法护甲 public List buffList = new List(); [Header("导航组件")] public SimplePathfindingDoTween Navigation; [System.Serializable ] public class AnimationList//动画list { //[Header("动画是否循环")] public bool isloop = false; [Header("动画图片")] public List value; // 字典的值 [Header("角色动画帧数间隔(毫秒)")] public int CharacterAnimationFrameInterval = 50; } [Header("角色动画")] public List AnimationTree = new List(); [Header("角色动画播放")] public int animationHighlight = 0; [Header("角色精灵位置")] public SpriteRenderer spriteRenderer; [Header("角色Image位置")] public Image image; public delegate void AnimationItem(int AnimationItem); public event AnimationItem OnAnimationStart; public event AnimationItem OnAnimationIng; public event AnimationItem OnAnimationEnd; [Header("动画是否正常播放")] public bool isAnimationPlay = false;//动画是否正常播放 [Header("碰撞体")]public CircleCollider2D mycollider; [Header("攻击脚本")] public Attack attackClass; [Header("当前播放图片序列")] public int CurrentIndex; public virtual async void Start() { maxHp = hp; if (Application.isPlaying) { if (attackClass) { attackClass.role = this; } UpdateBuff(); //Navigation.MoveToNextWaypoint(gameObject); } tag = Enum.GetName(typeof(Camp), camp); updateAnimation(); //AttackScope=1f; } /// /// 角色动画更新 /// public async void updateAnimation() { while (true) { if (AnimationTree.Count == 0) { isAnimationPlay = false; return; } isAnimationPlay = true; if (animationHighlight >= AnimationTree.Count) { animationHighlight = AnimationTree.Count - 1; } else if (animationHighlight < 0) { animationHighlight = 0; } //EditorUtility.SetDirty(this); List LightSprite = AnimationTree[animationHighlight].value; if (LightSprite == null ) { isAnimationPlay = false; return; }; OnAnimationStart?.Invoke(animationHighlight); CurrentIndex = 0; var lsanimationHighlight = animationHighlight; foreach (Sprite sprite in LightSprite) { if (lsanimationHighlight == animationHighlight) { if (image != null) { image.sprite = sprite; } else if (spriteRenderer != null) { spriteRenderer.sprite = sprite; } if (animationHighlight >= 0 && animationHighlight < AnimationTree.Count) { OnAnimationIng?.Invoke(animationHighlight); await Task.Delay(AnimationTree[animationHighlight].CharacterAnimationFrameInterval); } CurrentIndex++; } else { break; } } OnAnimationEnd?.Invoke(lsanimationHighlight); if (lsanimationHighlight == dieIndex) { SpawnPool.intance.ReturnEnemyToPool(this.gameObject); // 回收当前敌人到池中 ResetAllStatus(); } } } /// /// 角色死亡 /// public virtual void die() { if (Application.isPlaying) { animationHighlight = dieIndex; Navigation.PauseAnimation(); Debug.Log("die"); } } /// /// 单位更新buff /// async void UpdateBuff()//单位buff更新 { while (true) { List deleteArr = new List(); foreach (BUff buffItem in buffList) { if (buffItem.executionInterval <= 0) { buffItem.executionInterval = buffItem.executionInterval_max; buffItem.Funaction.Invoke(buffItem.value); } buffItem.executionInterval -= 0.1f; buffItem.timeLeft -= 0.1f; if (buffItem.timeLeft <= 0) { deleteArr.Add(buffItem); } } foreach (BUff item in deleteArr) { buffList.Remove(item); } await Task.Delay(100);//buff检测最小时间0.1秒执行一次 } } /// /// 重置角色所有状态 /// public void ResetAllStatus() { // 重置血量 Hp = 100f; // 重置攻击力 Attack = 10f; // 重置护甲 physicalArmor = 10; magicArmor = 5; // 重置等级 Level = 1; // 重置金币 Gold = 10f; // 清空 Buff 列表 buffList.Clear(); // 如果有导航组件,停止当前的导航行为 if (Navigation != null) { //Navigation.Stop(); // 假设你有 Stop 方法来停止导航 } // 重置角色动画 animationHighlight = 0; isAnimationPlay = false; // 重置碰撞体(根据需求是否需要调整) if (mycollider != null) { mycollider.enabled = true; // 启用碰撞体 } // 如果有其他需要重置的状态,可以在这里添加 } }