Bullet.cs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. using UnityEngine;
  2. using System.Collections;
  3. public class Bullet : MapObject
  4. {
  5. public int id;
  6. public string path;
  7. public float damage;
  8. public float speed = 0;
  9. public float speedAcc = 40f;
  10. public float maxSpeed = 20f;
  11. protected float startTime;
  12. protected ITarget target;
  13. protected Power power;
  14. protected Vector3 lastTargetPosition;
  15. public Transform shotTrans;
  16. public virtual void Init(Map map, Vector3 position, ITarget target, Power power)
  17. {
  18. this.map = map;
  19. this.target = target;
  20. this.power = power;
  21. this.transform.position = position;
  22. InitRotation();
  23. }
  24. public virtual void Reset()
  25. {
  26. startTime = GameTime.time;
  27. BulletSettings settings = GetComponent<BulletSettings>();
  28. if(settings != null)
  29. {
  30. speed = settings.speed;
  31. speedAcc = settings.speedAcc;
  32. maxSpeed = settings.maxSpeed;
  33. }
  34. }
  35. public IPowerOwner GetOwner()
  36. {
  37. return power.GetOwner();
  38. }
  39. public Power GetPower()
  40. {
  41. return power;
  42. }
  43. public ITarget GetTarget()
  44. {
  45. return target;
  46. }
  47. public virtual void InitRotation()
  48. {
  49. if(target == null)
  50. return;
  51. Vector3 targetPos = target.position;
  52. float theta = NumberUtil.getRadianByATan(this.transform.position.x, this.transform.position.z, targetPos.x, targetPos.z);
  53. //updatae rotation
  54. float rotateAngle = -NumberUtil.radianToAngle(theta);
  55. Vector3 eulerAngles = transform.eulerAngles;
  56. eulerAngles.y = rotateAngle;
  57. transform.eulerAngles = eulerAngles;
  58. }
  59. // Update is called once per frame
  60. public virtual void Update ()
  61. {
  62. if(target != null && !target.IsDead())
  63. {
  64. lastTargetPosition = target.position;
  65. }
  66. if(lastTargetPosition == Vector3.zero)
  67. Remove();
  68. float theta = NumberUtil.getRadianByATan(lastTargetPosition.x, lastTargetPosition.z, this.transform.position.x, this.transform.position.z);
  69. //updatae rotation
  70. float rotateAngle = -NumberUtil.radianToAngle(theta);
  71. Vector3 eulerAngles = transform.eulerAngles;
  72. eulerAngles.y = rotateAngle;
  73. transform.eulerAngles = eulerAngles;
  74. //update position
  75. speed += speedAcc*GameTime.deltaTime;
  76. if(speed > maxSpeed)
  77. {
  78. speed = maxSpeed;
  79. }
  80. float movDistance = Mathf.Abs(speed)*GameTime.deltaTime;
  81. float distance = 0;
  82. distance = NumberUtil.distanceVector2(new Vector2(transform.position.x, transform.position.z), new Vector2(lastTargetPosition.x, lastTargetPosition.z));
  83. if(distance < movDistance)
  84. {
  85. MakeDamage();
  86. }
  87. else
  88. {
  89. float movX = movDistance*Mathf.Cos(theta);
  90. float movY = movDistance*Mathf.Sin(theta);
  91. Vector3 position = transform.position;
  92. position.x += movX;
  93. position.z += movY;
  94. transform.position = position;
  95. }
  96. }
  97. protected virtual void MakeDamage()
  98. {
  99. DoDamage(target);
  100. Remove();
  101. }
  102. protected virtual void DoDamage(ITarget target)
  103. {
  104. if(target == null || target.IsDead())
  105. {
  106. return;
  107. }
  108. if(power.GetPowerEffect() == Power.PowerEffect.Damage)
  109. target.MakeDamage(this);
  110. else
  111. target.MakeHeal(this);
  112. if(!StringUtil.Empty(power.GetHitEffect()))
  113. {
  114. GameObject hitEffect = EffectUtil.CreateEffect(power.GetHitEffect());
  115. if(hitEffect != null)
  116. {
  117. hitEffect.SetActive(false);
  118. HitEffectSettings settings = hitEffect.GetComponent<HitEffectSettings>();
  119. if(settings == null)
  120. {
  121. Vector3 heartPos = target.heartPos;
  122. heartPos.x += Random.Range(-0.5f, 0.5f);
  123. heartPos.z += Random.Range(-0.5f, 0.5f);
  124. hitEffect.transform.position = target.heartPos;
  125. hitEffect.SetActive(true);
  126. }
  127. else
  128. {
  129. if(settings.isLocal)
  130. {
  131. GameObject targetObj = (target as Component).gameObject;
  132. hitEffect.transform.SetParent(targetObj.transform);
  133. hitEffect.transform.localPosition = settings.originPos;
  134. hitEffect.transform.eulerAngles = Vector3.zero;
  135. }
  136. hitEffect.SetActive(true);
  137. }
  138. }
  139. power.PlayHitSound();
  140. }
  141. if(power.GetBuff() > 0)
  142. BuffManager.GetInstance().AddBuff(power.GetBuff(), target as BattleObject, power.GetOwner() as BattleObject);
  143. }
  144. public override void Remove ()
  145. {
  146. BulletFactory.Recycle(path, this.gameObject);
  147. }
  148. public override string ToString ()
  149. {
  150. return string.Format ("[Bullet] "+power.ToString());
  151. }
  152. }