XAMLとか知らねぇよ！！C#だけでUIElement式エディタ拡張をする入門～style編～

#はじめに

- [基礎編](https://qiita.com/Hirai0827/private/ac481749307a60c8e51e)
- style編(ココ)

こんにちは、アドベントカレンダー3日目担当の避雷です。今回は先日に引き続きUIElementの調査を進めていきます。
今回はUIに必須なstyleの設定です。前回までの知識だとUIは縦に一つずつ並べるしかなかったのですが、それだと実際のUIを作るには表現力不足です。例えばYes/Noボタンなんかは横並びにしたいときと縦並びにしたいときがあったりしますよね。今回はそういったものに対してstyleを変更して対応していきます。
#VisualElement.styleを編集する
VisualElement.styleはmargin、padding、borderline、alignment等のUIのビジュアル的な部分を設定する項目です。VisualElementのstyleを設定する方法はいくつかあります。

```C#
//初期化と同時に設定
        VisualElement label = new Label("Hello World! From C#")
            {style = {fontSize = 64,
color = new StyleColor(Color.magenta)}};
//要素ごとに設定
        VisualElement label2 = new Label("Hello World! From C#");
        label2.style.fontSize = 64;
        label2.style.color = new StyleColor(Color.magenta);

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256231/bff3dd1b-46fa-e8fa-f89c-178997ad234a.png)
両方同じ描画結果です。
今回は要素ごとに設定することにします。その方が見やすい気がするので。
#基本的な設定の紹介
##border系
###borderColor
ボーダーラインの色を設定します

```C#
        VisualElement frame = new VisualElement();
        frame.style.borderColor = new StyleColor(Color.red);
```

###borderWidth
ボーダーラインの太さを設定します

```C#
        VisualElement frame = new VisualElement();
        frame.style.borderColor = new StyleColor(Color.red);
        frame.style.borderBottomWidth = 5;
        frame.style.borderTopWidth = 5;
        frame.style.borderRightWidth = 5;
        frame.style.borderLeftWidth = 5;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256231/0a2ad370-35e8-cc18-4fa3-1fcfcd93efb7.png)

###borderRadius
ボーダーラインの角の丸さを設定します

```C#
        frame.style.borderBottomLeftRadius = 15;
        frame.style.borderBottomRightRadius = 15;
        frame.style.borderTopLeftRadius = 15;
        frame.style.borderTopRightRadius = 15;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256231/96a626d8-e635-ed81-78ae-29834c6e07f3.png)


##padding margin系
###padding
パディングを設定します（ボーダーラインの内側）

```C#
        frame.style.paddingTop = 10;
        frame.style.paddingBottom = 10;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256231/b0377586-901a-d026-ab67-6102ec039618.png)

###margin
マージンを設定します（ボーダーラインの外側）

```C#
        frame.style.paddingTop = 10;
        frame.style.paddingBottom = 10;
        frame.style.marginRight = 10;
        frame.style.marginLeft = 10;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256231/f0a790e6-2e3e-a9bc-5c7a-f2b99fff5e38.png)

##整列方向系
###Flex
子要素の整列方向を設定します

```C#
        frame.style.flexDirection = new StyleEnum<FlexDirection>(FlexDirection.Column);
        frame.style.flexDirection = new StyleEnum<FlexDirection>(FlexDirection.Row);
```

↓Column
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256231/45cb8cc2-4e35-d9f0-aff4-c0ab25d6abc4.png)

↓Row
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256231/0c896940-2715-7128-2d37-43ff300a45ef.png)

##文字系
###FontSize
フォントサイズを設定します

```C#
        Label label3 = new Label("ABCDEFG");
        label3.style.fontSize = 32;
        root.Add(label3);
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256231/58cee182-7320-1861-321d-a72195fe1b81.png)

###Color
文字色を設定します

```C#
        label3.style.color = new StyleColor(Color.green);
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256231/36e46d87-5995-2db7-3900-8b78e2b0a663.png)

###BackgroundColor
背景色を設定

```C#
        label3.style.backgroundColor = new StyleColor(Color.magenta);
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256231/42992079-a47b-2ec9-f196-c4b23c8f1b05.png)

先ほどのVisualElementに同様の設定をすると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256231/f749d268-6e0b-2847-e839-73a836e98b54.png)

こんな感じです。
###UnityTextAlign
テキストの基準位置を設定

```C#
        label3.style.unityTextAlign = new StyleEnum<TextAnchor>(TextAnchor.LowerRight);
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256231/bc0b4341-2c8a-df48-63b4-34b37c536b18.png)

因みにTextFieldの入力を左上からにするには
unityTextAlign無し
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256231/147ad58e-df6e-0507-3983-ee63589a3d82.png)

```C#
        foreach (var child in textField.Children())
        {
//子オブジェクトに左上整列を指示
            child.style.unityTextAlign = new StyleEnum<TextAnchor>(TextAnchor.UpperLeft);
        }
```

とすると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256231/59b3884c-39dc-a553-1134-723a70de10f5.png)

みたいになる。multilineなら設定必須…？なお現状だと日本語入力が出来ないみたいです(IMEが反応しない)

###textField.isPasswordField
trueにするとパスワード用のインプットフィールドになります

```C#
 textField.isPasswordField = true;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256231/2759dd35-4220-e919-e21c-ea74466b2c36.png)


#おわりに
なんか諦めてUSSとかUMLとか使った方が楽な気がしてきました…C#でもデザインまで出来るということは証明できたのでヨシとしましょう。