Advertisement
Guest User

Untitled

a guest
Dec 9th, 2019
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.10 KB | None | 0 0
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4.  
  5.  
  6. namespace Battle
  7. {
  8.  
  9. public class ArrowsSpawner : MonoBehaviour
  10. {
  11. public const float GRAVITY_FORCE = 9.81f;
  12.  
  13. public float MaxZ;
  14. public float MaxAngle; //shoot angle when distance = maxZ
  15. public float ArrowTime; //shoot angle when distance = maxZ
  16. public Vector3 target;
  17.  
  18. [HideInInspector]
  19. public float z; //distance from target
  20. [HideInInspector]
  21. public Vector3 v0; //velocity of arrow when shooted
  22. [HideInInspector]
  23. public float angle; //angle from the ground when shooted
  24. [HideInInspector]
  25. public ParticleSystem arrowParticleSystem;
  26.  
  27. void Awake()
  28. {
  29. arrowParticleSystem = GetComponentInChildren<ParticleSystem>();
  30. }
  31.  
  32. public void ShootArrow(Entity enemy)
  33. {
  34. if (enemy != null)
  35. {
  36. CalculateShootParametersAndAimAtTarget(enemy);
  37. var path = (enemy.AgentManager.Agent.velocity * ArrowTime);
  38. Vector3 foreseenPosition = this.target + path;
  39. //TODO: Wtf liczymy dla aktualnej pozycji wroga, a strzelamy potem do pozycji przewidywannej?
  40. ShootArrow(foreseenPosition);
  41. }
  42. }
  43.  
  44. public void ShootArrow(Vector3 target)
  45. {
  46. this.target = target;
  47. CalculateShootParametersAndAimAtTarget();
  48. EmitArrow();
  49. }
  50.  
  51. public void CalculateShootParametersAndAimAtTarget(Entity enemy)
  52. {
  53. arrowParticleSystem.trigger.SetCollider(0, enemy.transform);
  54. this.target = enemy.AgentManager.Agent.nextPosition;
  55. CalculateShootParametersAndAimAtTarget();
  56. }
  57.  
  58. public void CalculateShootParametersAndAimAtTarget(Vector3 position)
  59. {
  60. this.target = position;
  61. CalculateShootParametersAndAimAtTarget();
  62. }
  63.  
  64. public void CalculateShootParametersAndAimAtTarget()
  65. {
  66. //Celuj cz.1
  67. transform.LookAt(target);
  68. transform.eulerAngles = new Vector3(0.0f, transform.eulerAngles.y, 0.0f);
  69.  
  70. //Oblicz parametry cz.1
  71. z = Vector3.Distance(transform.position, target);
  72. z = Mathf.Min(z, MaxZ);
  73. angle = MaxAngle * (Mathf.Max(z, 0.5f) / MaxZ);
  74.  
  75. //Celuj cz.2
  76. arrowParticleSystem.transform.localEulerAngles = new Vector3(angle, 180.0f, 0.0f);
  77.  
  78. //Oblicz parametry cz.2
  79. float speed = Mathf.Sqrt((z * arrowParticleSystem.main.gravityModifierMultiplier * GRAVITY_FORCE) / Mathf.Sin(2 * (Mathf.Deg2Rad * angle)));
  80. v0 = -arrowParticleSystem.transform.forward * speed;
  81. ArrowTime = (z / new Vector2(v0.x, v0.z).magnitude);
  82. }
  83.  
  84. public void EmitArrow()
  85. {
  86. ParticleSystem.EmitParams emitParams = new ParticleSystem.EmitParams();
  87. emitParams.velocity = v0;
  88. arrowParticleSystem.Emit(emitParams, 1);
  89. }
  90. }
  91.  
  92. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement