最近又重构了一遍视角移动的功能,之前一直是在移动摄像机,本次重构改成了移动模型,就是限制模型不移动出屏幕的功能有点困难,实验了网上的检测模型边界、使用OnBecameVisible等方法,但是都不理想,最后还是使用了笨方法手动限定的,很麻烦,但是最终效果还是不错的。
1.配置文件类
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[Serializable]
public class CameraViewConfig
{
public float rotateSpeed = 0;
public float rotateDamp = 0;
public float moveSpeed = 0;
public float moveDamp = 0;
public List<RoomViewParam> roomViewParams = new List<RoomViewParam>();
}
[Serializable]
public class RoomViewParam
{
public string roomName = null;
public float minDistance = 0;
public float maxDistance = 0;
public float distance = 0;
public float scaleSpeed = 0;
public float scaleDamp = 0;
public float rotX = 0;
public float rotY = 0;
public float borderX1 = 0;
public float borderX2 = 0;
public float borderYF1 = 0;
public float borderYF2 = 0;
public float borderYB1 = 0;
public float borderYB2 = 0;
public float borderX1V = 0;
public float borderX1B = 0;
public float borderYB1V = 0;
public float borderYB1B = 0;
public float borderYF1V = 0;
public float borderYF1B = 0;
public float borderX2V = 0;
public float borderX2B = 0;
public float borderYB2V = 0;
public float borderYB2B = 0;
public float borderYF2V = 0;
public float borderYF2B = 0;
}
2.控制视角移动的类
using System.Collections;
using System.IO;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Networking;
using Camera = UnityEngine.Camera;
/// <summary>
/// 控制场景移动的脚本
/// </summary>
public class CameraControl_Move : MonoBehaviour
{
public static CameraControl_Move Instance = null;
/// <summary>
/// 跟随鼠标移动的焦点
/// </summary>
private Transform targetCache = null;
/// <summary>
/// 摄像机的水平轴
/// </summary>
private Transform vPivot = null;
/// <summary>
/// 摄像机的垂直轴
/// </summary>
private Transform hPivot = null;
/// <summary>
/// 摄像机
/// </summary>
private Camera mCamera = null;
/// <summary>
/// 水平轴的角度Y
/// </summary>
private float hPivot_RotY = 0;
/// <summary>
/// 垂直轴的角度X
/// </summary>
private float vPivot_RotX = 0;
/// <summary>
/// 旋转水平轴的角度
/// </summary>
private Quaternion hPivot_Rot = Quaternion.identity;
/// <summary>
/// 旋转垂直轴的角度
/// </summary>
private Quaternion vPivot_Rot = Quaternion.identity;
/// <summary>
/// 当前场景缩放最小的距离
/// </summary>
private float minDistance = 5;
/// <summary>
/// 当前场景缩放最大的距离
/// </summary>
private float maxDistance = 300;
/// <summary>
/// 目前场景的缩放距离
/// </summary>
private float currentDistance = 0;
/// <summary>
/// 旋转的速度
/// </summary>
private float rotateSpeed = 5f;
/// <summary>
/// 旋转的阻尼
/// </summary>
private float rotateDamp = 5f;
/// <summary>
/// 移动的阻尼
/// </summary>
private float moveDamp = 50;
/// <summary>
/// 缩放的速度
/// </summary>
private float scaleSpeed = 100;
/// <summary>
/// 缩放的阻尼
/// </summary>
private float scaleDamp = 10;
/// <summary>
/// 锁定后不能控制视角
/// </summary>
private bool isLocking = true;
private CameraViewConfig camViewConfig = new CameraViewConfig();
private Vector3 moveOffset, moveStartPos;
/// <summary>
/// 目前显示场景的缓存
/// </summary>
private Transform sceneCache = null;
/// <summary>