using System.Collections; using System.Collections.Generic; using UnityEngine; using static UnityEngine.UI.Image; public class PistolComponent : MonoBehaviour { [SerializeField] private Light targetingLight; private bool IsEnabled = false; GameObject targetObject; [SerializeField] GameObject targetObjectPrefab; [SerializeField] private GameObject projectilePrefab; [SerializeField] private Transform bulletSpawnPoint; [SerializeField] private float firePower = 20f; [SerializeField] private float maxProjectileDuration = 5f; //private Dictionary projectiles = new Dictionary(); // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { } private float CalculateDrop(Vector3 origin,Vector3 destination,Vector3 force) { // Calculate the initial velocity required to reach the destination. Vector3 displacement = destination - origin; float time = Mathf.Sqrt(2f * displacement.magnitude / Physics.gravity.magnitude); Vector3 velocity = (displacement - 0.5f * Physics.gravity * time * time) / time + force; // Calculate the height the object will reach during its flight. float maxHeight = origin.y + velocity.y * time - 0.5f * Physics.gravity.y * time * time; // Calculate the distance the object will drop during its flight. float dropDistance = maxHeight - destination.y; return dropDistance; } private void FixedUpdate() { if (this.IsEnabled) { Ray ray = new Ray(transform.position, transform.up); RaycastHit hit; if (Physics.Raycast(ray, out hit, 50)) { targetObject.gameObject.transform.position = hit.point; float drop = CalculateDrop(this.bulletSpawnPoint.position, hit.point, this.transform.up * this.firePower); print(drop); } } } public void Fire() { GameObject projectile = Instantiate(projectilePrefab, this.bulletSpawnPoint); projectile.transform.localPosition = Vector3.zero; projectile.transform.localEulerAngles = Vector3.zero; projectile.transform.localScale = Vector3.one; Rigidbody pRigid = projectile.GetComponent(); pRigid.AddForce(pRigid.transform.up*this.firePower, ForceMode.Impulse); projectile.transform.parent = null; } public void Enable() { IsEnabled = true; if (targetObject == null) { targetObject = Instantiate(targetObjectPrefab); } } public void Disable() { IsEnabled = false; if (targetObject != null) { Destroy(targetObject); } } public void LightToggle() { this.targetingLight.gameObject.SetActive(!this.targetingLight.gameObject.activeSelf); } public bool IsLightOn { get { return this.targetingLight.gameObject.activeSelf; } } }