unity通过鼠标操作摄像机围绕主角缩放、旋转、上下移动

控制摄像机的代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 摄像机控制器.  将该脚本挂载到CameraFollowAndRotate空物体身上.
/// </summary>
public class CameraController : MonoBehaviour
{
    public static CameraController instance;
    /// <summary>
    /// 控制摄像机的上下.
    /// </summary>
    [SerializeField]
    private Transform _CameraUpAndDown;
    /// <summary>
    /// 控制摄像机缩放.
    /// </summary>
    [SerializeField]
    private Transform _CameraZoomContainer;
    /// <summary>
    /// 摄像机容器.
    /// </summary>
    [SerializeField]
    private Transform _CameraContainer;

    void Awake()
    {
        instance = this;
    }

    
    /// <summary>
    /// 设置摄像机旋转.
    /// </summary>
    /// <param name="type">0代表左  1代表右</param>
    public void SetCameraRotate(int type)
    {
        transform.Rotate(new Vector3(0,20*Time.deltaTime*(type==1?-1:1),0));
    }
    /// <summary>
    /// 设置摄像机上下.
    /// </summary>
    /// <param name="type">0代表上  1代表下</param>
    public void SetCameraUpAndDown(int type)
    {
        _CameraUpAndDown.Rotate(20 * Time.deltaTime * (type == 0 ? -1 : 1),0,0);
        //限定摄像机上下.    注意事项:不要把_CameraUpAndDown这个空物体的旋转最小值设置成负数
        _CameraUpAndDown.localEulerAngles = new Vector3(Mathf.Clamp(_CameraUpAndDown.localEulerAngles.x,5,70),0,0);
        

    }
    /// <summary>
    /// 设置摄像机拉近拉远.
    /// </summary>
    public void SetCameraZoom(float value)
    {
        _CameraContainer.Translate(Vector3.forward * value * Time.deltaTime * 1000);
        //限定摄像机最远和最近距离.
        _CameraContainer.localPosition = new Vector3(0,0,Mathf.Clamp(_CameraContainer.localPosition.z,-26,26));
    }
    /// <summary>
    /// 绘制摄像机运动轨迹.
    /// </summary>
    void OnDrawGizmos()
    {
        Gizmos.color = Color.red;
        Gizmos.DrawWireSphere(transform.position,24);
        Gizmos.color = Color.blue;
        Gizmos.DrawWireSphere(transform.position, 19);
    }
}

 鼠标滑动拖拽事件代码:

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
/// <summary>
/// 拖拽事件脚本.  将该脚本挂载到Panel身上.
/// </summary>
public class DragEvent : MonoBehaviour, IDragHandler,IPointerDownHandler
{

    private Vector2 oldMousePos;//记录上一次鼠标点中屏幕的坐标.

    public static DragEvent instance;

    void Awake()
    {
        instance = this;
    }

    /// <summary>
    /// 拖拽的方向.
    /// </summary>
    public enum DragDir
    {
        Left,
        Right,
        Up,
        Down
    }
    /// <summary>
    /// 缩放类型.
    /// </summary>
    public enum ZoomType
    {
        In,//向内.
        Out//向外.
    }
    /// <summary>
    /// 拖拽事件
    /// </summary>
    public Action<DragDir> onDragEvent;
    public Action<ZoomType,float> onZoomEvent;

    void Update()
    {
        //获取鼠标滚轮键滑动的值.  >0代表拉近   <0代表拉远.
        if (Input.GetAxis("Mouse ScrollWheel")>0)
        {
            if (onZoomEvent != null)
            {
                onZoomEvent(ZoomType.In, Input.GetAxis("Mouse ScrollWheel"));
            }
        }else if (Input.GetAxis("Mouse ScrollWheel")< 0)
        {
            if (onZoomEvent != null)
            {
                onZoomEvent(ZoomType.Out, Input.GetAxis("Mouse ScrollWheel"));
            }
        }
    }

    /// <summary>
    /// 拖拽进行中.
    /// </summary>
    /// <param name="eventData"></param>
    public void OnDrag(PointerEventData eventData)
    {
        Vector2 dir = eventData.position - oldMousePos;


       //计算鼠标滑动的方向.
        if(dir.y<dir.x&& dir.y > -dir.x)
        {
            if (onDragEvent != null)
            {
                onDragEvent(DragDir.Right);
            }
        }else if(dir.y>dir.x && dir.y < -dir.x)
        {
            if (onDragEvent != null)
            {
                onDragEvent(DragDir.Left);
            }
        }
        else if (dir.y > dir.x && dir.y>-dir.x)
        {
            if (onDragEvent != null)
            {
                onDragEvent(DragDir.Up);
            }
        }
        else
        {
            if (onDragEvent != null)
            {
                onDragEvent(DragDir.Down);
            }
        }
    }
    /// <summary>
    /// 鼠标在屏幕按下的时候.
    /// </summary>
    public void OnPointerDown(PointerEventData eventData)
    {
        oldMousePos = eventData.position;
    }
}

控制角色的代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 角色控制器.  将该脚本挂载到Player游戏物体身上.
/// </summary>
public class PlayerController : MonoBehaviour {

    private Transform _Transform;

    void Start()
    {
        _Transform = gameObject.GetComponent<Transform>();
        //订阅事件.
        DragEvent.instance.onDragEvent += OnDragEvent;
        DragEvent.instance.onZoomEvent += OnZoomEvent;
    }


    void OnDestroy()
    {
        //取消事件.
        DragEvent.instance.onDragEvent -= OnDragEvent;
        DragEvent.instance.onZoomEvent -= OnZoomEvent;
    }
    /// <summary>
    /// 事件回调.
    /// </summary>
    private void OnDragEvent(DragEvent.DragDir dir)
    {
        switch (dir)
        {
            case DragEvent.DragDir.Left:
                CameraController.instance.SetCameraRotate(1);
                break;
            case DragEvent.DragDir.Right:
                CameraController.instance.SetCameraRotate(0);
                break;
            case DragEvent.DragDir.Up:
                CameraController.instance.SetCameraUpAndDown(0);
                break;
            case DragEvent.DragDir.Down:
                CameraController.instance.SetCameraUpAndDown(1);
                break;
        }
    }
    /// <summary>
    /// 摄像机缩放事件回调.
    /// </summary>
    /// <param name="zoom"></param>
    /// <param name="value"></param>
    private void OnZoomEvent(DragEvent.ZoomType zoom,float value)
    {
        switch (zoom)
        {
            case DragEvent.ZoomType.In:
                CameraController.instance.SetCameraZoom(value);
                break;
            case DragEvent.ZoomType.Out:
                CameraController.instance.SetCameraZoom(value);
                break;
        }
    }
    void Update()
    {
        CameraAutoFollow();
    }
    /// <summary>
    /// 摄像机自动跟随.
    /// </summary>
    private void CameraAutoFollow()
    {
        if (CameraController.instance != null)
        {
            CameraController.instance.transform.position = _Transform.position;
        }
       
    }
}

 

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值