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);
|
||
}
|
||
} |