private void Update()
    {
        var rate = m_canvasScaler.referenceResolution.y / Screen.height;
        var pos  = m_rectTransform.anchoredPosition;

        pos.y = SoftwareKeyboardArea.GetHeight(true) * rate;
        m_rectTransform.anchoredPosition = pos;
    }
    private void OnGUI()
    {
        //GUILayout.Label();
        GUIStyle style = new GUIStyle();

        style.fontSize = 100;
        GUI.Label(new Rect(100, 100, 200, 100), SoftwareKeyboardArea.GetHeight(true).ToString(), style);
        GUI.Label(new Rect(100, 200, 200, 100), "decord:  " + SoftwareKeyboardArea.mDecorHeight.ToString(), style);
    }
    void Start()
    {
#if UNITY_IOS && !UNITY_EDITOR
        submitButton.OnPointerEnterAsObservable()
        .Subscribe(_ => { _keyboard = TouchScreenKeyboard.Open(string.Empty, TouchScreenKeyboardType.Search); })
        .AddTo(this);
        submitButton.OnPointerUpAsObservable()
        .Subscribe(_ =>
        {
            // ボタンを押さずに離した場合にフォーカスを戻す
            EventSystem.current.SetSelectedGameObject(chatInput.gameObject);
        }).AddTo(this);
#endif

        submitButton.onClick.AsObservable()
        .Subscribe(unit => Send())
        .AddTo(this);

#if !UNITY_EDITOR
        // keyboardの参照を取得
        chatInput.OnSelectAsObservable()
        .Subscribe(_ => { _keyboard = TouchScreenKeyboard.Open(string.Empty, TouchScreenKeyboardType.Search); })
        .AddTo(this);

        // keyboardステータスを監視
        Observable.EveryUpdate()
        .Where(_ => _keyboard != null)
        .Select(_ => _keyboard.status)
        .DistinctUntilChanged()
        .Subscribe(status =>
        {
            switch (status)
            {
            case TouchScreenKeyboard.Status.Visible:
#if UNITY_ANDROID
                // Androidではキーボード表示中にUI要素をタッチできない
                submitButton.interactable = false;
#endif
                break;

            case TouchScreenKeyboard.Status.Done:
                Send();
                submitButton.interactable = true;
                break;

            case TouchScreenKeyboard.Status.Canceled:
            case TouchScreenKeyboard.Status.LostFocus:
                submitButton.interactable = true;
                break;
            }
        })
        .AddTo(this);
#endif

        Observable.EveryUpdate()
        .Select(_ => SoftwareKeyboardArea.GetHeight())
        .DistinctUntilChanged()
        .Subscribe(height =>
        {
            var safeAreaBottom   = Screen.safeArea.y;
            var resolutionHeight = chatContainer
                                   .GetComponentInParent <CanvasScaler>()
                                   .GetComponent <RectTransform>().sizeDelta.y;
            var rate = resolutionHeight / Screen.height;

            var margin = (int)(height <= 0 ? 0 : (height - safeAreaBottom) * rate);
            chatContainer.sizeDelta = new Vector2(0, -margin);
        }).AddTo(this);
    }