Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
7
Help us understand the problem. What is going on with this article?
@htakemoto32

とりあえずuGUIでピンチインピンチアウトによる拡大縮小をしたい

More than 3 years have passed since last update.

Unityでピンチピンチインピンチアウトをしたいんですよ。
スマホでは必須(?)の操作なので、自分用のScript欲しいですよね!ってことで、さっそく実装しました。

PinchinPinchOut.cs
using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class PinchinPinchOut : MonoBehaviour {

    private float scale;
    private float backDist = 0.0f;

    // デバッグ用テキスト(scaleサイズ確認用)
    public Text scaleText;

    // デフォルトサイズ
    private float defaultScale;

    void Start () {
        // 初期値取得
        RectTransform rt = this.GetComponent(typeof (RectTransform)) as RectTransform;
        defaultScale = rt.sizeDelta.x;
    }

    void Update () {

        // マルチタッチ判定
        if (Input.touchCount >= 2) {

            // タッチ開始時に初期値を取得
            RectTransform rt = this.GetComponent(typeof (RectTransform)) as RectTransform;
            defaultScale = rt.sizeDelta.x;

            // タッチしている2点を取得
            Touch touch1 = Input.GetTouch (0);
            Touch touch2 = Input.GetTouch (1);

            // 2点タッチ開始時の距離を記憶
            if (touch2.phase == TouchPhase.Began) {
                backDist = Vector2.Distance (touch1.position, touch2.position);
            } else if (touch1.phase == TouchPhase.Moved && touch2.phase == TouchPhase.Moved) {
                // タッチ位置の移動後、長さを再測し、前回の距離からの相対値を取る。
                float newDist = Vector2.Distance (touch1.position, touch2.position);
                scale = defaultScale + (newDist - backDist) / 100.0f;
                scaleText.text = "scalse = " + scale.ToString();

                // 相対値が変更した場合、オブジェクトに相対値を反映させる
                if(scale != 0) {
                    UpdateScaling(scale);  
                }
            }
        }
    }

    /// 設定された拡大率に基づいてオブジェクトの大きさを更新する
    private void UpdateScaling(float argScale) {
        RectTransform rt = this.GetComponent(typeof (RectTransform)) as RectTransform;
        rt.sizeDelta = new Vector2 (argScale, argScale);
    }
}

所感

  • ピンチインピンチアウトの上下限を設けて制御する部分に若干手間取りました。。。
  • 本当は大きくなりすぎたり小さくなりすぎたりするのを制御すべきだが、今回は時間いっぱいにつき、実装せず。。。
  • 汎用的コードを載せるのであれば、上記のデバッグ用テキストは不要なんですけど、自分用ということで、残させていただきました。
  • 無駄に何回も取得しているような気もしていますが、これまた時間いっぱいということで、妥協。。。
  • あと、複数オブジェクトにこのScriptをアタッチすると、ピンチインピンチアウトしたときにアタッチしたオブジェクトすべてが拡大縮小されてしまうので、どのオブジェクトを拡大縮小の対象にするかのフラグが必要。
7
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
7
Help us understand the problem. What is going on with this article?