// 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; } } }
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 } }
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); }
/// <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)); } }
/// <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; } }