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;//血量 public float Hp { get => hp; set { hp = value; 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; public virtual async void Start() { 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); foreach (Sprite sprite in LightSprite) { 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); } } OnAnimationEnd?.Invoke(animationHighlight); } } /// /// 角色死亡 /// public virtual void die() { if (Application.isPlaying) { Destroy(gameObject); } } /// /// 单位更新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秒执行一次 } } }