private static void CreatePixelCharacterInstance()
    {
        GameObject pixelTileGameObject = new GameObject("Pixel Character");
        PixelTile  pixelTileComponent  = pixelTileGameObject.AddComponent <PixelCharacter>().GetComponent <PixelTile>();

        PixelLevel firstPixelLevelFound = GameObject.FindObjectOfType <PixelLevel>();

        if (firstPixelLevelFound)
        {
            pixelTileComponent.CurrentPixelLevelInstance = firstPixelLevelFound;
        }
    }
    private void Update()
    {
        PixelLevel currentPixelLevelInstance = PixelTileComponent.CurrentPixelLevelInstance;

        if (!currentPixelLevelInstance)
        {
            return;
        }

        CurrentPixelLevelInstance = currentPixelLevelInstance;

        int currentPixelPositionX = PixelPositionX;
        int currentPixelPositionY = PixelPositionY;

        if (Input.GetButtonDown("Jump") && ((CollisionNormalFlag & CollisionNormalFlags.GROUND) == CollisionNormalFlags.GROUND))
        {
            isJumping      = true;
            JumpStateTimer = 0.0f;
        }

        Vector2 joystickInput = Joystick.GetSmoothInput(0.125f, "Horizontal", "Vertical");
        bool    isKeyPressed  = false;

        ComputeVelocity(ref isKeyPressed, joystickInput);
        SetInputSourceFlag(isKeyPressed, joystickInput);

        Debug.Log(InputSourceFlag);

        PixelPositionX += Mathf.RoundToInt(VelocityX);
        PixelPositionY += Mathf.RoundToInt(VelocityY);

        InitializePixelTileObstacleList();
        DetectAndResolveCollisions();

        int pixelsPerUnit = currentPixelLevelInstance.PixelsPerUnit;

        transform.position = Vector3.MoveTowards(
            new Vector3(
                ((float)currentPixelPositionX / pixelsPerUnit) + 0.5f * PixelTileComponent.TileSizeX,
                ((float)currentPixelPositionY / pixelsPerUnit) + 0.5f * PixelTileComponent.TileSizeY
                ),
            new Vector3(
                ((float)PixelPositionX / pixelsPerUnit) + 0.5f * PixelTileComponent.TileSizeX,
                ((float)PixelPositionY / pixelsPerUnit) + 0.5f * PixelTileComponent.TileSizeY
                ),
            Time.deltaTime
            );

        JumpStateTimer += Time.deltaTime;
    }
    protected void Start()
    {
        PixelTileComponent = GetComponent <PixelTile>();
        PixelLevel currentPixelLevelInstance = PixelTileComponent.CurrentPixelLevelInstance;

        if (!currentPixelLevelInstance)
        {
            return;
        }

        CollisionNormalStateMap   = new Dictionary <int, CollisionNormalFlags>();
        CurrentPixelLevelInstance = currentPixelLevelInstance;
        PixelTileComponent.AlignToPixelLevelGrid();

        int pixelsPerUnit = currentPixelLevelInstance.PixelsPerUnit;

        PixelPositionX      = currentPixelLevelInstance.PixelOriginX + PixelTileComponent.AlignedRelativePositionX * pixelsPerUnit;
        PixelPositionY      = currentPixelLevelInstance.PixelOriginY + PixelTileComponent.AlignedRelativePositionY * pixelsPerUnit;
        PreviousVelocityX   = PixelVelocityX;
        CollisionNormalFlag = CollisionNormalFlags.NONE;
        InputSourceFlag     = InputSourceFlags.NONE;
        JumpStateTimer      = 0.0f;
        isJumping           = false;
    }