Bullet.cs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  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 virtual void InitRotation()
  44. {
  45. if(target == null)
  46. return;
  47. Vector3 targetPos = target.position;
  48. float theta = NumberUtil.getRadianByATan(this.transform.position.x, this.transform.position.z, targetPos.x, targetPos.z);
  49. //updatae rotation
  50. float rotateAngle = -NumberUtil.radianToAngle(theta);
  51. Vector3 eulerAngles = transform.eulerAngles;
  52. eulerAngles.y = rotateAngle;
  53. transform.eulerAngles = eulerAngles;
  54. }
  55. // Update is called once per frame
  56. public virtual void Update ()
  57. {
  58. if(target != null && !target.IsDead())
  59. {
  60. lastTargetPosition = target.position;
  61. }
  62. if(lastTargetPosition == Vector3.zero)
  63. Remove();
  64. float theta = NumberUtil.getRadianByATan(lastTargetPosition.x, lastTargetPosition.z, this.transform.position.x, this.transform.position.z);
  65. //updatae rotation
  66. float rotateAngle = -NumberUtil.radianToAngle(theta);
  67. Vector3 eulerAngles = transform.eulerAngles;
  68. eulerAngles.y = rotateAngle;
  69. transform.eulerAngles = eulerAngles;
  70. //update position
  71. speed += speedAcc*GameTime.deltaTime;
  72. if(speed > maxSpeed)
  73. {
  74. speed = maxSpeed;
  75. }
  76. float movDistance = Mathf.Abs(speed)*GameTime.deltaTime;
  77. float distance = 0;
  78. distance = NumberUtil.distanceVector2(new Vector2(transform.position.x, transform.position.z), new Vector2(lastTargetPosition.x, lastTargetPosition.z));
  79. if(distance < movDistance)
  80. {
  81. MakeDamage();
  82. }
  83. else
  84. {
  85. float movX = movDistance*Mathf.Cos(theta);
  86. float movY = movDistance*Mathf.Sin(theta);
  87. Vector3 position = transform.position;
  88. position.x += movX;
  89. position.z += movY;
  90. transform.position = position;
  91. }
  92. }
  93. protected virtual void MakeDamage()
  94. {
  95. DoDamage(target);
  96. Remove();
  97. }
  98. protected virtual void DoDamage(ITarget target)
  99. {
  100. if(target == null || target.IsDead())
  101. {
  102. return;
  103. }
  104. if(power.GetPowerEffect() == Power.PowerEffect.Damage)
  105. target.MakeDamage(this);
  106. else
  107. target.MakeHeal(this);
  108. if(!StringUtil.Empty(power.GetHitEffect()))
  109. {
  110. GameObject hitEffect = EffectUtil.CreateEffect(power.GetHitEffect());
  111. if(hitEffect != null)
  112. {
  113. hitEffect.SetActive(false);
  114. HitEffectSettings settings = hitEffect.GetComponent<HitEffectSettings>();
  115. if(settings == null)
  116. {
  117. Vector3 heartPos = target.heartPos;
  118. heartPos.x += Random.Range(-0.5f, 0.5f);
  119. heartPos.z += Random.Range(-0.5f, 0.5f);
  120. hitEffect.transform.position = target.heartPos;
  121. hitEffect.SetActive(true);
  122. }
  123. else
  124. {
  125. if(settings.isLocal)
  126. {
  127. GameObject targetObj = (target as Component).gameObject;
  128. hitEffect.transform.SetParent(targetObj.transform);
  129. hitEffect.transform.localPosition = settings.originPos;
  130. hitEffect.transform.eulerAngles = Vector3.zero;
  131. }
  132. hitEffect.SetActive(true);
  133. }
  134. }
  135. power.PlayHitSound();
  136. }
  137. if(power.GetBuff() > 0)
  138. BuffManager.GetInstance().AddBuff(power.GetBuff(), target as BattleObject, power.GetOwner() as BattleObject);
  139. }
  140. public override void Remove ()
  141. {
  142. BulletFactory.Recycle(path, this.gameObject);
  143. }
  144. public override string ToString ()
  145. {
  146. return string.Format ("[Bullet] "+power.ToString());
  147. }
  148. }