using UnityEngine;
/// <summary>
/// 触碰回调函数
/// </summary>
public class TouchCallback
{
// 开始回调函数,(按下)触发一次
public delegate void Begin();
// 移动回调函数,移动时触发
public delegate void Move(Vector2 direction);
// 缩放回调函数,缩放时触发
public delegate void Scale(float distance);
// 结束回调函数,(松开)触发一次
public delegate void End();
// 更新回调函数,每侦触发
public delegate void Update();
}
using UnityEngine;
/// <summary>
/// 平台控制器
/// </summary>
public class PlatformController : MonoBehaviour
{
protected TouchCallback.Begin m_beginCallback;
protected TouchCallback.Move m_moveCallback;
protected TouchCallback.Scale m_scaleCallback;
protected TouchCallback.Update m_updateCallback;
protected TouchCallback.End m_endCallback;
/// <summary>
/// 初始化回调函数
/// </summary>
public virtual void Init(TouchCallback.Begin beginCallback, TouchCallback.Move moveCallback, TouchCallback.Scale scaleCallback, TouchCallback.Update updateCallback, TouchCallback.End endCallback)
{
this.m_beginCallback = beginCallback;
this.m_moveCallback = moveCallback;
this.m_scaleCallback = scaleCallback;
this.m_updateCallback = updateCallback;
this.m_endCallback = endCallback;
}
}
using UnityEngine;
/// <summary>
/// 触碰控制器
/// </summary>
public class TouchController : PlatformController
{
/// <summary>
/// 修正比例
/// </summary>
private float m_rate = 50f;
/// <summary>
/// 触点一
/// </summary>
private Touch m_oneTouch;
/// <summary>
/// 触点二
/// </summary>
private Touch m_twoTouch;
/// <summary>
/// 最后一次缩放距离
/// </summary>
private float m_lastScaleDistance;
/// <summary>
/// 当前缩放距离
/// </summary>
private float m_scaleDistance;
/// <summary>
/// 是否开始缩放
/// </summary>
private bool m_isStartZoom = true;
private void Update()
{
// 如果只有一个触点
if (Input.touchCount == 1)
{
this.m_oneTouch = Input.touches[0];
// 触点开始
if (this.m_oneTouch.phase == TouchPhase.Began)
{
// 触发开始回调函数
if (this.m_beginCallback != null) this.m_beginCallback();
}
// 触点移动
else if (m_oneTouch.phase == TouchPhase.Moved)
{
// 触发移动回调函数
if (this.m_moveCallback != null) this.m_moveCallback(new Vector2(this.m_oneTouch.deltaPosition.x, this.m_oneTouch.deltaPosition.y) / this.m_rate);
}
// 触点结束
else if (m_oneTouch.phase == TouchPhase.Ended)
{
// 触发结束回调函数
if (this.m_endCallback != null) this.m_endCallback();
}
}
// 如果有多个触点
if (Input.touchCount > 1)
{
this.m_oneTouch = Input.touches[0];
this.m_twoTouch = Input.touches[1];
// 如果是缩放
if (m_oneTouch.phase == TouchPhase.Moved || m_twoTouch.phase == TouchPhase.Moved)
{
if (m_isStartZoom)
{
this.m_lastScaleDistance = Vector2.Distance(this.m_oneTouch.position, this.m_twoTouch.position);
m_isStartZoom = false;
}
this.m_scaleDistance = Vector2.Distance(this.m_oneTouch.position, this.m_twoTouch.position);
// 触发缩放回调函数
this.m_scaleCallback((this.m_scaleDistance - this.m_lastScaleDistance) / this.m_rate);
this.m_lastScaleDistance = this.m_scaleDistance;
}
if (m_oneTouch.phase == TouchPhase.Ended || m_twoTouch.phase == TouchPhase.Ended)
{
m_isStartZoom = true;
}
}
// 触发每帧执行更新
if (this.m_updateCallback != null)
{
this.m_updateCallback();
}
}
}
using UnityEngine;
using System.Collections;
/// <summary>
/// 鼠标控制器
/// </summary>
public class MouseController : PlatformController
{
/// 鼠标枚举
enum MouseTypeEnum
{
LEFT = 0
}
/// <summary>
/// 缩放距离
/// </summary>
private float m_scrollDistance;
/// <summary>
/// 鼠标按住状态
/// </summary>
private bool m_mousePressStatus;
private void Update()
{
// 按下鼠标、轴
if (Input.GetMouseButtonDown((int)MouseTypeEnum.LEFT))
{
this.m_mousePressStatus = true;
// 触发开始回调函数
if (this.m_beginCallback != null) this.m_beginCallback();
}
// 松开鼠标、轴
if (Input.GetMouseButtonUp((int)MouseTypeEnum.LEFT))
{
this.m_mousePressStatus = false;
// 触发结束回调函数
if (this.m_endCallback != null) this.m_endCallback();
}
// 如果鼠标在按住状态
if (this.m_mousePressStatus)
{
// 触发移动回调函数
if (this.m_moveCallback != null) this.m_moveCallback(new Vector2(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y")));
}
// 鼠标滚轮拉近拉远
this.m_scrollDistance = Input.GetAxis("Mouse ScrollWheel");
// 触发缩放回调函数
if (this.m_scrollDistance != 0f && this.m_scaleCallback != null)
{
this.m_scaleCallback(this.m_scrollDistance);
}
// 触发每帧执行更新
if (this.m_updateCallback != null)
{
this.m_updateCallback();
}
}
}
using UnityEngine;
public class MainCameraController : MonoBehaviour
{
private PlatformController m_controller;
[Header("缩放系数")]
[SerializeField]
private float m_scaleMultiple = 1f;
[Header("滑动系数")]
[SerializeField]
private float m_moveMultiple = 8f;
private float m_minFieldOfView = 10f;
private float m_maxFieldOfView = 30f;
private void Awake()
{
#if UNITY_EDITOR
m_controller = this.gameObject.AddComponent<MouseController>();
#elif UNITY_ANDROID
m_controller = this.gameObject.AddComponent<TouchController>();
#endif
m_controller.Init(OnBeginCallback, OnMoveCallback, OnScaleCallback, OnUpdateCallback, OnEndCallback);
}
private void OnBeginCallback()
{
}
private void OnMoveCallback(Vector2 direction)
{
Vector2 dir = -(direction * m_moveMultiple);
Camera.main.transform.Translate(new Vector3(dir.x, dir.y, 0));
}
private void OnScaleCallback(float distance)
{
float field = Camera.main.fieldOfView - (distance * m_scaleMultiple);
Camera.main.fieldOfView = Mathf.Clamp(field, m_minFieldOfView, m_maxFieldOfView);
}
private void OnUpdateCallback()
{
}
private void OnEndCallback()
{
}
}
第一次发博客,有什么问题欢迎大神指导,谢谢,有更好的方法希望大神分享