Beispiel #1
0
    protected override void ProcessCollisionDataListNonEmpty()
    {
        var enemyTagEntities     = GetComponentDataFromEntity <EnemyTag>();
        var playerStatesEntities = GetComponentDataFromEntity <PlayerStates>();
        var enemyAttackedByPlayerDataEntities = GetComponentDataFromEntity <EnemyAttackedByPlayerData>();
        var playerAttackedByEnemyDataEntities = GetComponentDataFromEntity <PlayerAttackedByEnemyData>();
        var movementDataEntities = GetComponentDataFromEntity <MovementData>();

        foreach (var collisionData in m_CollisionDataList)
        {
            var enemyTag          = enemyTagEntities[collisionData.EntityB];
            var entityPlayer      = collisionData.EntityA;
            var entityEnemy       = collisionData.EntityB;
            var movementDataEnemy = movementDataEntities.HasComponent(entityEnemy) ? movementDataEntities[entityEnemy] : default;
            if (!m_LastFramePlayerInteractedEnemies.ContainsKey(entityEnemy))
            {
                if (playerStatesEntities[entityPlayer].InvincibleRemainingTime > 0)
                {
                    var attackedData = enemyAttackedByPlayerDataEntities[entityEnemy];
                    attackedData.PlayerAttackType = PlayerAttackType.InvincibleStarman;
                    attackedData.IsFromRight      = collisionData.SignX >= 0;
                    enemyAttackedByPlayerDataEntities[entityEnemy] = attackedData;
                }
                else if (collisionData.ColliderBoundsB.Max.y < collisionData.ColliderBoundsA.Center.y &&
                         collisionData.OverlapX > .2f * collisionData.ColliderBoundsA.Size.x && EnemyUtility.IsStomptable(enemyTag.Type)
                         )
                {
                    var attackedData = enemyAttackedByPlayerDataEntities[entityEnemy];
                    attackedData.PlayerAttackType = PlayerAttackType.Stomping;
                    attackedData.IsFromRight      = collisionData.SignX >= 0;
                    enemyAttackedByPlayerDataEntities[entityEnemy] = attackedData;
                }
                else if (EnemyUtility.IsStaticShell(enemyTag.Type, movementDataEnemy))
                {
                    var attackedData = enemyAttackedByPlayerDataEntities[entityEnemy];
                    attackedData.PlayerAttackType = PlayerAttackType.Kicking;
                    attackedData.IsFromRight      = collisionData.SignX >= 0;
                    enemyAttackedByPlayerDataEntities[entityEnemy] = attackedData;
                }
                else
                {
                    var attackedData = playerAttackedByEnemyDataEntities[entityPlayer];
                    attackedData.EnemyAttackType = EnemyAttackType.NormalHit;
                    playerAttackedByEnemyDataEntities[entityPlayer] = attackedData;
                }
            }

            m_CurrentFramePlayerInteractedEnemies.TryAdd(entityEnemy, true);
        }
    }
    protected override void ProcessCollisionDataListNonEmpty()
    {
        var simpleMovementAbilityEntities = GetComponentDataFromEntity <SimpleMovementAbilityData>();
        var movementDataEntities          = GetComponentDataFromEntity <MovementData>();
        var enemyTagEntities = GetComponentDataFromEntity <EnemyTag>();
        var enemyAttackedByPlayerDataEntities = GetComponentDataFromEntity <EnemyAttackedByPlayerData>();

        foreach (var collisionData in m_CollisionDataList)
        {
            var entityA       = collisionData.EntityA;
            var entityB       = collisionData.EntityB;
            var movementDataA = movementDataEntities.HasComponent(entityA) ? movementDataEntities[entityA] : default;
            var movementDataB = movementDataEntities.HasComponent(entityB) ? movementDataEntities[entityB] : default;

            bool shellAttack = false;
            if (enemyTagEntities.HasComponent(entityA) && EnemyUtility.IsMovingShell(enemyTagEntities[entityA].Type, movementDataA) &&
                enemyTagEntities.HasComponent(entityB))
            {
                shellAttack = true;
                AttackWithShell(enemyAttackedByPlayerDataEntities, entityB, collisionData.SignX >= 0);
            }

            if (enemyTagEntities.HasComponent(entityB) && EnemyUtility.IsMovingShell(enemyTagEntities[entityB].Type, movementDataB) &&
                enemyTagEntities.HasComponent(entityB))
            {
                shellAttack = true;
                AttackWithShell(enemyAttackedByPlayerDataEntities, entityA, collisionData.SignX <= 0);
            }

            if (shellAttack)
            {
                continue;
            }

            if (simpleMovementAbilityEntities.HasComponent(entityA))
            {
                movementDataA.Velocity.x = collisionData.SignX * math.abs(movementDataA.Velocity.x);
                movementDataEntities[collisionData.EntityA] = movementDataA;
            }

            if (simpleMovementAbilityEntities.HasComponent(entityB))
            {
                movementDataB.Velocity.x = -collisionData.SignX * math.abs(movementDataB.Velocity.x);
                movementDataEntities[collisionData.EntityB] = movementDataB;
            }
        }
    }
    protected override JobHandle OnUpdate(JobHandle inputDeps)
    {
        var deltaTime = TimeUtility.GetLimitedDeltaTime();
        var commandBufferConcurrent  = m_CommandBufferSystem.CreateCommandBuffer().ToConcurrent();
        var koopaTroopaGeneratorData = GetEntityQuery(typeof(KoopaTroopaGeneratorData))
                                       .GetSingleton <KoopaTroopaGeneratorData>();
        var spawningQueue           = new NativeQueue <float3>(Allocator.TempJob);
        var spawningQueueWriter     = spawningQueue.AsParallelWriter();
        var normalPrefabEntity      = koopaTroopaGeneratorData.NormalPrefabEntity;
        var normalPrefabEntityScale = MathUtility.MatrixToScale(GetComponentDataFromEntity <CompositeScale>()[normalPrefabEntity].Value);
        var jobHandle = Entities.WithoutBurst().ForEach((Entity entity, int entityInQueryIndex, ref ShellData shellData, in EnemyTag enemyTag,
                                                         in MovementData movementData,
                                                         in Translation translation, in CompositeScale scaleComponent) =>
        {
            if (enemyTag.Type != EnemyType.KoopaTroopaShell)
            {
                return;
            }

            var lastIsMoving   = shellData.IsMoving;
            shellData.IsMoving = EnemyUtility.IsMovingShell(enemyTag.Type, movementData);
            if (!lastIsMoving && shellData.IsMoving)
            {
                shellData.ReviveTimeUsed = 0;
            }

            if (lastIsMoving && !shellData.IsMoving)
            {
                shellData.ReviveTimeUsed = 0;
            }

            if (shellData.IsMoving)
            {
                return;
            }

            shellData.ReviveTimeUsed += deltaTime;
            if (shellData.ReviveTimeUsed >= shellData.ReviveTimeConfig)
            {
                commandBufferConcurrent.DestroyEntity(entityInQueryIndex, entity);
                spawningQueueWriter.Enqueue(translation.Value +
                                            new float3(0, normalPrefabEntityScale.y / 2 - MathUtility.MatrixToScale(scaleComponent.Value).y / 2, 0));
            }
        }).Schedule(inputDeps);
    private bool SpawnEnemy()
    {
        if (enemyCounter < levelData.GetNumberOfEnemies())
        {
            if (CalculatingPath)
            {
                return(false);
            }

            GameObject enemyGameObject = EnemyUtility.GetEnemyByID(levelData.Enemies[enemyCounter].Key);
            enemyGameObject.tag = "Enemy";
            AbstractEnemy enemy = enemyGameObject.GetComponent <AbstractEnemy>();
            OnNewObjectPlaced += enemy.RecalculatePathAfterPlacement;
            OnObjectDestroyed += enemy.RecalculatePathAfterDestroy;
            int spawnId = levelData.Enemies[enemyCounter].Value;
            enemy.transform.position = grid.Spawns[spawnId].Key.GetMiddlePoint();
            enemy.Path = new List <FieldGridCoordinate>(grid.Spawns[spawnId].Value);
            enemy.grid = grid;
            enemy.SetNextGoal();
            enemyCounter++;
        }
        return(true);
    }