一、前言
嗨,大家好,我是新发。今天教大家如何实现这个功能: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 举报,一经查实,本站将立刻删除。