Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- namespace Battle
- {
- public class ArrowsSpawner : MonoBehaviour
- {
- public const float GRAVITY_FORCE = 9.81f;
- public float MaxZ;
- public float MaxAngle; //shoot angle when distance = maxZ
- public float ArrowTime; //shoot angle when distance = maxZ
- public Vector3 target;
- [HideInInspector]
- public float z; //distance from target
- [HideInInspector]
- public Vector3 v0; //velocity of arrow when shooted
- [HideInInspector]
- public float angle; //angle from the ground when shooted
- [HideInInspector]
- public ParticleSystem arrowParticleSystem;
- void Awake()
- {
- arrowParticleSystem = GetComponentInChildren<ParticleSystem>();
- }
- public void ShootArrow(Entity enemy)
- {
- if (enemy != null)
- {
- CalculateShootParametersAndAimAtTarget(enemy);
- var path = (enemy.AgentManager.Agent.velocity * ArrowTime);
- Vector3 foreseenPosition = this.target + path;
- //TODO: Wtf liczymy dla aktualnej pozycji wroga, a strzelamy potem do pozycji przewidywannej?
- ShootArrow(foreseenPosition);
- }
- }
- public void ShootArrow(Vector3 target)
- {
- this.target = target;
- CalculateShootParametersAndAimAtTarget();
- EmitArrow();
- }
- public void CalculateShootParametersAndAimAtTarget(Entity enemy)
- {
- arrowParticleSystem.trigger.SetCollider(0, enemy.transform);
- this.target = enemy.AgentManager.Agent.nextPosition;
- CalculateShootParametersAndAimAtTarget();
- }
- public void CalculateShootParametersAndAimAtTarget(Vector3 position)
- {
- this.target = position;
- CalculateShootParametersAndAimAtTarget();
- }
- public void CalculateShootParametersAndAimAtTarget()
- {
- //Celuj cz.1
- transform.LookAt(target);
- transform.eulerAngles = new Vector3(0.0f, transform.eulerAngles.y, 0.0f);
- //Oblicz parametry cz.1
- z = Vector3.Distance(transform.position, target);
- z = Mathf.Min(z, MaxZ);
- angle = MaxAngle * (Mathf.Max(z, 0.5f) / MaxZ);
- //Celuj cz.2
- arrowParticleSystem.transform.localEulerAngles = new Vector3(angle, 180.0f, 0.0f);
- //Oblicz parametry cz.2
- float speed = Mathf.Sqrt((z * arrowParticleSystem.main.gravityModifierMultiplier * GRAVITY_FORCE) / Mathf.Sin(2 * (Mathf.Deg2Rad * angle)));
- v0 = -arrowParticleSystem.transform.forward * speed;
- ArrowTime = (z / new Vector2(v0.x, v0.z).magnitude);
- }
- public void EmitArrow()
- {
- ParticleSystem.EmitParams emitParams = new ParticleSystem.EmitParams();
- emitParams.velocity = v0;
- arrowParticleSystem.Emit(emitParams, 1);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement