using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Threading.Tasks; using UnityEditor; using UnityEngine; using UnityEngine.UI; using Debug = UnityEngine.Debug; /// /// 角色基类,玩家处理事件 /// [ExecuteInEditMode] public class Role : Fun { [Header("血量")] public float hp = 100f;//血量 [Header("掉落")] public float gold = 10f; public float Hp { get => hp; set { hp = value; if (hp <= 0) { die(); } } } [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;//动画是否正常播放 async void Start() { if (Application.isPlaying) { UpdateBuff(); } updateAnimation(); } /// /// 角色动画更新 /// 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秒执行一次 } } // 如果启用 MonoBehaviour,则每个固定帧速率的帧都将调用此函数 private void FixedUpdate() { if (!isAnimationPlay) { updateAnimation(); } } }