ChainBullet.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. using UnityEngine;
  2. using System.Collections;
  3. public class ChainBullet : Bullet {
  4. public float delayEffect = 0.2f;
  5. public float delayRemove = 1f;
  6. private bool effected = false;
  7. public ITarget origin;
  8. private Vector3 lastOriginPosition;
  9. public Transform muzzleTrans;
  10. public Transform flareTrans;
  11. public bool AnimateUV = true; // UV Animation
  12. public float UVTime;
  13. public float Amplitude = 0.3f;
  14. public Texture[] beamFrames;
  15. float initialBeamOffset;
  16. float beamLength;
  17. public LineRenderer lineRenderer;
  18. void Awake()
  19. {
  20. muzzleTrans = transform.FindChild("Muzzle");
  21. flareTrans = transform.FindChild("Flare");
  22. lineRenderer = GetComponent<LineRenderer>();
  23. BulletSettings bulletSettings = GetComponent<BulletSettings>();
  24. if(bulletSettings != null)
  25. {
  26. beamFrames = bulletSettings.beamFrames;
  27. }
  28. Reset ();
  29. }
  30. public override void Reset ()
  31. {
  32. base.Reset ();
  33. initialBeamOffset = Random.Range(0f, 5f);
  34. effected = false;
  35. }
  36. public override void InitRotation ()
  37. {
  38. }
  39. override public void Update ()
  40. {
  41. if(target != null && !target.IsDead())
  42. {
  43. lastTargetPosition = target.heartPos;
  44. }
  45. if(origin != null && !origin.IsDead())
  46. {
  47. if(shotTrans != null)
  48. lastOriginPosition = shotTrans.position;
  49. else
  50. lastOriginPosition = origin.heartPos;
  51. }
  52. if(lastTargetPosition == Vector3.zero || lastOriginPosition == Vector3.zero)
  53. Remove();
  54. UpdateLineRenderer();
  55. // float theta = NumberUtil.getRadianByATan(lastTargetPosition.x, lastTargetPosition.z, lastOriginPosition.x, lastOriginPosition.z);
  56. // float distance = NumberUtil.distanceVector2(new Vector2(lastTargetPosition.x, lastTargetPosition.z), new Vector2(lastOriginPosition.x, lastOriginPosition.z));
  57. //
  58. // //updatae rotation
  59. // float rotateAngle = -NumberUtil.radianToAngle(theta);
  60. // Vector3 eulerAngles = transform.eulerAngles;
  61. // eulerAngles.y = rotateAngle;
  62. // transform.eulerAngles = eulerAngles;
  63. //
  64. // transform.localScale = new Vector3(distance, 1f, 1f);
  65. //
  66. // Vector3 position = new Vector3();
  67. // position.x = (lastTargetPosition.x+lastOriginPosition.x)/2f;
  68. // position.y = 1f;
  69. // position.z = (lastTargetPosition.z+lastOriginPosition.z)/2f;
  70. // transform.position = position;
  71. float deltaTime = GameTime.time-startTime;
  72. if(!effected && deltaTime >= delayEffect)
  73. {
  74. DoDamage(target);
  75. effected = true;
  76. }
  77. else if(deltaTime >= delayRemove)
  78. {
  79. Remove();
  80. }
  81. }
  82. private void UpdateLineRenderer()
  83. {
  84. transform.position = lastOriginPosition;
  85. muzzleTrans.position = lastOriginPosition;
  86. flareTrans.position = lastTargetPosition;
  87. lineRenderer.material.SetTextureOffset("_MainTex", new Vector2(GameTime.time * UVTime + initialBeamOffset, 0f));
  88. // Process raycasting
  89. OnOscillate();
  90. OnFrameStep();
  91. }
  92. void OnOscillate()
  93. {
  94. lineRenderer.SetVertexCount(2);
  95. lineRenderer.SetPosition(0, new Vector3(0, 0, 0));
  96. float x = lastTargetPosition.x - lastOriginPosition.x;
  97. float z = lastTargetPosition.z - lastOriginPosition.z;
  98. lineRenderer.SetPosition(1, new Vector3(x, 0, z));
  99. }
  100. float GetRandomNoise()
  101. {
  102. return Random.Range(-Amplitude, Amplitude);
  103. }
  104. void OnFrameStep()
  105. {
  106. if(beamFrames == null)
  107. return;
  108. int frameNo = Random.Range(0, beamFrames.Length);
  109. lineRenderer.material.mainTexture = beamFrames[frameNo];
  110. }
  111. }