ぐーるらいふ

底辺。

【Unity】タッチした位置にuGUI(RectTransform)を表示する

お疲れ様です。ぐーるです。
最近はなんかサーバだけではなく、採用だ評価だと色んな所まで見てたりして、
ちょっとアップアップしています。色んな人と会話するのって難しいです。

unityroom以外でもなんかゲーム作ってて、ふと
「指定位置にuGUIでテキストと画像を出したいなー」
と思ったので、実装したのですが、なんか思ったように上手く行かずにちょっと困ったので
メモ代わりにまとめておきます。

タッチした位置にuGUI(RectTransform)を表示する

普通のGameObjectだったらScreenToWorldPoint()とか使いますよね。
こんな感じ。

f:id:ghoul_life:20181113000239g:plain

public GameObject cubePrefab;
	
// Update is called once per frame
void Update () {
        if (Input.GetMouseButtonDown(0))
        {
            var mousePosition = Input.mousePosition;
            mousePosition.z = 10;
            var pos = Camera.main.ScreenToWorldPoint(mousePosition);
            var cube = Instantiate(cubePrefab);
            cube.transform.position = pos;
            cube.transform.SetParent(this.transform);
        }
}

が、RectTransformではどうするんだろうと言うとこうします。
タッチした位置にInstantiateしてDoTweenでアニメーション付与して終わったら消す。

f:id:ghoul_life:20181112235926g:plain

// uGUIのprefab
public GameObject itemPrefab;

// Update is called once per frame
void Update () {
        if (Input.GetMouseButtonDown(0))
        {
            var canvas = this.GetComponent<Canvas>();
            var canvasRect = canvas.GetComponent<RectTransform>();

            Vector2 localpoint;
            RectTransformUtility.ScreenPointToLocalPointInRectangle(canvasRect, Input.mousePosition, canvas.worldCamera, out localpoint);
            var item = Instantiate(itemPrefab);
            item.transform.SetParent(this.transform);
            item.GetComponent<RectTransform>().anchoredPosition = localpoint;
            DoTweenUtil.UpToRectTransform(item);
        }
}

補足でDoTweenのコードも

    public static void UpToRectTransform(GameObject gameObject)
    {
        var rectTran = gameObject.GetComponent<RectTransform>();
        if(rectTran != null)
        {
            rectTran.DOMove(new Vector2(0 , 50) , 1.0f)
            .SetRelative(true)
            .OnComplete(() => {
                UnityEngine.Object.Destroy(gameObject);
            })
            .SetEase(Ease.OutCubic)
            .Play();
        }
    }

こんだけだけど

なるほど、RectTransformUtilityなんて便利なものがあるのね。
また一つ勉強になりました。

もうすぐunity1weekが始まりますね。お題は「クリスマス」ではないかと思っているのですが、
そんなことないか。
新型iPad ProとApple Pencilを衝動買いしてしまったのでお絵かき練習だけは継続しています。