protected override JobHandle OnUpdate(JobHandle inputDeps) { if (rangedMinions.Length == 0 || !lifeCycleManager.createdArrows.IsCreated) { return(inputDeps); } float prevArcherAttackCycle = archerAttackCycle; archerAttackCycle += Time.deltaTime; if (archerAttackCycle > SimulationSettings.Instance.ArcherAttackTime) { archerAttackCycle -= SimulationSettings.Instance.ArcherAttackTime; } var archerJob = new ArcherJob { createdArrowsQueue = lifeCycleManager.createdArrows, archers = rangedMinions.minions, transforms = rangedMinions.transforms, formations = formationsFromEntity, closestFormationsFromEntity = formationClosestDataFromEntity, minionConstData = rangedMinions.bitmask, randomizer = Time.frameCount, archerHitTime = SimulationSettings.Instance.ArcherHitTime, archerAttackCycle = archerAttackCycle, prevArcherAttackCycle = prevArcherAttackCycle }; archerJobFence = archerJob.Schedule(rangedMinions.Length, SimulationState.SmallBatchSize, inputDeps); return(archerJobFence); }
protected override JobHandle OnUpdate(JobHandle inputDeps) { if (rigidbodies.Length == 0) { return(inputDeps); } if (Input.GetKeyDown(KeyCode.Alpha1)) { RaycastHit lastHit; Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out lastHit, Mathf.Infinity, FormationSystem.GroundLayermask)) { GameObject go = ObjectPooler._this.Get(PoolType.FireLance); FireLance fireLance = go.GetComponent <FireLance>(); go.SetActive(true); fireLance.PlayEffect(go.transform.position, lastHit.point); } } else if (Input.GetKeyDown(KeyCode.Alpha2)) { RaycastHit lastHit; Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out lastHit, Mathf.Infinity, FormationSystem.GroundLayermask)) { for (int i = 0; i < 1024; ++i) { float3 srcPos = new float3(-30, 22, 295); float3 targetPosition = lastHit.point; targetPosition += new float3(Random.Range(-20, 20), 0, Random.Range(-20, 20)); float3 relativeVector = targetPosition - srcPos; float distance = math.length(relativeVector.xz); float3 arrowStartingPosition = srcPos + new float3(0f, 3f, 0f); //if (math.all(math.abs(t.Position) < new float3(2, 2, 2))) //{ // Debug.Log(index + " " + t.FormationIndex + " " + t.IndexInFormation + " " + t.Position); //} float spellVelocityScale = 0.1f; float angle = Mathf.PI * spellVelocityScale * math.lerp(0.36f, 0.2f, math.saturate(distance / RangedUnitData.ArcherAttackRange)); float variant = Mathf.PI * spellVelocityScale * 0.05f; angle = Random.Range(angle - variant, angle + variant); float velocity = ArcherJob.GetArrowVelocity(distance, angle, arrowStartingPosition.y - targetPosition.y); float3 shootingVector = math.normalize(new float3(relativeVector.x, 0, relativeVector.z)); // rotate the vector float3 rotAxis = math.cross(shootingVector, new float3(0, 1, 0)); Quaternion rotation = ArcherJob.AngleAxis(angle, rotAxis); shootingVector = rotation * shootingVector; var arrow = new ArrowData() { IsFriendly = 1 }; // FIREEE!!! arrow.position = arrowStartingPosition; arrow.velocity = shootingVector * velocity; arrow.active = true; unitLifecycleManager.createdArrows.Enqueue(arrow); } } } inputDeps.Complete(); CombinedExplosionHandle.Complete(); spellData.Clear(); foreach (var explosion in SpellExplosionsQueue) { spellData.Add(new SpellData() { randomHorizontal = explosion.settings.randomHorizontal, blastDirectionFactor = explosion.settings.blastDirectionFactor, blastDirectionModifier = explosion.settings.blastDirectionModifier, useInvertedDistance = explosion.settings.useInvertedDistance, explosionDistance = explosion.settings.explosionDistance, verticalComponentFactor = explosion.settings.verticalComponentFactor, explosionPosition = explosion.position }); } SpellExplosionsQueue.Clear(); if (spellData.Length > 0) { var explosionJob = new ApplyExplosionJob() { entities = rigidbodies.entities, entitiesForFlying = unitLifecycleManager.entitiesForFlying, transforms = rigidbodies.transforms, frameCount = Time.frameCount, rigidbodies = rigidbodies.rigidbodies, spells = spellData }; CombinedExplosionHandle = explosionJob.Schedule(rigidbodies.Length, SimulationState.HumongousBatchSize, inputDeps); } else { CombinedExplosionHandle = default(JobHandle); } return(CombinedExplosionHandle); }