private Vector3 checkObstacles(Vector3 camera, Vector3 target, float radius) { var startOffset = 0; var centerDistance = Vector3.Distance(camera, target); var forward = (target - camera).normalized; var maxFix = 0f; if (startOffset < centerDistance) { var origin = target - forward * startOffset; var max = Vector3.Distance(camera, target); var ray = new Ray(origin, -forward); for (int i = 0; i < Physics.SphereCastNonAlloc(ray, radius, _hits, max); i++) { var hit = _hits[i]; if (!hit.collider.isTrigger && !Util.InHiearchyOf(hit.collider.gameObject, Target.gameObject)) { var fix = Mathf.Clamp(max - hit.distance, 0, max); if (fix > maxFix) { maxFix = fix; } } } } return(maxFix * forward); }
public RaycastHit Raycast(Vector3 origin, Vector3 direction, out bool isFriend, bool friendCheck) { RaycastHit closestHit = new RaycastHit(); float closestDistance = Distance * 10; var minDistance = 0f; if (_isUsingCustomRaycastOrigin) { minDistance = Vector3.Distance(Origin, raycastOrigin); } isFriend = false; for (int i = 0; i < Physics.RaycastNonAlloc(origin, direction, _hits, Distance); i++) { var hit = _hits[i]; if (Character != null && Util.InHiearchyOf(hit.collider.gameObject, Character.gameObject)) { continue; } if (hit.distance < closestDistance && hit.distance > minDistance) { var isOk = true; if (hit.collider.isTrigger) { isOk = hit.collider.GetComponent <BodyPartHealth>() != null; } else { var health = hit.collider.GetComponent <CharacterHealth>(); if (health != null) { isOk = health.IsRegisteringHits; } } if (isOk) { if ((_isIgnoringSelf || _hasFireCondition) && friendCheck) { var root = getHealthTarget(hit.collider.gameObject); if (root != null) { if (_isIgnoringSelf && Character != null && root == Character.gameObject) { isFriend = true; } else if (_hasFireCondition) { var actor = root.GetComponent <Actor>(); if (actor != null) { isFriend = actor.Side == _fireConditionSide; } else { isFriend = false; } } else { isFriend = false; } } else { isFriend = false; } } closestHit = hit; closestDistance = hit.distance; } } } return(closestHit); }
private void Update() { for (int i = 0; i < _currentObjects.Count; i++) { keep(i, false); } if (_hasTarget) { var vector = _targetPosition - transform.position; for (int i = 0; i < Physics.RaycastNonAlloc(transform.position, vector, _hits, vector.magnitude); i++) { var hit = _hits[i]; var obj = hit.collider.gameObject; if (!hit.collider.isTrigger && (_target == null || !Util.InHiearchyOf(obj, _target))) { // Check if already fading int oldIndex = indexOf(_currentObjects, obj); if (oldIndex >= 0) { keep(oldIndex, true); continue; } // Check if was being removed oldIndex = indexOf(_oldObjects, obj); if (oldIndex >= 0) { _currentObjects.Add(_oldObjects[oldIndex]); keep(_currentObjects.Count - 1, true); _oldObjects.RemoveAt(oldIndex); continue; } // Create and add { FadedObject faded; faded.Fade = 0; faded.Object = obj; faded.KeepThisFrame = true; var gotRenderers = obj.GetComponentsInChildren <MeshRenderer>(); faded.Renderers = new FadedRenderer[gotRenderers.Length]; for (int k = 0; k < gotRenderers.Length; k++) { FadedRenderer renderer; renderer.Renderer = gotRenderers[k]; renderer.OriginalMaterial = Material.Instantiate(renderer.Renderer.material); renderer.NewMaterial = Material.Instantiate(renderer.Renderer.material); renderer.OriginalColor = renderer.OriginalMaterial.color; renderer.Renderer.material = renderer.NewMaterial; renderer.Renderer.gameObject.SendMessage("OnFade", SendMessageOptions.DontRequireReceiver); faded.Renderers[k] = renderer; } _currentObjects.Add(faded); } } } } for (int i = _currentObjects.Count - 1; i >= 0; i--) { if (!_currentObjects[i].KeepThisFrame) { _oldObjects.Add(_currentObjects[i]); _currentObjects.RemoveAt(i); } } for (int i = 0; i < _currentObjects.Count; i++) { var value = _currentObjects[i]; value.Fade = Mathf.Lerp(value.Fade, 1.0f, Time.deltaTime * Speed); fade(value.Renderers, value.Fade); _currentObjects[i] = value; } for (int i = _oldObjects.Count - 1; i >= 0; i--) { var value = _oldObjects[i]; value.Fade = Mathf.Lerp(value.Fade, 0, Time.deltaTime * Speed); fade(value.Renderers, value.Fade); if (value.Fade > float.Epsilon) { _oldObjects[i] = value; } else { foreach (var renderer in _oldObjects[i].Renderers) { renderer.Renderer.material = renderer.OriginalMaterial; renderer.Renderer.gameObject.SendMessage("OnUnfade", SendMessageOptions.DontRequireReceiver); } _oldObjects.RemoveAt(i); } } }