微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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,测试效果如下:

在这里插入图片描述


完毕。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐