コード例 #1
0
        // Update is called once per frame
        void Update()
        {
            closestTarget = geoVision.GetClosestTarget();
            if (currentTarget.distanceToCastOrigin == 0)
            {
                Destroy(this.gameObject);
            }

            else if (GeometryVisionUtilities.TargetHasNotChanged(closestTarget, currentTarget))
            {
                targetingSystemPosition = geoVision.transform.position;
                PlayParticleSystemAtTarget();

                positions = ElectrifyPoints(targetingSystemPosition, frequency, currentTarget.position,
                                            currentTarget.distanceToCastOrigin);

                lineRenderer.positionCount = positions.Length;
                lineRenderer.SetPositions(positions);
            }
            else
            {
                Destroy(this.gameObject);
            }

            void PlayParticleSystemAtTarget()
            {
                if (targetParticlesEffect)
                {
                    targetParticlesEffect.Play(true);
                    targetParticlesEffect.transform.position = currentTarget.position;
                }
            }
        }
コード例 #2
0
        public void AddEntityProcessor <T>(World world) where T : ComponentSystemBase, IGeoProcessor, new()
        {
            GeometryVisionUtilities.HandleEntityImplementationAddition(GetProcessor <T>(), processors, world,
                                                                       InitProcessor);

            void InitProcessor()
            {
                //Initialisation variable setup here  in case needed
            }
        }
コード例 #3
0
        void OnValidate()
        {
            cachedTransform       = transform;
            targetingInstructions = AddDefaultTargetingInstructionIfNone(targetingInstructions, entityProcessing.Value,
                                                                         gameObjectProcessing.Value);
            targetingInstructions = GeometryVisionUtilities.ValidateTargetingSystems(targetingInstructions,
                                                                                     gameObjectProcessing.Value, entityProcessing.Value, entityWorld);
            if (targetingInstructions.Count != 1)
            {
                var currentTargetingInstruction = targetingInstructions[0];
                targetingInstructions = new List <TargetingInstruction>(1)
                {
                    currentTargetingInstruction
                };
            }

            ApplyEntityFilterChanges(targetingInstructions);
        }
コード例 #4
0
        /// <summary>
        /// Moves closest target with give instructions
        /// </summary>
        /// <param name="newPosition">Position to move</param>
        /// <param name="speedMultiplier">Gives extra speed</param>
        /// <param name="distanceToStop">0 value means it will travel to target. 1 value means it will stop 1 unit before reaching destination. If distance to stop is larger than distance to travel the target will not move.</param>
        public void MoveClosestTargetToPosition(Vector3 newPosition, float speedMultiplier, float distanceToStop)
        {
            var   closestTarget = GetClosestTarget();
            float movementSpeed = closestTarget.distanceToCastOrigin * Time.deltaTime * speedMultiplier;

            if (closestTarget.isEntity)
            {
                MainThreadDispatcher.StartUpdateMicroCoroutine(GeometryVisionUtilities.MoveEntityTarget(newPosition,
                                                                                                        movementSpeed,
                                                                                                        closestTarget, distanceToStop, transformEntitySystem, entityWorld, closestTargetsContainer));
            }
            else
            {
                //Since target component is multi threading friendly it cannot store transform, so this just uses the geoInfoObject that is made for the game objects
                var geoInfo = GetGeoInfoBasedOnHashCode(closestTarget.GeoInfoHashCode);
                MainThreadDispatcher.StartUpdateMicroCoroutine(
                    GeometryVisionUtilities.MoveTarget(geoInfo.transform, newPosition, movementSpeed, distanceToStop));
            }
        }
コード例 #5
0
        /// <summary>
        /// Updates Data structures made for Game Objects visibility.
        /// </summary>
        /// <param name="planes"></param>
        /// <param name="allGeoInfos"></param>
        /// <param name="useBounds"></param>
        private List <GeometryDataModels.GeoInfo> UpdateGeometryInfoVisibilities(Plane[] planes,
                                                                                 List <GeometryDataModels.GeoInfo> allGeoInfos, bool useBounds)
        {
            int geoCount    = allGeoInfos.Count;
            int index2      = 0;
            var newGeoInfos = new List <GeometryDataModels.GeoInfo>(allGeoInfos.Count);

            newGeoInfos.AddRange(allGeoInfos);
            this.seenTransforms = new List <Transform>();
            UpdateSeenGeometryObjects();

            // Updates object collection containing geometry and data related to seen object. Usage is to internally update seen geometry objects by checking objects renderer bounds
            // against eyes/cameras frustum
            void UpdateSeenGeometryObjects()
            {
                Transform geoInfoTransform = null;

                for (var i = 0; i < geoCount; i++)
                {
                    var geoInfo = allGeoInfos[i];
                    geoInfoTransform = geoInfo.transform;
                    if (!geoInfoTransform)
                    {
                        continue;
                    }

                    if (useBounds)
                    {
                        AddVisibleRenderer(geoInfo, ref index2);
                    }
                    else if (MeshUtilities.IsInsideFrustum(geoInfoTransform.position, planes))
                    {
                        AddVisibleObject(geoInfo, ref index2);
                    }
                }

                allGeoInfos = newGeoInfos;
                newGeoInfos = null;
            }

            return(newSeenGeometriesList.Take(index2).ToList());

            // Local functions
            void AddVisibleRenderer(GeometryDataModels.GeoInfo geInfo, ref int index)
            {
                if (!geInfo.renderer)
                {
                    newGeoInfos.Remove(geInfo);
                    return;
                }

                if (GeometryUtility.TestPlanesAABB(GeoVision.Planes, geInfo.renderer.bounds))
                {
                    if (GeometryVisionUtilities.TransformIsEffect(geInfo.transform.name))
                    {
                        return;
                    }
                    this.seenTransforms.Add(geInfo.transform);
                    this.newSeenGeometriesList[index] = geInfo;
                    index += 1;
                }
            }

            void AddVisibleObject(GeometryDataModels.GeoInfo geInfo, ref int index)
            {
                if (GeometryVisionUtilities.TransformIsEffect(geInfo.transform.name))
                {
                    return;
                }
                this.seenTransforms.Add(geInfo.transform);
                this.newSeenGeometriesList[index] = geInfo;
                index += 1;
            }
        }