コード例 #1
0
ファイル: PlayerCamera.cs プロジェクト: aksharamurda/ZmbV2
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
                }
            }
        }