【游戏开发实战】Unity 2D游戏手指控制移动摄像机镜头和双指缩放镜头(愤怒的小鸟为例)

一、前言

点关注不迷路,持续输出Unity干货文章。

嗨,大家好,我是新发。今天教大家如何实现这个功能:Unity 2D游戏手指控制移动摄像机镜头和双指缩放镜头。
我们以愤怒的小鸟为例。

本文最终效果如下:
在这里插入图片描述
本文Demo工程已上传到CodeChina,感兴趣的同学可自行下载学习。
地址:https://codechina.csdn.net/linxinfa/AngryBirdScene
注:我使用的Unity版本是2020.2.7f1c1 (64-bit)
在这里插入图片描述

二、导入图片素材

导入图片素材到Unity工程中。
请添加图片描述
请添加图片描述

三、制作场景预设

制作背景预设:Bg.prefab,制作小鸟预设:Bird.prefab
在这里插入图片描述
如下:
在这里插入图片描述

四、创建脚本:CameraControl.cs

创建脚本CameraControl.cs,实现鼠标(手指)控制摄像机移动和缩放的功能,代码如下:

// CameraControl.cs

using UnityEngine;

[RequireComponent(typeof(Camera))]
public class CameraControl : MonoBehaviour
{

    private Camera m_cam;
    private Transform m_selfTrans;
    private bool m_fingerDown = false;

    /// <summary>
    /// 单指滑动的手指位置
    /// </summary>
    private Vector3 m_oneFingerDragStartPos;
    /// <summary>
    /// 双指缩放的上一帧的双指距离
    /// </summary>
    private float m_twoFingerLastDistance = -1;


    private void Awake()
    {
        m_cam = GetComponent<Camera>();
        m_selfTrans = transform;
    }

    private void Update()
    {
#if UNITY_EDITOR || UNITY_STANDALONE
        if (Input.GetMouseButtonDown(0))
        {
            m_fingerDown = true;
            m_oneFingerDragStartPos = GetWorldPos(Input.mousePosition);
        }

        if (Input.GetMouseButtonUp(0))
        {
            m_fingerDown = false;
            m_twoFingerLastDistance = -1;
        }

        if (m_fingerDown)
        {
            HandleFingerDragMove(Input.mousePosition);
        }
        var distance = Input.GetAxis("Mouse ScrollWheel");
        HandleMouseScrollWheel(distance * 10);
#else
        if (2 == Input.touchCount)
        {
            // 双指缩放
            HandleTwoFingerScale();
        }
        else if (1 == Input.touchCount)
        {
            if (TouchPhase.Began == Input.touches[0].phase)
            {
                m_fingerDown = true;
                m_oneFingerDragStartPos = GetWorldPos(Input.mousePosition);
            }
            else if (TouchPhase.Moved == Input.touches[0].phase)
            {
                // 单指滑动
                HandleFingerDragMove(Input.touches[0].position);
            }
            m_twoFingerLastDistance = -1;
        }
        else
        {
            m_fingerDown = false;
            m_twoFingerLastDistance = -1;
        }
#endif
    }


    /// <summary>
    /// 单指滑动
    /// </summary>
    private void HandleFingerDragMove(Vector2 fingerPos)
    {
        //滑动差
        Vector3 cha = m_oneFingerDragStartPos - GetWorldPos(fingerPos);
        Vector3 newP = m_cam.transform.position;
        newP.x = newP.x + cha.x;
        if (newP.x > 17) { newP.x = 17; }
        if (newP.x < -10) { newP.x = -10; }
        newP.y = newP.y + cha.y;
        if (newP.y > 1.4f) { newP.y = 1.4f; }
        if (newP.y < 0) { newP.y = 0; }

        m_selfTrans.position = newP;
    }

    /// <summary>
    /// 双指缩放
    /// </summary>
    private void HandleTwoFingerScale()
    {
        float distance = Vector2.Distance(Input.touches[0].position, Input.touches[1].position);
        if (-1 == m_twoFingerLastDistance) m_twoFingerLastDistance = distance;
        // 与上一帧比较变化
        float scale = 0.1f * (distance - m_twoFingerLastDistance);
        ScaleCamere(scale);
        m_twoFingerLastDistance = distance;
    }

    /// <summary>
    /// 鼠标滚轮缩放
    /// </summary>
    /// <param name="distance"></param>
    private void HandleMouseScrollWheel(float distance)
    {
        if (0 == distance) return;
        ScaleCamere(distance);
    }

    /// <summary>
    /// 缩放摄像机的视口
    /// </summary>
    /// <param name="scale"></param>
    private void ScaleCamere(float scale)
    {
        m_cam.orthographicSize -= scale * 0.1f;
        if (m_cam.orthographicSize < 4)
        {
            m_cam.orthographicSize = 4;
        }
        if (m_cam.orthographicSize > 6)
        {
            m_cam.orthographicSize = 6;
        }
    }

    /// <summary>
    /// 屏幕坐标换算成3D坐标
    /// </summary>
    /// <param name="screenPos">屏幕坐标</param>
    /// <returns></returns>
    Vector3 GetWorldPos(Vector2 screenPos)
    {
        return m_cam.ScreenToWorldPoint(new Vector3(screenPos.x, screenPos.y, 0));
    }
}

五、挂脚本

CameraControl.cs脚本挂到主摄像机上。
在这里插入图片描述

六、运行测试

运行Unity,测试效果如下:
在这里插入图片描述
完毕。

  • 10
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林新发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值