private async void Start()
        {
            Camera.main.orthographicSize   = GameFieldSize.y / 2f;
            Camera.main.transform.position = new Vector3(GameFieldSize.x / 2f, GameFieldSize.y / 2f, Camera.main.transform.position.z);

            GameObject     gameFieldGo             = new GameObject("GameField");
            SpriteRenderer gameFieldSpriteRenderer = gameFieldGo.AddComponent <SpriteRenderer>();

            gameFieldSpriteRenderer.sprite       = SquareSprite;
            gameFieldSpriteRenderer.sortingOrder = -1;
            gameFieldSpriteRenderer.color        = Color.black;
            gameFieldGo.transform.localScale     = new Vector3(GameFieldSize.x, GameFieldSize.y, 1f);
            gameFieldGo.transform.position       = GameFieldSize * 0.5f;

            // Pick nice random color for this player
            this.color = Random.ColorHSV(0, 1, 1, 1, 1, 1);

            // The private key is used to sign transactions sent to the DAppChain.
            // Usually you'd generate one private key per player, or let them provide their own.
            // In this sample we just generate a new key every time.
            var privateKey = CryptoUtils.GeneratePrivateKey();
            var publicKey  = CryptoUtils.PublicKeyFromPrivateKey(privateKey);

            this.client = new TileChainContractClient(privateKey, publicKey, Debug.unityLogger);
            this.client.TileMapStateUpdated += ClientOnTileMapStateUpdated;

            await ConnectClient();
        }
        private async void Start()
        {
            if (TileChainContractClient.GetAbi() == null)
            {
                this.StatusText.text = "Error: no ABI file found, please run 'truffle build' first";
                ReconnectButton.gameObject.SetActive(false);
                return;
            }

            Address contractAddress;

            try
            {
                contractAddress = Address.FromString(this.ContractAddressHex);
            }
            catch (Exception e)
            {
                this.StatusText.text = "Error: Please set the address of your deployed contract in ContractAddressHex field of Controller GameObject";
                Debug.LogWarning(e);
                ReconnectButton.gameObject.SetActive(false);
                return;
            }

            Camera.main.orthographicSize   = GameFieldSize.y / 2f;
            Camera.main.transform.position = new Vector3(GameFieldSize.x / 2f, GameFieldSize.y / 2f, Camera.main.transform.position.z);

            GameObject     gameFieldGo             = new GameObject("GameField");
            SpriteRenderer gameFieldSpriteRenderer = gameFieldGo.AddComponent <SpriteRenderer>();

            gameFieldSpriteRenderer.sprite       = SquareSprite;
            gameFieldSpriteRenderer.sortingOrder = -1;
            gameFieldSpriteRenderer.color        = Color.black;
            gameFieldGo.transform.localScale     = new Vector3(GameFieldSize.x, GameFieldSize.y, 1f);
            gameFieldGo.transform.position       = GameFieldSize * 0.5f;

            // Pick nice random color for this player
            this.color = Random.ColorHSV(0, 1, 1, 1, 1, 1);

            // The private key is used to sign transactions sent to the DAppChain.
            // Usually you'd generate one private key per player, or let them provide their own.
            // In this sample we just generate a new key every time.
            var privateKey = CryptoUtils.GeneratePrivateKey();
            var publicKey  = CryptoUtils.PublicKeyFromPrivateKey(privateKey);

            this.client = new TileChainContractClient(privateKey, publicKey, contractAddress, Debug.unityLogger);
            this.client.TileMapStateUpdated += ClientOnTileMapStateUpdated;

            await ConnectClient();
        }