void OnTriggerStay(Collider other) { if (weapon == null) { return; } var player = weapon.player; if (other.gameObject.tag == "Player" && other.gameObject.GetComponent <Player>().ID != player.ID) { var target = other.gameObject.GetComponent <Player>(); WeaponTargettingState = TargettingState.TargetsInRange; if (target.ID != player.ID) { //cast rays CastRays(); //TODO do something with this guy var abc = ProcessRays(); if (abc.hasValidTarget != false) { var id = abc.validHit.collider.GetComponentInParent <PlayerHitbox>().player; playertarget = id; } } } }
// this will be called after the object is instatiated by SetWeapon on the weapon (if aim assist is on) public void Initialize(AbstractWeapon setWeapon) { weapon = setWeapon; transform.position = weapon.transform.position; transform.localPosition = Vector3.zero; weaponRange = weapon.weaponRange; weaponArc = weapon.weaponArc; WeaponTargettingState = TargettingState.Setup; }
void Update() { if (!weapon) { return; } // if(weapon.player.ID == 0) // Debug.Log(weapon.player.ID + " " + WeaponTargettingState); switch (WeaponTargettingState) { case (TargettingState.Setup): if (mesh) { mesh.Clear(); mesh = meshfilter.mesh; } WeaponTargettingState = TargettingState.NoneInRange; break; case (TargettingState.NoneInRange): if (playertarget != null) { playertarget.DangerIndicatorToggle(false); } playertarget = null; DrawTargettingArea(); break; case (TargettingState.TargetsInRange): if (playertarget != null) { playertarget.DangerIndicatorToggle(false); } playertarget = null; DrawTargettingArea(); break; case (TargettingState.TargetsInLOS): playertarget.DangerIndicatorToggle(true); DrawTargettingArea(); break; default: break; } }
// processRays should process all the RaycastHits of every RaycastBeams // the goal is to produce either null for no valid target // or return the RaycastHit of the closest valid target RaycastBeams ProcessRays() { RaycastBeams closestValidRaycastBeam = new RaycastBeams(); float closestValidTargetDistance = 1000f; List <RaycastBeams> beamsWithValidTargetsAsTheClosest = new List <RaycastBeams>(); //RaycastBeams closestPlayerRaycastHit; for (int i = 0; i < beams.Length; i++) { //skip the beam if already processed if (beams[i] == null || beams[i].shouldBeProcessed == false) { continue; } //Debug.Log("processing beam at " + i); //these are for iterating thru the raycasthit array of each beam float closestTargetDistance = 1000f; RaycastHit closestHit = new RaycastHit(); RaycastBeams validBeam = null; //cycle thru all the RaycastNonAlloc hits to find the closest for (int j = 0; j < beams[i].hits.Length; j++) { var theHit = beams[i].hits[j]; if (theHit.distance == 0) { continue; } //Debug.Log("theHit " + theHit.distance) ; if (theHit.distance <= closestTargetDistance) { closestTargetDistance = theHit.distance; closestHit = theHit; beams[i].validHit = theHit; validBeam = beams[i]; } } //Debug.Log("the closest hit is " + closestHit.collider.tag); if (closestHit.collider == null) { continue; } //if the target is valid var isPlayer = closestHit.collider.CompareTag("PlayerHitbox"); var isNPC = closestHit.collider.CompareTag("NPCHitbox"); if (isPlayer || isNPC) { beamsWithValidTargetsAsTheClosest.Add(validBeam); //else dont do anything } beams[i].shouldBeProcessed = false; } // Went thru all the beams and have a list of beams with valid targets // now go thru this list and find the closest one for (int k = 0; k < beamsWithValidTargetsAsTheClosest.Count; k++) { var theBeam = beamsWithValidTargetsAsTheClosest[k]; if (theBeam.validHit.distance < closestValidTargetDistance) { closestValidTargetDistance = theBeam.validHit.distance; closestValidRaycastBeam = theBeam; closestValidRaycastBeam.hasValidTarget = true; //Debug.Log("hitting player " + theBeam.validHit.collider.GetComponentInParent<Player>().ID); } } if (beamsWithValidTargetsAsTheClosest.Count > 0) { WeaponTargettingState = TargettingState.TargetsInLOS; } return(closestValidRaycastBeam); }
void OnTriggerExit(Collider other) { WeaponTargettingState = TargettingState.NoneInRange; }