CBullet.cs 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357
  1. using System;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. namespace YLBattle
  5. {
  6. /// <summary>
  7. /// 子弹定义
  8. /// </summary>
  9. public class CBullet
  10. {
  11. /// <summary>
  12. /// 子弹唯一标示符
  13. /// </summary>
  14. private string mID = string.Empty;
  15. /// <summary>
  16. /// 子弹隶属技能模板ID
  17. /// </summary>
  18. private string mTID = string.Empty;
  19. /// <summary>
  20. /// 是否为必杀技
  21. /// </summary>
  22. private bool mIsKill = false;
  23. /// <summary>
  24. /// 技能等级
  25. /// </summary>
  26. private int mLevel = 0;
  27. /// <summary>
  28. /// 是否标记目标
  29. /// </summary>
  30. private bool mIsMarkTrg = false;
  31. /// <summary>
  32. /// 生成序号
  33. /// </summary>
  34. private int mSN = 0;
  35. /// <summary>
  36. /// 技能创建者id
  37. /// </summary>
  38. private string mCastFighter = null;
  39. /// <summary>
  40. /// 子弹目标
  41. /// </summary>
  42. private string mTrgFighter = null;
  43. /// <summary>
  44. /// 当前所在位置
  45. /// </summary>
  46. private Vector3 mCurrentPos = Vector3.zero;
  47. /// <summary>
  48. /// 子弹目标类型
  49. /// </summary>
  50. private EBulletTargeType mTargetType;
  51. /// <summary>
  52. /// 当前子弹瞄准策略
  53. /// </summary>
  54. private IBulletAIM mAimPolicy;
  55. /// <summary>
  56. /// 当前子弹伤害目标锁定策略
  57. /// </summary>
  58. private IBulletAIM mDamagePolicy;
  59. /// <summary>
  60. /// 子弹目标参数
  61. /// </summary>
  62. private object mTargetParam;
  63. /// <summary>
  64. /// 子弹状态机
  65. /// </summary>
  66. private CBulletFSM mFSM = null;
  67. /// <summary>
  68. /// 发射时间
  69. /// </summary>
  70. private long mLaunchTime = long.MinValue;
  71. /// <summary>
  72. /// 子弹回收标志
  73. /// </summary>
  74. private bool mIsDead = false;
  75. /// <summary>
  76. /// 碰撞事件队列
  77. /// </summary>
  78. private Queue<BulletCollideEvent> mCollideQueue = new Queue<BulletCollideEvent>();
  79. /// <summary>
  80. /// 外部触发回传参数
  81. /// </summary>
  82. public string mTriggerParm = string.Empty;
  83. /// <summary>
  84. /// 构造函数
  85. /// </summary>
  86. /// <param name="env">环境上下文数据</param>
  87. /// <param name="id">唯一编号</param>
  88. /// <param name="tid">模板编号</param>
  89. /// <param name="sn">序列号</param>
  90. /// <param name="caster">施法者</param>
  91. /// <param name="target">目标</param>
  92. /// <param name="level">技能等级</param>
  93. /// <param name="aimPolicy">瞄准策略</param>
  94. /// <param name="aimPrm">瞄准附加</param>
  95. public CBullet(BattleParam env, string id, string tid, int sn, string caster, string target, bool ismarktrg,
  96. int level,
  97. IBulletAIM aimPolicy,
  98. IBulletAIM damaPolicy,
  99. int aimPrm = 0,
  100. string triggerparm = "")
  101. {
  102. this.mID = id;
  103. this.mTID = tid;
  104. this.mSN = sn;
  105. this.mCastFighter = caster;
  106. this.mTrgFighter = target;
  107. this.mLevel = level;
  108. this.mIsMarkTrg = ismarktrg;
  109. this.mCurrentPos = Vector3.zero;
  110. this.mAimPolicy = aimPolicy;
  111. this.mDamagePolicy = damaPolicy;
  112. this.mTriggerParm = triggerparm;
  113. this.mFSM = new CBulletFSM();
  114. this.mFSM.Initialize(env, this);
  115. }
  116. /// <summary>
  117. /// 获取子弹状态机
  118. /// </summary>
  119. /// <returns>状态机对象</returns>
  120. public CBulletFSM FSM()
  121. {
  122. return this.mFSM;
  123. }
  124. /// <summary>
  125. /// 帧周期调度
  126. /// </summary>
  127. public void OnUpdate()
  128. {
  129. if (null != this.mFSM)
  130. {
  131. this.mFSM.OnUpdateFSM();
  132. }
  133. }
  134. #region(数据相关)
  135. /// <summary>
  136. /// 获取子弹实例ID
  137. /// </summary>
  138. /// <returns>实例id</returns>
  139. public string ID()
  140. {
  141. return this.mID;
  142. }
  143. /// <summary>
  144. /// 获取模板(所属技能)数据ID
  145. /// </summary>
  146. /// <returns>模板数据id</returns>
  147. public string TID()
  148. {
  149. return this.mTID;
  150. }
  151. /// <summary>
  152. /// 必杀技能
  153. /// </summary>
  154. /// <returns>模板数据id</returns>
  155. public bool IsKill()
  156. {
  157. return this.mIsKill;
  158. }
  159. /// <summary>
  160. /// 获取技能等级
  161. /// </summary>
  162. /// <returns>技能等级</returns>
  163. public int Level()
  164. {
  165. return this.mLevel;
  166. }
  167. /// <summary>
  168. /// 获取子弹生成序号
  169. /// </summary>
  170. /// <returns>序号id</returns>
  171. public int SN()
  172. {
  173. return this.mSN;
  174. }
  175. /// <summary>
  176. /// 获取子弹发射者
  177. /// </summary>
  178. /// <returns>发射者id</returns>
  179. public string Owner()
  180. {
  181. return this.mCastFighter;
  182. }
  183. /// <summary>
  184. /// 子弹瞄准的目标
  185. /// </summary>
  186. /// <returns>发射者id</returns>
  187. public string AimTarget()
  188. {
  189. return this.mTrgFighter;
  190. }
  191. /// <summary>
  192. /// 瞄准策略
  193. /// </summary>
  194. /// <returns></returns>
  195. public IBulletAIM AimPolicy()
  196. {
  197. return this.mAimPolicy;
  198. }
  199. /// <summary>
  200. /// 伤害策略
  201. /// </summary>
  202. /// <returns></returns>
  203. public IBulletAIM DamagePolicy()
  204. {
  205. return this.mDamagePolicy;
  206. }
  207. /// <summary>
  208. /// 获取子弹当前所在位置
  209. /// </summary>
  210. /// <returns>位置信息</returns>
  211. public Vector3 CurrentPos()
  212. {
  213. return this.mCurrentPos;
  214. }
  215. /// <summary>
  216. /// 修改子弹当前位置
  217. /// </summary>
  218. /// <param name="seat">占位</param>
  219. public void ModifyCurrentPos(Vector3 pos)
  220. {
  221. this.mCurrentPos = pos;
  222. }
  223. /// <summary>
  224. /// 获取目标类型
  225. /// </summary>
  226. /// <returns>目标类型</returns>
  227. public EBulletTargeType CurrentTargetType()
  228. {
  229. return this.mTargetType;
  230. }
  231. /// <summary>
  232. /// 获取子弹目标参数(目标ID)
  233. /// </summary>
  234. /// <returns>目标ID</returns>
  235. public object CurrentTargetParam()
  236. {
  237. return this.mTargetParam;
  238. }
  239. /// <summary>
  240. /// 设置目标数据
  241. /// </summary>
  242. /// <param name="type">目标类型</param>
  243. /// <param name="param">参数</param>
  244. public void SetTarget(EBulletTargeType type, object param)
  245. {
  246. this.mTargetType = type;
  247. this.mTargetParam = param;
  248. }
  249. /// <summary>
  250. /// 设置子弹发射时间
  251. /// </summary>
  252. /// <param name="time">时间</param>
  253. public void SetLaunchTime(long time)
  254. {
  255. this.mLaunchTime = time;
  256. }
  257. /// <summary>
  258. /// 获取子弹发射时间
  259. /// </summary>
  260. /// <returns>时间</returns>
  261. public long GetLaunchTime()
  262. {
  263. return this.mLaunchTime;
  264. }
  265. /// <summary>
  266. /// 获取碰撞事件数量
  267. /// </summary>
  268. /// <returns>数量值</returns>
  269. public int HasCollideEvent()
  270. {
  271. return this.mCollideQueue.Count;
  272. }
  273. /// <summary>
  274. /// 出队碰撞事件
  275. /// </summary>
  276. /// <returns>没有事件返回NULL</returns>
  277. public BulletCollideEvent CollideEvent()
  278. {
  279. if (this.mCollideQueue.Count == 0)
  280. {
  281. return null;
  282. }
  283. return this.mCollideQueue.Dequeue();
  284. }
  285. /// <summary>
  286. /// 入队碰撞事件
  287. /// </summary>
  288. /// <param name="bce">事件描述</param>
  289. public void EnqueueCollideEvent(BulletCollideEvent bce)
  290. {
  291. this.mCollideQueue.Enqueue(bce);
  292. }
  293. /// <summary>
  294. /// 标记子弹为待回收状态
  295. /// </summary>
  296. public void MarkBulletDead()
  297. {
  298. this.mIsDead = true;
  299. }
  300. /// <summary>
  301. /// 检测子弹是否为待回收状态
  302. /// </summary>
  303. /// <returns>true待回收, false不用回收</returns>
  304. public bool IsBulletDead()
  305. {
  306. return this.mIsDead;
  307. }
  308. /// <summary>
  309. /// 检测子弹是否为待回收状态
  310. /// </summary>
  311. /// <returns>true待回收, false不用回收</returns>
  312. public bool IsMarkTrg()
  313. {
  314. return this.mIsMarkTrg;
  315. }
  316. #endregion
  317. }
  318. }