public void GeneralScan(DetectableTags detectableTags = 0) { // get all colliders within the vision radius int foundCollidersCount = Physics2D.OverlapCircleNonAlloc(_unit.MoveController.Body.position, _visionRange, _foundColliders, _targetLayers); for (int i = 0; i < foundCollidersCount; i++) { Collider2D collider = _foundColliders[i]; IDetectable detectable = collider.GetComponent <IDetectable>(); // ensure that this collider is a detectable if (detectable == null) { continue; } // ensure that this detectable matches at least one of the tags and can be seen bool containsDetectableTag = (detectable.DetectableTags & detectableTags) != 0; if (containsDetectableTag && Scan(detectable, _unit.MoveController.Body.transform, _visionRange, _visionLayers, _visionAngle)) { // add/update the detected target entry if (!_detectedTargets.TryGetValue(detectable, out DetectedTarget entry)) { _detectedTargets.Add(detectable, new DetectedTarget() { Target = detectable, DetectionValue = 0f, }); } _detectedTargets[detectable].DetectedThisFrame = true; } } ProcessDetectedTargets(); }
protected override void OnEnter() { base.OnEnter(); if (_unit.TargetManager.CurrentTarget == null) { SetReadyToTransition(_onTargetLost); return; } _expectedDetectableTags = _unit.TargetManager.CurrentTarget.DetectableTags; bool foundTarget = ScanForTarget(); if (foundTarget) { SetReadyToTransition(_onTargetFound); } else { SetReadyToTransition(_onTargetLost); } }
public bool TryAddGameObject(GameObject obj) { var comp = obj.GetComponentInChildren <DetectableGameObject>(); if (comp != null) { if (!DetectableTags.Contains(comp.Tag)) { m_SettingsByTag.Add(new GameObjectSettings(comp)); return(true); } else { Debug.LogWarning($"Tag '{comp.Tag}' already added, tags must be distinct."); } } else { Debug.LogError($"{obj} is not a detectable gameobject. Add a DetectableGameObject component."); } return(false); }
protected override void OnEnter() { base.OnEnter(); _expectedDetectableTags = _unit.TargetManager.CurrentTarget.DetectableTags; _visualizedFieldOfView.SetActive(true); }