unity > show Text on the left of the Panel > y位置ずれ訂正

```txt:動作確認
Unity 5.2.0f3 on MacOS X 10.8.5
```

TextをPanel近傍に表示したい。

表示位置計算の参考
http://qiita.com/7of9/items/60bffb5a0810d9aabd1f

##準備

プロジェクトは「2D」を選択して新規作成する。

Hierarchyは以下となるようにPanel, Buttonを追加。

![Main_unity_-_150910-new2Dtest_-_PC__Mac___Linux_Standalone__Personal_.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/f24e3ba6-db4b-2fe5-6ae6-136228785327.jpeg)

Canvasのインスペクタで以下のように
- Screen Space - Cameraにする
- Render Cameraに Main Cameraを関連づける (Scaleが0.02915...になる)

![Main_unity_-_150910-new2Dtest_-_PC__Mac___Linux_Standalone__Personal_.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/c69c456b-8016-70fc-406e-a48fb05bee1a.jpeg)

- ButtonにButtonControlスクリプト（新規作成）を関連づける。
- ButtonControl.csを実装する (下記)。
- My CanvasとMy PanelにそれぞれCanvasとPanelを関連付ける


![Main_unity_-_150910-new2Dtest_-_PC__Mac___Linux_Standalone__Personal_.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/482fb87d-562e-4e55-efa7-8983e47199f6.jpeg)


## try1 (y軸おかしい編)

以下の実装を試した。

### code

```ButtonControl.cs
using UnityEngine;
using System.Collections;
using UnityEngine.UI; // for Text

public class ButtonControl : MonoBehaviour {
	public Canvas myCanvas;
	public GameObject myPanel;

	void drawTextOnTheLeftOfPanel(float val, bool atBottom) {
		RectTransform panelRect = myPanel.GetComponent<RectTransform> ();
		float width = panelRect.rect.width;
		float height = panelRect.rect.height;

		RectTransform canvasRect = myCanvas.GetComponent<RectTransform> ();

		// Bottom Left
		Vector3 pos;
		pos = myPanel.transform.position;
		pos.x -= width * 0.5f * canvasRect.localScale.x;
		if (atBottom) {
			pos.y -= height * 0.5f * canvasRect.localScale.y;
		} else {
			pos.y += height * 0.5f * canvasRect.localScale.y;
		}

		GameObject BottomLeftGO = new GameObject ();
		BottomLeftGO.transform.parent = myPanel.transform;
		BottomLeftGO.name = "Text";
		BottomLeftGO.transform.position = pos;
		BottomLeftGO.transform.localScale = new Vector3 (1f, 1f, 1f);
		Text BottomLeftText = BottomLeftGO.AddComponent<Text> ();
		BottomLeftText.text = val.ToString ();
		BottomLeftText.font = Resources.GetBuiltinResource (typeof(Font), "Arial.ttf") as Font;
	}

	public void ButtonClick() {
		Debug.Log ("button click");
		drawTextOnTheLeftOfPanel (3.1415f, /* atBottom=*/ true);
		drawTextOnTheLeftOfPanel (2.7182f, /* atBottom=*/ false);
	}
}
```


###結果

Buttonをクリックしたら左側にテキストが表示される。

![Main_unity_-_150910-new2Dtest_-_PC__Mac___Linux_Standalone__Personal_.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/badd7ab4-58de-5355-97a4-b461a141bc67.jpeg)

垂直位置がずれている。

Unity 5.1.3でも同じ位置に表示される。
位置計算が間違っているようだ。

## try3 (y位置修正版)

上記で作ったTextをインスペクタで見ると、Height が 100になっていた。
以下を追加したら垂直位置のずれが直った。

```csharp
RectTransform textRect = BottomLeftText.GetComponent<RectTransform> ();
textRect.sizeDelta = new Vector2 (100.0f, 30.0f);
```

Heightが100で生成され、その結果、上の方に表示されていたようだ。
Heightを30にしたら、それほど悪くない位置に表示できるようになった。

[v0.1 @ github](https://github.com/yasokada/unity-150911-textNearPanel/releases/tag/v0.1)

![Main_unity_-_150911-textNearPanel_-_PC__Mac___Linux_Standalone__Personal_.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/ab2998ed-f8c1-5eaf-47ec-03eae45fcd66.jpeg)

### code

```csharp
void drawTextOnTheLeftOfPanel(float val, bool atBottom) {
		RectTransform panelRect = myPanel.GetComponent<RectTransform> ();
		float width = panelRect.rect.width;
		float height = panelRect.rect.height;
		
		RectTransform canvasRect = myCanvas.GetComponent<RectTransform> ();
		
		// Bottom Left
		Vector3 pos;
		pos = myPanel.transform.position;

		pos.x -= width * 0.5f * canvasRect.localScale.x;
		if (atBottom) {
			pos.y -= height * 0.5f * canvasRect.localScale.y;
		} else {
			pos.y += height * 0.5f * canvasRect.localScale.y;
		}
	
		GameObject BottomLeftGO = new GameObject ();
		BottomLeftGO.name = "Text";
		BottomLeftGO.transform.parent = myPanel.transform;
		BottomLeftGO.transform.position = pos;
		BottomLeftGO.transform.localScale = new Vector3 (1f, 1f, 1f);
		Text BottomLeftText = BottomLeftGO.AddComponent<Text> ();
		BottomLeftText.text = val.ToString ();
		BottomLeftText.font = Resources.GetBuiltinResource (typeof(Font), "Arial.ttf") as Font;

		RectTransform textRect = BottomLeftText.GetComponent<RectTransform> ();
		textRect.sizeDelta = new Vector2 (100.0f, 30.0f);
	}
```