public virtual float Fire(Transform firePoint, LayerMask whatIsTarget, float fireDelay, float fireTimer) { bool canFire = Time.time > fireTimer; #region fire part if (canFire) { RaycastHelper raycasts = GameSceneSettings.Instance.RaycastFunctions; Vector3 hitPos = raycasts.FromAToBRaycast(firePoint.gameObject, firePoint.forward, whatIsTarget, out GameObject objHit); if (objHit != null) { IHumanoid hitHumanoid = null; if ((hitHumanoid = objHit.GetComponent <IHumanoid>()) != null) { hitHumanoid.TakeDamage(Owner.StateMachineOwner.ThisStats as IDamager); } } Transform rayClone = Object.Instantiate(GameSceneSettings.Instance.GetRayPrefab, Vector3.zero, Quaternion.identity) as Transform; Transform rayGunFireClone = Object.Instantiate(GameSceneSettings.Instance.GetRayHoleEffectPrefab, Vector3.zero, Quaternion.identity) as Transform; Vector3 firePos = firePoint.position; rayGunFireClone.position = firePos; rayGunFireClone.localScale *= 0.5f; rayGunFireClone.parent = Owner.StateMachineOwner.transform; rayClone.position = firePos; rayClone.forward = (hitPos - firePos).normalized; Vector3 rayCloneLocalScale = rayClone.localScale; if (GameSceneSettings.Instance.rayType == RayType.BasicRays) { Transform rayPointFireClone = Object.Instantiate(GameSceneSettings.Instance.GetRayHoleEffectPrefab, Vector3.zero, Quaternion.identity) as Transform; rayPointFireClone.position = hitPos; rayPointFireClone.localScale *= 0.2f; if (objHit == null) { rayPointFireClone.parent = GameSceneSettings.Instance.GetRayContainer; } else { rayPointFireClone.parent = objHit.transform; } rayClone.localScale = new Vector3(rayCloneLocalScale.x, rayCloneLocalScale.y, (hitPos - firePoint.position).magnitude); // now how to move the ray... rayClone.parent = GameSceneSettings.Instance.GetRayContainer; Object.Destroy(rayClone.gameObject, GameSceneSettings.Instance.GetRayLifeTime); } else if (GameSceneSettings.Instance.rayType == RayType.FancyRays) { float dist = (hitPos - firePoint.position).magnitude; float distMultiplier = Mathf.Clamp(dist * 0.1f, 0.1f, 10f); float raySize = Mathf.Clamp(dist / 3f, 1f, 10f); rayClone.localScale = new Vector3(rayClone.localScale.x, rayCloneLocalScale.y, raySize); rayClone.parent = GameSceneSettings.Instance.GetRayContainer; Owner.StateMachineOwner.StartCoroutine(MoveRay(rayClone, hitPos, GameSceneSettings.Instance.GetFancyRaySpeedDelta * distMultiplier)); } Object.Destroy(rayGunFireClone.gameObject, GameSceneSettings.Instance.GetRayLifeTime); fireTimer = Time.time + fireDelay; // heatPercentage += 3f; // // if (heatPercentage >= 100f) // { // // Debug.Log("Overheated !"); // hasOverheated = true; // heatCoolTimer = fireTimer + heatCoolDelay * 1.2f; // } // else // { // heatCoolTimer = fireTimer + heatCoolDelay; // } } #endregion return(fireTimer); }