Example #1
0
    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);
    }
Example #2
0
    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);
    }