You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
214 lines
7.5 KiB
214 lines
7.5 KiB
4 years ago
|
using AX.MessageSystem;
|
||
|
using System.Collections;
|
||
|
using System.Collections.Generic;
|
||
|
using UnityEngine;
|
||
|
using System;
|
||
|
using UnityEngine.UI;
|
||
|
/// <summary>
|
||
|
/// 小地图管理类
|
||
|
/// </summary>
|
||
|
public class MiniMapCameraManager : MonoBehaviour
|
||
|
{
|
||
|
//UIRoot
|
||
|
private Canvas canvas;
|
||
|
//小地图
|
||
|
private Transform miniMap;
|
||
|
//UI相机
|
||
|
private Camera uiCamera;
|
||
|
//主相机
|
||
|
private Camera mainCamera;
|
||
|
//小地图相机
|
||
|
private Camera miniMapCamera;
|
||
|
//主相机管理
|
||
|
private CameraManager cameraManager;
|
||
|
//缩放状态
|
||
|
private ZoomState zoomState = ZoomState.Normal;
|
||
|
//小地图UIRoot
|
||
|
private Transform miniMapUIRoot;
|
||
|
//缩放比例
|
||
|
private Vector3 screenScale = Vector3.one;
|
||
|
//当前缩放比例
|
||
|
private Vector3 currentScale = Vector3.one;
|
||
|
//缩放速度
|
||
|
public float zoomSpeed = 10;
|
||
|
//相机最小值
|
||
|
public float zoomMin = 50;
|
||
|
//相机最大值
|
||
|
public float zoomMax = 300;
|
||
|
//当前相机大小
|
||
|
private float currentSize = 50;
|
||
|
//相机视野边界最大值
|
||
|
public Vector2 PosToWorldMax = new Vector2(700f,450);
|
||
|
//相机视野边界最小值
|
||
|
public Vector2 PosToWorldMin = new Vector2(-1700f,-1700);
|
||
|
/// <summary>
|
||
|
/// 初始化
|
||
|
/// </summary>
|
||
|
void Start()
|
||
|
{
|
||
|
canvas = GameObject.Find("Canvas").GetComponent<Canvas>();
|
||
|
miniMap = GameObject.Find("Minimap Image").transform;
|
||
|
uiCamera = GameObject.Find("UICamera").GetComponent<Camera>();
|
||
|
miniMapUIRoot = GameObject.Find("MiniMapPanel").transform;
|
||
|
mainCamera = Camera.main;
|
||
|
miniMapCamera = GetComponent<Camera>();
|
||
|
cameraManager = mainCamera.GetComponent<CameraManager>();
|
||
|
SetMiniMapCameraOrthographicSize(currentSize);
|
||
|
transform.position = new Vector3(cameraManager.target.transform.position.x, 900f, cameraManager.target.transform.position.z);
|
||
|
InitScale();
|
||
|
}
|
||
|
//初始化小地图的缩放比例
|
||
|
private void InitScale()
|
||
|
{
|
||
|
//获取UI的实际尺寸
|
||
|
float width = (miniMapUIRoot as RectTransform).rect.width;
|
||
|
float height = (miniMapUIRoot as RectTransform).rect.height;
|
||
|
//获取UI同比例下屏幕的实际尺寸
|
||
|
float tempX = canvas.GetComponent<CanvasScaler>().referenceResolution.x * 0.5f;
|
||
|
float tempY = canvas.GetComponent<CanvasScaler>().referenceResolution.y * 0.5f;
|
||
|
//计算屏幕比例
|
||
|
screenScale = new Vector3(tempX / width, tempY / height, 1f);
|
||
|
}
|
||
|
private void OnEnable()
|
||
|
{
|
||
|
//监听小地图缩小
|
||
|
MessageDispatcher.AddListener(MessageName.MiniMapShrink.ToString(), MiniMapShrink);
|
||
|
//放大
|
||
|
MessageDispatcher.AddListener(MessageName.MiniMapEnlarge.ToString(), MiniMapEnlarge);
|
||
|
//缩放
|
||
|
MessageDispatcher.AddListener(MessageName.MiniMapZoom.ToString(), MiniMapZoom);
|
||
|
//右键点击
|
||
|
MessageDispatcher.AddListener(MessageName.MiniMapRightClick.ToString(), MiniMapRightClick);
|
||
|
}
|
||
|
|
||
|
private void OnDisable()
|
||
|
{
|
||
|
MessageDispatcher.RemoveListener(MessageName.MiniMapShrink.ToString(), MiniMapShrink);
|
||
|
MessageDispatcher.RemoveListener(MessageName.MiniMapEnlarge.ToString(), MiniMapEnlarge);
|
||
|
MessageDispatcher.RemoveListener(MessageName.MiniMapZoom.ToString(), MiniMapZoom);
|
||
|
MessageDispatcher.AddListener(MessageName.MiniMapRightClick.ToString(), MiniMapRightClick);
|
||
|
}
|
||
|
/// <summary>
|
||
|
/// 在小地图上点击右键
|
||
|
/// </summary>
|
||
|
/// <param name="obj"></param>
|
||
|
private void MiniMapRightClick(IMessage obj)
|
||
|
{
|
||
|
UpdateMiniMapPosition();
|
||
|
}
|
||
|
/// <summary>
|
||
|
/// 处理小地图缩放消息
|
||
|
/// </summary>
|
||
|
/// <param name="obj"></param>
|
||
|
private void MiniMapZoom(IMessage obj)
|
||
|
{
|
||
|
switch (zoomState)
|
||
|
{
|
||
|
case ZoomState.Normal:
|
||
|
miniMapUIRoot.localScale = screenScale;
|
||
|
zoomState = ZoomState.Max;
|
||
|
currentScale = screenScale;
|
||
|
break;
|
||
|
case ZoomState.Max:
|
||
|
miniMapUIRoot.localScale = Vector3.one;
|
||
|
zoomState = ZoomState.Normal;
|
||
|
currentScale = Vector3.one;
|
||
|
break;
|
||
|
case ZoomState.Min:
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
/// <summary>
|
||
|
/// 处理小地图放大消息
|
||
|
/// </summary>
|
||
|
/// <param name="obj"></param>
|
||
|
private void MiniMapEnlarge(IMessage obj)
|
||
|
{
|
||
|
currentSize = miniMapCamera.orthographicSize + zoomSpeed;
|
||
|
SetMiniMapCameraOrthographicSize(currentSize);
|
||
|
}
|
||
|
/// <summary>
|
||
|
/// 处理小地图缩小消息
|
||
|
/// </summary>
|
||
|
/// <param name="obj"></param>
|
||
|
private void MiniMapShrink(IMessage obj)
|
||
|
{
|
||
|
currentSize = miniMapCamera.orthographicSize - zoomSpeed;
|
||
|
SetMiniMapCameraOrthographicSize(currentSize);
|
||
|
}
|
||
|
/// <summary>
|
||
|
/// 修改小地图相机大小
|
||
|
/// </summary>
|
||
|
/// <param name="value"></param>
|
||
|
void SetMiniMapCameraOrthographicSize(float value)
|
||
|
{
|
||
|
miniMapCamera.orthographicSize = Mathf.Clamp(value, zoomMin, zoomMax);
|
||
|
}
|
||
|
/// <summary>
|
||
|
/// 更新小地图坐标
|
||
|
/// </summary>
|
||
|
void UpdateMiniMapPosition()
|
||
|
{
|
||
|
//获取鼠标所谓屏幕像素坐标
|
||
|
Vector2 mousePos;
|
||
|
RectTransformUtility.ScreenPointToLocalPointInRectangle(
|
||
|
canvas.transform as RectTransform,
|
||
|
Input.mousePosition,
|
||
|
canvas.worldCamera,
|
||
|
out mousePos);
|
||
|
//获取小地图所在屏幕像素坐标
|
||
|
Vector2 miniMapPos;
|
||
|
RectTransformUtility.ScreenPointToLocalPointInRectangle(
|
||
|
canvas.transform as RectTransform,
|
||
|
uiCamera.WorldToScreenPoint(miniMap.position),
|
||
|
canvas.worldCamera,
|
||
|
out miniMapPos);
|
||
|
//计算点击位置小地图的偏移值
|
||
|
Vector2 miniMapOffset = mousePos - miniMapPos;
|
||
|
Vector3 minimapCameraPos = transform.position;
|
||
|
//Debug.Log(string.Format("小地图中心点与鼠标点击位置偏移:{0}", miniMapOffset));
|
||
|
float XRate = -miniMapOffset.x / ((miniMap as RectTransform).rect.width * currentScale.x);
|
||
|
float YRate = -miniMapOffset.y / ((miniMap as RectTransform).rect.height * currentScale.y);
|
||
|
Vector3 worldOffset = new Vector3(
|
||
|
XRate * miniMapCamera.orthographicSize * 2,
|
||
|
0,
|
||
|
YRate * miniMapCamera.orthographicSize * 2);
|
||
|
Vector3 clickPosToWorld = minimapCameraPos + worldOffset;
|
||
|
|
||
|
//限制相机显示位置
|
||
|
if (clickPosToWorld.x > PosToWorldMax.x)
|
||
|
{
|
||
|
clickPosToWorld.x = PosToWorldMax.x;
|
||
|
}
|
||
|
if (clickPosToWorld.z > PosToWorldMax.y)
|
||
|
{
|
||
|
clickPosToWorld.z = PosToWorldMax.y;
|
||
|
}
|
||
|
if(clickPosToWorld.x<PosToWorldMin.x)
|
||
|
{
|
||
|
clickPosToWorld.x = PosToWorldMin.x;
|
||
|
}
|
||
|
if (clickPosToWorld.z<PosToWorldMin.y)
|
||
|
{
|
||
|
clickPosToWorld.z = PosToWorldMin.y;
|
||
|
}
|
||
|
//cameraManager.target.transform.position = new Vector3(
|
||
|
// clickPosToWorld.x,
|
||
|
// cameraManager.target.transform.position.y,
|
||
|
// clickPosToWorld.z+6);
|
||
|
cameraManager.SetCameraView(new Vector3(
|
||
|
clickPosToWorld.x,
|
||
|
cameraManager.target.transform.position.y,
|
||
|
clickPosToWorld.z + 6), 100, 0, 0);
|
||
|
//通知主相机复位
|
||
|
MessageDispatcher.SendMessage(MessageName.RestCamera.ToString());
|
||
|
transform.position = new Vector3(clickPosToWorld.x, 900, clickPosToWorld.z);
|
||
|
}
|
||
|
public enum ZoomState
|
||
|
{
|
||
|
Normal,
|
||
|
Max,
|
||
|
Min
|
||
|
}
|
||
|
}
|