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