ヘケケの模索生活

ゲーム関係のことを書いています。ストラテジーやシミュレーション系のゲームが好きなのでそういったゲームの記事が中心です。unityを使ったアプリ開発や一人海外旅行をした時のこともたまに書いたりします。

【Unity】ピンチイン・ピンチアウトでのカメラ位置の変更

ピンチイン・ピンチアウト操作でカメラ位置を前後させ、

画面表示を拡大縮小させる機能を作りました。

 

 C#スクリプト


using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MainCameraController : MonoBehaviour
{

    float heightMin = 2.0f;
    float heightMax = 2000.0f;
    //前回の2点間の距離
    float pre_point2Dist;
    //初期値
    float cameraHeight = 10.0f;
    Vector3 pre_t1;
    Vector3 pre_t2;

    void Update()
    {
        /*-------- ピンチイン・ピンチアウト処理 --------*/
        // マルチタッチ判定
        if (Input.touchCount >= 2)
        {
            // タッチしている2点を取得
            Touch t1 = Input.GetTouch(0);
            Touch t2 = Input.GetTouch(1);

            //2点タッチ開始時の距離を保持
            if (t2.phase == TouchPhase.Began)
            {
                pre_point2Dist = Vector2.Distance(t1.position, t2.position);
            }
            //タッチ位置の変化を検出
            else if (t1.phase == TouchPhase.Moved || t2.phase == TouchPhase.Moved)
            {
                //2点タッチの位置、各タッチ位置の前回値との差を取得
                float point2Dist = Vector2.Distance(t1.position, t2.position);
                float dist1 = Vector2.Distance(t1.position, pre_t1);
                float dist2 = Vector2.Distance(t2.position, pre_t2);
                //2点間の差が縮んだらマイナス、開いたらプラスにする
                if (Mathf.Sign(point2Dist - pre_point2Dist) >= 0)
                {
                    cameraHeight = (dist1 + dist2) / 100.0f;
                }
                else if (Mathf.Sign(point2Dist - pre_point2Dist) <= 0)
                {
                    cameraHeight = -(dist1 + dist2) / 100.0f;
                }

                //タッチ位置の差に変化があれば変更
                if (cameraHeight != 0)
                {
                    float y = this.transform.position.y;
                    float heightLimitJudg = cameraHeight + y;
                    // 限界値をオーバーした際の処理
                    if (heightLimitJudg > (heightMax + 1.0f))
                    {
                        heightLimitJudg = heightMax;
                        this.transform.position = new Vector3(0, heightLimitJudg, 0);
                    }
                    else if (heightLimitJudg < (heightMin - 1.0f))
                    {
                        heightLimitJudg = heightMin;
                        this.transform.position = new Vector3(0, heightLimitJudg, 0);
                    }
                    else
                    {
                        this.transform.Translate(0, 0, cameraHeight);
                    }
                }
                //前回値として2点間距離を保持
                pre_point2Dist = point2Dist;
            }
            //前回値としてタッチ位置を保持
            pre_t1 = t1.position;
            pre_t2 = t2.position;
        }
    }
} 

 

補足説明

カメラは「Inspector」上で X軸 を90度回しています。そのため、

this.transform.Translate(0, 0, cameraHeight);

では、相対位置を変化させているため Z軸 を操作していますが、

this.transform.position = new Vector3(0, heightLimitJudg, 0);

では、絶対位置を変化させているため Y軸 を操作しています。

 

 

 

if (heightLimitJudg > (heightMax + 1.0f))

else if (heightLimitJudg < (heightMin - 1.0f))

上記、限界値判定の際に1.0fを加算減算していますが、

実際の限界値と判定値を同じにすると、カメラ位置が限界値に張り付いてしまい、

操作を受け付けなくなってしまうので追加しています。