private void ShootRaycast() { var ray = new Ray2D(transform.position, transform.up); var hit = Physics2D.Raycast(ray.origin, ray.direction, Mathf.Infinity, _layerMask); if (!hit) { StartChainDisable(); Debug.DrawRay(transform.position, transform.up * 100000); return; } var interactable = hit.collider.GetComponentInParent <ILaserInteractable>(); if (RaycastHitHasChanged(interactable)) { LatestInteractableHit?.OnRaycastExit2D(this); } interactable?.OnRaycastStay2D(this, ray, hit); Debug.DrawLine(transform.position, hit.point); LatestInteractableHit = interactable; }
private void FixedUpdate() { RaycastHit hit; if (Physics.Raycast(transform.position, transform.forward, out hit, float.PositiveInfinity, uiLayerMask.value)) { var newTarget = hit.collider.GetComponentInParent <ILaserInteractable>(); if (newTarget != aimedAt) { if (aimedAt != null) { aimedAt.SetHovered(false); } newTarget.SetHovered(true); aimedAt = newTarget; line.EndPos = hit.distance * Vector3.forward; AudioSource.PlayClipAtPoint(mouserollSFX, this.transform.position, 0.3f); Debug.Log("aiming at " + aimedAt); } } else if (aimedAt != null) { aimedAt.SetHovered(false); aimedAt = null; line.EndPos = 100.0f * Vector3.forward; } }
void FixedUpdate() { if (GameManager.Instance.isGamePaused == false) { if (!reflectorHit) { RaycastHit2D hit = Physics2D.Raycast(transform.position, directionVector, (directionVector.normalized * projectileSpeed * Time.fixedDeltaTime).magnitude, ~layerMaskStruct); if (hit) { ILaserInteractable laserInteractable = hit.transform.GetComponentInParent <ILaserInteractable>(); if (laserInteractable != null) { reflectorHit = true; ReduceSpeed(); laserInteractable.OnLaserOverlap(this, hit); return; } // #region HIT: End Point // case "EndPoint": // hitStore.collider.gameObject.GetComponent<EndPoint>().checkIfCorrectLaserHit(gameObject); // projectileSpeed = 0.0f; // destroyCheck = true; // //Destroy(gameObject, 0.1f); // LaserPooler.instance_LaserPoolList.laserPoolDictionary["LaserStock"].Enqueue(this.gameObject); // gameObject.transform.position = GameObject.FindGameObjectWithTag("InactivePooledLasers").transform.position; // gameObject.transform.rotation = Quaternion.identity; // gameObject.SetActive(false); // projectileSpeed = 7.0f; // break; // #endregion // #region HIT: Teleporters // case "TeleporterSetA": // case "TeleporterSetB": // case "TeleporterSetC": // Debug.Log("HIT TELEPORTER SET"); // hitStore.collider.gameObject.GetComponentInParent<Teleporter>().teleportLaser(gameObject, hitStore.collider.gameObject); // break; // #endregion // #region HIT: Colored Border // case "ColoredBorder": // hitStore.collider.gameObject.GetComponent<ColoredBorder>().checkIfCorrectLaserHit(gameObject); // break; // #endregion // } } } transform.position += transform.right * projectileSpeed * Time.fixedDeltaTime; } }
// Sets off a recursion that starts disabling lasershooters when it finds one with a LatestInteractableHit that is null. internal void StartChainDisable() { LatestInteractableHit?.OnRaycastExit2D(this); LatestInteractableHit = null; }
/// <summary>Returns true if the <see cref="newInteractable"/> does not match the latest hit <see cref="ILaserInteractable"/>.</summary> private bool RaycastHitHasChanged(ILaserInteractable newInteractable) { return(LatestInteractableHit != newInteractable); }