131 lines
4.3 KiB
C#
131 lines
4.3 KiB
C#
|
using System.Collections;
|
|||
|
using Games.Events;
|
|||
|
using Games.Scene;
|
|||
|
using GCGame.Table;
|
|||
|
using Module.Log;
|
|||
|
using UnityEngine;
|
|||
|
using UnityEngine.SceneManagement;
|
|||
|
|
|||
|
public class SceneMapFix : MonoBehaviour
|
|||
|
{
|
|||
|
private static SceneMapFix _Instance;
|
|||
|
//public Transform m_childPoint_MapToScene;
|
|||
|
public Transform m_childPoint_SceneToMap;
|
|||
|
public Transform m_FixRectObj;
|
|||
|
private BoxCollider _fixRectCollider;
|
|||
|
private int InitMapInfoScene = -100;
|
|||
|
private SceneMapFixData m_FixData;
|
|||
|
|
|||
|
public static SceneMapFix Instance()
|
|||
|
{
|
|||
|
return _Instance;
|
|||
|
}
|
|||
|
|
|||
|
public static void SetInstance(SceneMapFix instance)
|
|||
|
{
|
|||
|
_Instance = instance;
|
|||
|
}
|
|||
|
|
|||
|
private void OnDestroy()
|
|||
|
{
|
|||
|
SetInstance(null);
|
|||
|
InitMapInfoScene = -100;
|
|||
|
}
|
|||
|
|
|||
|
private void Awake()
|
|||
|
{
|
|||
|
SetInstance(this);
|
|||
|
InitMapInfoScene = -100;
|
|||
|
DontDestroyOnLoad(gameObject);
|
|||
|
_fixRectCollider = m_FixRectObj.GetComponent<BoxCollider>();
|
|||
|
}
|
|||
|
|
|||
|
public string CurrSceneName
|
|||
|
{
|
|||
|
get { return m_FixData == null ? "" : m_FixData.SceneName; }
|
|||
|
}
|
|||
|
|
|||
|
public Vector3 ScenePosToMapPosVec2(Vector2 scenePos, RectTransform m_Rect = null)
|
|||
|
{
|
|||
|
var realScenePos = new Vector3(scenePos.x, 0, scenePos.y);
|
|||
|
realScenePos = ActiveScene.GetTerrainPosition(realScenePos);
|
|||
|
return ScenePosToMapPosVec3(realScenePos, m_Rect);
|
|||
|
}
|
|||
|
|
|||
|
public Vector3 ScenePosToMapPosVec3(Vector3 scenPos, RectTransform m_Rect = null)
|
|||
|
{
|
|||
|
var result = Vector3.zero;
|
|||
|
if (m_FixData != null)
|
|||
|
{
|
|||
|
var dir = -m_FixRectObj.forward;
|
|||
|
var ray = new Ray(scenPos, dir);
|
|||
|
RaycastHit hit;
|
|||
|
if (_fixRectCollider.Raycast(ray, out hit, float.PositiveInfinity))
|
|||
|
result = m_FixRectObj.worldToLocalMatrix.MultiplyPoint3x4(hit.point);
|
|||
|
if (m_Rect != null)
|
|||
|
{
|
|||
|
var x = m_Rect.sizeDelta.x * result.x;
|
|||
|
var y = m_Rect.sizeDelta.y * result.y;
|
|||
|
result.x = x;
|
|||
|
result.y = y;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return result;
|
|||
|
}
|
|||
|
|
|||
|
//mapPos 范围在(-0.5,-0.5)-- (0.5,0.5)
|
|||
|
public Vector3 MapPosToScenePos(Vector2 mapPos)
|
|||
|
{
|
|||
|
if (m_FixData == null)
|
|||
|
return Vector3.zero;
|
|||
|
var raySource = m_FixRectObj.localToWorldMatrix.MultiplyPoint3x4(new Vector3(mapPos.x, mapPos.y, 0.5f));
|
|||
|
var ray = new Ray(raySource, m_FixRectObj.forward);
|
|||
|
var result = ActiveScene.GetTerrainPosition(ray);
|
|||
|
return result == null ? Vector3.zero : result.Value;
|
|||
|
}
|
|||
|
|
|||
|
public void Start()
|
|||
|
{
|
|||
|
transform.position = Vector3.zero;
|
|||
|
transform.localEulerAngles = Vector3.zero;
|
|||
|
transform.localScale = Vector3.one;
|
|||
|
if (InitMapInfoScene == GameManager.gameManager.RunningScene && m_FixData!=null && m_FixRectObj!=null)
|
|||
|
return;
|
|||
|
var curScene = TableManager.GetSceneClassByID(GameManager.gameManager.RunningScene, 0);
|
|||
|
if (null == curScene)
|
|||
|
{
|
|||
|
LogModule.ErrorLog("load scene map table fail :" + GameManager.gameManager.RunningScene);
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
if (curScene.SceneMapTexture == null || curScene.SceneMapTexture.Length <= 0)
|
|||
|
return;
|
|||
|
if (curScene.SceneMapTexture.ToLower().Contains(SceneManager.GetActiveScene().name.ToLower()) == false)
|
|||
|
return;
|
|||
|
InitMapInfoScene = GameManager.gameManager.RunningScene;
|
|||
|
var table = new Hashtable();
|
|||
|
table["AssetType"] = typeof(SceneMapFixData);
|
|||
|
var sceneName = SceneManager.GetActiveScene().name.ToLower();
|
|||
|
LoadAssetBundle.Instance.LoadAsset(LoadAssetBundle.BUNDLE_PATH_Other + sceneName,
|
|||
|
sceneName, delegate (string assetName, Object resObj, Hashtable hashParam)
|
|||
|
{
|
|||
|
if (resObj != null)
|
|||
|
{
|
|||
|
m_FixData = resObj as SceneMapFixData;
|
|||
|
InitFixData();
|
|||
|
}
|
|||
|
},
|
|||
|
table, true);
|
|||
|
}
|
|||
|
|
|||
|
private void InitFixData()
|
|||
|
{
|
|||
|
if (m_FixData == null)
|
|||
|
return;
|
|||
|
m_FixRectObj.localPosition = m_FixData.m_Pos;
|
|||
|
m_FixRectObj.localEulerAngles = m_FixData.m_EulerAngles;
|
|||
|
m_FixRectObj.localScale = new Vector3(m_FixData.m_SizeRect.x, m_FixData.m_SizeRect.y, 1);
|
|||
|
EventDispatcher.Instance.Dispatch(Games.Events.EventId.OnSceneMapFixLoadOver);
|
|||
|
}
|
|||
|
}
|