Role.cs 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using FSBuff;
  5. using FSAssist;
  6. using UnityEngine.UI;
  7. namespace FSRole {
  8. /*
  9. * 角色组件
  10. */
  11. public class Role : MonoBehaviour {
  12. // 角色原始属性
  13. public RoleAttr OriginAttr;
  14. // 角色当前属性
  15. public RoleAttr CurrentAttr;
  16. // 角色所挂载的BUFF数组,所有Buff都放在这里面
  17. public ArrayList buffs;
  18. // 血条
  19. private float originWidth;
  20. private RectTransform bloodRect;
  21. // 格挡值
  22. public Transform parryTransform;
  23. public void SetBloodTrs(Transform blood) {
  24. bloodRect = blood.Find("Blood").GetComponent<RectTransform>();
  25. originWidth = bloodRect.rect.width;
  26. }
  27. // Use this for initialization
  28. void Start() {
  29. buffs = new ArrayList();
  30. }
  31. // Update is called once per frame
  32. void Update() {
  33. }
  34. /*
  35. * 添加角色的各个接口
  36. */
  37. /*
  38. * 受到伤害
  39. */
  40. public void GetDamage(int value) {
  41. int damage = DamagePassBuff(value);
  42. print("角色 : " + CurrentAttr.ID + " 受到了 " + damage + " 点伤害,剩余血量 : " + (CurrentAttr.Hp + damage));
  43. CurrentAttr.Hp += damage;
  44. // 当血量大于0时
  45. if (CurrentAttr.Hp >= 0) {
  46. float newWidth = (float)CurrentAttr.Hp / OriginAttr.Hp * originWidth;
  47. print("长度对比 : new = " + newWidth + ", origin = " + originWidth);
  48. bloodRect.sizeDelta = new Vector2(newWidth, 0.8f);
  49. //bloodRect.rect.width = newWidth;
  50. } else {
  51. print("角色 : " + CurrentAttr.ID + " 死了 ...");
  52. }
  53. }
  54. /*
  55. * 消耗精力
  56. */
  57. public void CostEngine(int value) {
  58. CurrentAttr.Mp -= value;
  59. }
  60. /*
  61. * 增加防御力
  62. */
  63. public void Defense(int value) {
  64. print("角色 : " + CurrentAttr.ID + "增加了" + value + "点防御,当前防御 : " + (CurrentAttr.Def + value));
  65. CurrentAttr.Def += value;
  66. parryTransform.GetComponent<Text>().text = "格挡值 : " + CurrentAttr.Def;
  67. }
  68. /*
  69. * 运行BUFF
  70. */
  71. public void BuffExecute() {
  72. //// 遍历数组来运行BUFF
  73. //foreach (Buff index in buffs) {
  74. // print("角色" + CurrentAttr.ID + "的Buff ID 为 " + index.ID);
  75. // index.Execute();
  76. //}
  77. int index = buffs.Count - 1;
  78. while (true) {
  79. // 当索引位置小于0时,结束查询
  80. if (index < 0) {
  81. return;
  82. }
  83. Debug.Log("运行一个Buff : " + index);
  84. Buff buff = (Buff)buffs[index];
  85. buff.Execute();
  86. index--;
  87. }
  88. }
  89. /*
  90. * 添加Buff
  91. */
  92. public void AddBuff(Buff buff) {
  93. // 首先判断数组中是否已经存在此Buff
  94. // 未来还需要根据两个相同buff的属性来进行更新
  95. foreach (Buff index in buffs) {
  96. if (index.ID.Equals(buff.ID)) {
  97. // 未来在这里做些什么
  98. // 如果有同样的BUFF,则更新原BUFF,并叠加层数
  99. index.Round = buff.Round;
  100. index.Overlay++;
  101. // 获取指定的Sprite
  102. SpriteRenderer getRender = index.transform.Find("num").GetComponent<SpriteRenderer>();
  103. Texture2D getTex = Resources.Load<Texture2D>(string.Format("Textures/Cards/Buff/overlay_{0:d2}", index.Overlay));
  104. if (getTex != null && getRender != null) {
  105. Sprite numSprite = Sprite.Create(getTex, new Rect(0, 0, getTex.width, getTex.height), new Vector3(0.5f, 0));
  106. getRender.sprite = numSprite;
  107. }
  108. }
  109. // 调整Buff图片的位置
  110. index.transform.position = new Vector3(0.3f * buffs.Count, 1.5f, 1) + transform.position;
  111. }
  112. GameObject buffObj = Instantiate(Resources.Load("Prefabs/BuffSub"), transform) as GameObject;
  113. buff.transform = buffObj.transform;
  114. buffObj.transform.position = new Vector3(0.3f * buffs.Count, 1.5f, 1) + transform.position;
  115. // 获取Buff图片和层数图片
  116. SpriteRenderer buffRender = buff.transform.Find("buff").GetComponent<SpriteRenderer>();
  117. SpriteRenderer numRender = buff.transform.Find("num").GetComponent<SpriteRenderer>();
  118. // 获取图片资源
  119. Texture2D buffTex = Resources.Load<Texture2D>("Textures/Cards/Buff/buff_" + buff.ID);
  120. Texture2D numTex = Resources.Load<Texture2D>(string.Format("Textures/Cards/Buff/overlay_{0:d2}", buff.Overlay));
  121. // 添加上图片
  122. if (buffTex != null) {
  123. Sprite buffSprite = Sprite.Create(buffTex, new Rect(0, 0, buffTex.width, buffTex.height), new Vector3(0.5f, 0.5f));
  124. buffRender.sprite = buffSprite;
  125. }
  126. if (numTex != null) {
  127. Sprite numSprite = Sprite.Create(numTex, new Rect(0, 0, numTex.width, numTex.height), new Vector3(0.5f, 0.5f));
  128. numRender.sprite = numSprite;
  129. }
  130. // 往数组中添加数组
  131. buffs.Add(buff);
  132. }
  133. /*
  134. * 移除Buff
  135. */
  136. public void EraseBuff(Buff buff) {
  137. // 从数组中查找
  138. foreach (Buff index in buffs) {
  139. if (index.ID.Equals(buff.ID)) {
  140. print("角色 " + CurrentAttr.ID + " 取消BUFF " + buff.ID);
  141. buffs.Remove(index);
  142. Destroy(index.transform.gameObject);
  143. return;
  144. }
  145. }
  146. }
  147. /*
  148. * 攻击时经过Buff判定
  149. */
  150. private int DamagePassBuff(int value) {
  151. // 根据不同的Buff给出不同的处理
  152. if (ContainBuff(AssistConfig.Fracture)) {
  153. print("存在骨折Buff的影响 ... ");
  154. Buff buff = GetBuff(AssistConfig.Fracture);
  155. // 根据叠加层数来进行判断
  156. if (buff.Overlay < 3) {
  157. // 当层数小于3时
  158. return (int)(value * 1.2f);
  159. } else if (buff.Overlay >= 3 && buff.Overlay < 6) {
  160. // 当层数小于6时
  161. return (int)(value * 1.4f);
  162. } else if (buff.Overlay >= 6 && buff.Overlay < 9) {
  163. // 当层数小于9时
  164. return (int)(value * 1.6f);
  165. } else {
  166. // 层数大于9时
  167. return (int)(value * (1.6f + (buff.Overlay - 9) * 0.2f));
  168. }
  169. }
  170. return value;
  171. }
  172. /*
  173. * 比牌时经过Buff判定
  174. */
  175. public int CompairePassBuff(int value) {
  176. // 根据不同的Buff给出不同的处理
  177. if (ContainBuff(AssistConfig.Paralysis)) {
  178. Buff buff = GetBuff(AssistConfig.Paralysis);
  179. print("存在麻痹Buff的影响 ... " + buff.Overlay);
  180. // 根据叠加层数来进行判断
  181. if (buff.Overlay < 3) {
  182. // 当层数小于3时
  183. return value - 1;
  184. } else if (buff.Overlay >= 3 && buff.Overlay < 6) {
  185. // 当层数小于6时
  186. return value - 2;
  187. } else if (buff.Overlay >= 6 && buff.Overlay < 9) {
  188. // 当层数小于9时
  189. return value - 3;
  190. } else {
  191. // 层数大于9时
  192. return value - 3 - (buff.Overlay - 9);
  193. }
  194. }
  195. return value;
  196. }
  197. /*
  198. * 判断是否有包含某个数组
  199. */
  200. private bool ContainBuff(string ID) {
  201. foreach (Buff index in buffs) {
  202. // 根据ID来判断
  203. if (index.ID == ID) {
  204. return true;
  205. }
  206. }
  207. return false;
  208. }
  209. /*
  210. * 获取指定ID的Buff
  211. */
  212. private Buff GetBuff(string ID) {
  213. foreach (Buff index in buffs) {
  214. // 根据ID来判断
  215. if (index.ID == ID) {
  216. return index;
  217. }
  218. }
  219. return null;
  220. }
  221. }
  222. }