Unity实现镜头移动和缩放

本文介绍了一个用于Unity游戏开发的输入管理系统,包括触控和鼠标两种输入方式的处理。通过定义各种回调函数,如开始、移动、缩放、更新和结束,实现了对输入事件的灵活响应。系统能根据不同平台(如Android和桌面)自动调整输入方式,适用于游戏或交互应用的开发。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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()
    {
    }


}

第一次发博客,有什么问题欢迎大神指导,谢谢,有更好的方法希望大神分享

Unity 是一款常用的游戏开发引擎,下面以鼠标旋转、缩放移动镜头的代码进行回答。 鼠标旋转镜头代码: 在 Unity 中,可以通过 Input.GetAxis("Mouse X") Input.GetAxis("Mouse Y") 获取鼠标在 X、Y 轴上的移动距离,然后将这个距离乘以一个旋转速度系数来控制镜头的旋转。具体代码如下: ```csharp public float rotateSpeed = 10f; void Update() { float mouseX = Input.GetAxis("Mouse X") * rotateSpeed; float mouseY = Input.GetAxis("Mouse Y") * rotateSpeed; transform.Rotate(Vector3.up, mouseX); transform.Rotate(Vector3.left, mouseY); } ``` 鼠标缩放镜头代码: 通过鼠标的滚轮滚动获取到滚动的值,然后根据这个值来调整镜头缩放大小。具体代码如下: ```csharp public float zoomSpeed = 10f; void Update() { float zoomAmount = Input.GetAxis("Mouse ScrollWheel") * zoomSpeed; transform.Translate(Vector3.forward * zoomAmount); } ``` 鼠标移动镜头代码: 这里使用 Input.GetAxis("Mouse X") Input.GetAxis("Mouse Y") 方法来获取鼠标在 X、Y 轴上的移动距离,然后根据这个值来移动镜头。具体代码如下: ```csharp public float moveSpeed = 10f; void Update() { float moveX = Input.GetAxis("Mouse X") * moveSpeed; float moveY = Input.GetAxis("Mouse Y") * moveSpeed; transform.Translate(moveX, 0, moveY); } ``` 以上就是在 Unity实现鼠标旋转、缩放移动镜头的代码,你可以根据需要将这些代码添加到你的项目中,并根据自己的情况进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值