public int HitsInRange() { if (alreadyCountedInChainForAimThisFrame) { return(0); // already visited - also avoids recusive/feedback lock up } int hitsThroughMe = 1; // counts itself alreadyCountedInChainForAimThisFrame = true; // will stop from revisiting itself Collider[] allNear = Physics.OverlapSphere(transform.position, blastRadius); for (int i = 0; i < allNear.Length; i++) { ExplodeChainReact ecrScriptNext = allNear[i].gameObject.GetComponent <ExplodeChainReact>(); if (ecrScriptNext && ecrScriptNext.alreadyCountedInChainForAimThisFrame == false) { hitsThroughMe += ecrScriptNext.HitsInRange(); } } return(hitsThroughMe); }
void Update() { float thicknessRange = 0.4f; RaycastHit[] laserMiddle = Physics.RaycastAll(transform.position, transform.forward); RaycastHit[] laserLeft = Physics.RaycastAll(transform.position - transform.right * thicknessRange, transform.forward); RaycastHit[] laserRight = Physics.RaycastAll(transform.position + transform.right * thicknessRange, transform.forward); RaycastHit[] laserUp = Physics.RaycastAll(transform.position + transform.up * thicknessRange, transform.forward); RaycastHit[] laserDown = Physics.RaycastAll(transform.position - transform.up * thicknessRange, transform.forward); float roundedPerc = 0.707f; RaycastHit[] laserUL = Physics.RaycastAll(transform.position + transform.up * thicknessRange * roundedPerc - transform.right * thicknessRange * roundedPerc, transform.forward); RaycastHit[] laserUR = Physics.RaycastAll(transform.position + transform.up * thicknessRange * roundedPerc + transform.right * thicknessRange * roundedPerc, transform.forward); RaycastHit[] laserDL = Physics.RaycastAll(transform.position - transform.up * thicknessRange * roundedPerc - transform.right * thicknessRange * roundedPerc, transform.forward); RaycastHit[] laserDR = Physics.RaycastAll(transform.position - transform.up * thicknessRange * roundedPerc + transform.right * thicknessRange * roundedPerc, transform.forward); List <RaycastHit> rhListTemp = new List <RaycastHit>(); AddArrayIntoListIfUnique(rhListTemp, laserLeft); AddArrayIntoListIfUnique(rhListTemp, laserRight); AddArrayIntoListIfUnique(rhListTemp, laserUp); AddArrayIntoListIfUnique(rhListTemp, laserDown); AddArrayIntoListIfUnique(rhListTemp, laserUL); AddArrayIntoListIfUnique(rhListTemp, laserUR); AddArrayIntoListIfUnique(rhListTemp, laserDL); AddArrayIntoListIfUnique(rhListTemp, laserDR); AddArrayIntoListIfUnique(rhListTemp, laserMiddle); RaycastHit[] allRH = rhListTemp.ToArray(); // Physics.RaycastAll(transform.position, transform.forward); int hitsInRange = 0; for (int i = 0; i < allRH.Length; i++) { RaycastHit rhInfo = allRH[i]; // crosshair.rectTransform.position = Camera.main.WorldToScreenPoint(rhInfo.point); lastAimedRange = Vector3.Distance(transform.position, rhInfo.point); crosshair.color = Color.red; ExplodeChainReact ecrScript = rhInfo.collider.gameObject.GetComponent <ExplodeChainReact>(); if (Input.GetMouseButtonDown(0)) { emitter.Emit(1000); Debug.Log("DIRECT HIT:" + rhInfo.collider.gameObject.name); if (ecrScript) { ecrScript.Explode(1); } } else { if (ecrScript) { hitsInRange += ecrScript.HitsInRange(); } else { cannonReadout.text = "X"; } } } if (lastAimedRange > maxAimRange) { lastAimedRange = maxAimRange; } crosshair.rectTransform.position = Camera.main.WorldToScreenPoint(transform.position + transform.forward * lastAimedRange); if (allRH.Length == 0) // essentially, else / nothing under gun { crosshair.color = Color.cyan; cannonReadout.text = "0"; } else if (hitsInRange != 0) { cannonReadout.text = "" + hitsInRange; } else { cannonReadout.text = "X"; } }
void Update() { bool fireTriggerSqueezingNow = Input.GetAxis("TriggerAxis") > 0.2f; bool fireTriggerSqueezedFrame = (fireTriggerSqueezingNow && fireHoldLock == false); fireHoldLock = fireTriggerSqueezingNow; if (Input.GetKeyDown(KeyCode.Escape)) { SceneManager.LoadScene(0); // back to menu } if (lastAimedRange < 25.0f) { lastAimedRange = 25.0f; } crosshair.rectTransform.position = Camera.main.WorldToScreenPoint(transform.position + transform.forward * lastAimedRange); if (shotsLeft <= 0) { crosshair.color = Color.black; cannonReadout.text = "-"; outOfAmmo?.Invoke(); return; } float thicknessRange = 0.4f; RaycastHit[] laserMiddle = Physics.RaycastAll(transform.position, transform.forward); RaycastHit[] laserLeft = Physics.RaycastAll(transform.position - transform.right * thicknessRange, transform.forward); RaycastHit[] laserRight = Physics.RaycastAll(transform.position + transform.right * thicknessRange, transform.forward); RaycastHit[] laserUp = Physics.RaycastAll(transform.position + transform.up * thicknessRange, transform.forward); RaycastHit[] laserDown = Physics.RaycastAll(transform.position - transform.up * thicknessRange, transform.forward); float roundedPerc = 0.707f; RaycastHit[] laserUL = Physics.RaycastAll(transform.position + transform.up * thicknessRange * roundedPerc - transform.right * thicknessRange * roundedPerc, transform.forward); RaycastHit[] laserUR = Physics.RaycastAll(transform.position + transform.up * thicknessRange * roundedPerc + transform.right * thicknessRange * roundedPerc, transform.forward); RaycastHit[] laserDL = Physics.RaycastAll(transform.position - transform.up * thicknessRange * roundedPerc - transform.right * thicknessRange * roundedPerc, transform.forward); RaycastHit[] laserDR = Physics.RaycastAll(transform.position - transform.up * thicknessRange * roundedPerc + transform.right * thicknessRange * roundedPerc, transform.forward); List <RaycastHit> rhListTemp = new List <RaycastHit>(); AddArrayIntoListIfUnique(rhListTemp, laserLeft); AddArrayIntoListIfUnique(rhListTemp, laserRight); AddArrayIntoListIfUnique(rhListTemp, laserUp); AddArrayIntoListIfUnique(rhListTemp, laserDown); AddArrayIntoListIfUnique(rhListTemp, laserUL); AddArrayIntoListIfUnique(rhListTemp, laserUR); AddArrayIntoListIfUnique(rhListTemp, laserDL); AddArrayIntoListIfUnique(rhListTemp, laserDR); AddArrayIntoListIfUnique(rhListTemp, laserMiddle); RaycastHit[] allRH = rhListTemp.ToArray(); // Physics.RaycastAll(transform.position, transform.forward); int hitsInRange = 0; bool didFire = false; crosshair.color = Color.red; for (int i = 0; i < allRH.Length; i++) { RaycastHit rhInfo = allRH[i]; crosshair.rectTransform.position = Camera.main.WorldToScreenPoint(rhInfo.point); lastAimedRange = Vector3.Distance(transform.position, rhInfo.point); ExplodeChainReact ecrScript = rhInfo.collider.gameObject.GetComponentInParent <ExplodeChainReact>(); bool isItShootingPoint = (ShootingPoints ? rhInfo.collider.gameObject.transform.IsChildOf(ShootingPoints.transform) : false); if (Input.GetMouseButtonDown(0) || fireTriggerSqueezedFrame) { if (isItShootingPoint) { transform.root.position = rhInfo.collider.transform.position; transform.root.rotation = rhInfo.collider.transform.rotation; break; // shooting point, bail out } else { didFire = true; // setting only once, to not repeat per sub raycast /*GameObject testBlastVFX = Resources.Load("Explosion5m") as GameObject; * GameObject pointGO = GameObject.Instantiate(testBlastVFX, transform.position + transform.forward * 7.0f, * transform.rotation);*/ Invoke(nameof(DisableMuzzleFlash), muzzleFlashDuration); // Debug.Log("DIRECT HIT:" + rhInfo.collider.gameObject.name); if (ecrScript) { ecrScript.Explode(1); } } } else { if (ecrScript) { hitsInRange += ecrScript.HitsInRange(); } else if (isItShootingPoint) { crosshair.color = Color.green; } else { cannonReadout.text = "X"; } } } if (didFire) { shotsLeft--; UpdateAmmoDisplay(); emitter.Emit(1000); animator.SetTrigger("Fire"); cannonShotSound.clip = cannonSoundClips[Random.Range(0, cannonSoundClips.Count)]; cannonShotSound.Play(); muzzleFlash.SetActive(true); if (SceneManager.GetActiveScene().name == "ChaosDimension") { Debug.Log("shot fired in Chaos Dimension"); TimeKeeper.instance.RandomJoltTimeOffset(); } TimeKeeper.instance.fakeTimePace = 1.0f; } if (lastAimedRange > maxAimRange) { lastAimedRange = maxAimRange; } if (allRH.Length == 0) // essentially, else / nothing under gun { crosshair.color = Color.red; cannonReadout.text = "0"; } else if (hitsInRange != 0) { crosshair.color = Color.cyan; cannonReadout.text = "" + hitsInRange; } else { crosshair.color = Color.black; cannonReadout.text = "X"; } }