using CG.Framework;
using CG.UTility;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace ZXK.GYJQR
{
///
/// 控制设备部件的显示和高亮效果
///
public class AcquaintPartCtrl : MonoBehaviour
{
///
/// 模型信息数据列表
///
private Dictionary _selectGeoDic = new Dictionary();
private string _curShowModelName;
[SerializeField]
private Material _baseNoAlpha = null;
[SerializeField]
private Material _baseAlpha = null;
private GameObject _baseGeo = null;
///
/// 当前高亮显示的模型的泛光效果列表,方便关闭其他亮着的
///
private List _currentHighlights = new List();
private Ray _ray;
private RaycastHit _rayHit;
private GameObject _clickedObject;
private float _doubleClickGeoInterval = 0.3f;
private float _curClickTime = 0;
//鼠标按下后没有位移才触发点击操作
private bool _mouseDown = false;
private Vector2 _mouseMove = Vector2.zero;
public void Enter()
{
PopUpMng.PopToast("单击场景/部件栏中的部件,可查看介绍;双击场景/部件栏中的部件,可独立显示;", -1,UIGroup.Main);
transform.GetChild(0).gameObject.SetActive(false);
transform.GetChild(1).gameObject.SetActive(false);
gameObject.SetActive(true);
_curShowModelName = GameManager.Instance._DataBJCJHandler._ShowPartsName.Value;
transform.Find(_curShowModelName).gameObject.SetActive(true);
GameManager.Instance._DataBJCJHandler._CurBJRZhandler.OnValueChanged += OnSelectInfoChanged;
AddOutlineAndColliders();
}
private void Update()
{
if (!PopUpMng._TriAble) return;
//Camera.main.GetComponent()._STRForbid = false;
if (Input.GetMouseButtonDown(0))
{
_mouseDown = true;
_mouseMove = Vector2.zero;
}
if (Input.GetMouseButton(0))
{
if (_mouseDown)
{
float mouse_x = Input.GetAxis("Mouse X");
float mouse_y = Input.GetAxis("Mouse Y");
_mouseMove += new Vector2(mouse_x, mouse_y);
}
}
_ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(_ray, out _rayHit))
{
if (Input.GetMouseButtonDown(0))
{
if (Time.time - _curClickTime < _doubleClickGeoInterval)
{//双击物体,独立显示
if (BJCZSceneCtrl._Instance._OnlyShowGeo)
{
BJCJ_INFO bjrzInfo = GameManager.Instance._DataBJCJHandler._CurBJRZhandler.GetValue()[_curShowModelName];
if (bjrzInfo == null) return;
GameManager.Instance._DataBJCJHandler._CurBJRZhandler.SetValue(_curShowModelName, bjrzInfo);
}
else
{
if (_clickedObject == _rayHit.collider.gameObject)
{
if (_clickedObject.GetComponent())
{
DoubleClickShow(_curShowModelName, _clickedObject.name);
}
else
{
System.Action myAction = (geoParent) =>
{
DoubleClickShow(_curShowModelName, geoParent.name);
};
_clickedObject.transform.SendMessageUpwards("TriCallAction", myAction);
}
}
}
_curClickTime = 0;
}
_curClickTime = Time.time;
}
if (Input.GetMouseButtonUp(0) && _mouseMove == Vector2.zero)
{
_mouseDown = false;
_mouseMove = Vector2.zero;
//_ray = Camera.main.ScreenPointToRay(Input.mousePosition);
//if (Physics.Raycast(_ray, out _rayHit))
//{
_clickedObject = _rayHit.collider.gameObject;
GameObject stringParent = null;
WDebug.Log($"射线检测到的模型:{_clickedObject.name}");
if (_clickedObject.GetComponent())
{
HighlightModel(_clickedObject);
stringParent = _clickedObject;
}
else
{
System.Action myAction = (geoParent) =>
{
HighlightModel(geoParent);
stringParent = geoParent;
};
_clickedObject.transform.SendMessageUpwards("TriCallAction", myAction);
}
if (BJCZSceneCtrl._Instance._OnlyShowGeo == null)
{
// 获取并处理模型信息
BJCJ_INFO bjrzInfo = GameManager.Instance._DataBJCJHandler.GetBJRZInfoByPartName(stringParent.name);
GameManager.Instance._DataBJCJHandler._CurBJRZhandler.SetValue(_curShowModelName, bjrzInfo);
}
}
//Camera.main.GetComponent()._STRForbid = true;
}
}
public void End()
{
GameManager.Instance._DataBJCJHandler._CurBJRZhandler.OnValueChanged -= OnSelectInfoChanged;
GameManager.Instance._DataBJCJHandler._CurBJRZhandler.SetDefault();
gameObject.SetActive(false);
}
private void OnDestroy()
{
End();
}
private void OnSelectInfoChanged(Dictionary obj)
{
Show(obj[_curShowModelName].itemGeo);
}
private void Show(string geoName)
{
transform.Find(_curShowModelName).gameObject.SetActive(true);
if (_selectGeoDic.ContainsKey(geoName))
{
if (BJCZSceneCtrl._Instance._OnlyShowGeo)
{
DestroyImmediate(BJCZSceneCtrl._Instance._OnlyShowGeo);
BJCZSceneCtrl._Instance._OnlyShowGeo = null;
}
WDebug.Log($"显示模型:{_selectGeoDic[geoName]}");
HighlightModel(_selectGeoDic[geoName]);
}
}
///
/// 双击某个物体,独立显示
///
/// 所属父物体
/// 显示物体
public void DoubleClickShow(string showGroupName, string geoName)
{
if (_selectGeoDic.ContainsKey(geoName))
{
//独显摄像机设置
CameraAroundCtrl cameraCtrl = null;
if (Camera.main.TryGetComponent(out cameraCtrl))
{
ItemInfoCtrl itemInfo = _selectGeoDic[geoName].GetComponent();
if (itemInfo)
{
cameraCtrl.CameraToTarget(
itemInfo.transform.position + itemInfo._CameraRelaticeSelfPos
, itemInfo._CameraZoomSize);
}
}
Vector3 pos = _selectGeoDic[geoName].transform.position;
Quaternion rot = _selectGeoDic[geoName].transform.rotation;
Vector3 scale = _selectGeoDic[geoName].transform.localScale;
BJCZSceneCtrl._Instance._OnlyShowGeo = Instantiate(_selectGeoDic[geoName],transform);
BJCZSceneCtrl._Instance._OnlyShowGeo.transform.position = pos;
BJCZSceneCtrl._Instance._OnlyShowGeo.transform.rotation = rot;
BJCZSceneCtrl._Instance._OnlyShowGeo.transform.localScale = scale;
if (geoName.Equals("SM_jixiezhuti_erzhouzhuti"))
{
BJCZSceneCtrl._Instance._OnlyShowGeo.transform.Find("group1/SM_jixiezhuti410").GetComponent().material = _baseNoAlpha;
BJCZSceneCtrl._Instance._OnlyShowGeo.transform.Find("SM_jixiezhuti_erzhouwaike1").GetComponent().material = _baseNoAlpha;
BJCZSceneCtrl._Instance._OnlyShowGeo.transform.Find("SM_jixiezhuti_erzhouwaike2").GetComponent().material = _baseNoAlpha;
}
transform.Find(showGroupName).gameObject.SetActive(false);
}
}
///
/// 为每个模型添加泛光效果和碰撞器
///
private void AddOutlineAndColliders()
{
foreach (var item in GameManager.Instance._DataBJCJHandler._BJRZDataArray)
{
string partsName = item.Key;
for (int i = 0; i < item.Value.Count; i++)
{
if (_selectGeoDic.ContainsKey(item.Value[i].itemGeo)) continue;
GameObject geo =UtilitiesMng.GetGeoByName(transform.Find(partsName), item.Value[i].itemGeo);
if (geo)
{
AddOutline(geo);
AddCollider(geo);
_selectGeoDic.Add(item.Value[i].itemGeo, geo);
}
}
}
}
///
/// 为模型添加泛光效果
///
/// 要添加泛光效果的模型
private void AddOutline(GameObject model)
{
OutLineRender outlineRender;
// 如果模型上没有泛光效果组件,则添加一个新的
if (!model.TryGetComponent(out outlineRender))
{
outlineRender = model.AddComponent();
}
// 设置泛光强度和默认禁用泛光效果
outlineRender.OutLineStrength = 1;
outlineRender.enabled = false;
// 将泛光效果组件添加到高亮列表中
_currentHighlights.Add(outlineRender);
}
///
/// 为模型添加碰撞器
///
/// 要添加碰撞器的模型
private void AddCollider(GameObject model)
{
// 如果模型没有碰撞器,则添加一个新的
if (model.GetComponent() == null)
{
if(model.GetComponent() == null)
{
//给子物体添加碰撞器,触发碰撞效果
model.AddComponent();
MeshFilter[] meshes = model.GetComponentsInChildren();
for (int a = 0; a < meshes.Length; a++)
{
meshes[a].gameObject.AddComponent();
}
}
else
{
model.AddComponent();
}
}
}
///
/// 高亮显示指定的模型
///
/// 要高亮显示的模型。
private void HighlightModel(GameObject model)
{
foreach (var outline in _currentHighlights)
{
outline.enabled = (outline.gameObject == model);
}
//此处对于基座显示的特殊处理
if (model.name.Equals("SM_jixiezhuti_erzhouzhuti") && _baseGeo == null)
{
_baseGeo = model;
}
if (_baseGeo)
{
if (model.name.Equals("SM_jixiezhuti_erzhouzhuti"))
{
_baseGeo = model;
_baseGeo.transform.Find("group1/SM_jixiezhuti410").GetComponent().material = _baseNoAlpha;
//Material baseMat = _baseGeo.transform.Find("group1/SM_jixiezhuti410").GetComponent().material;
//Color baseColor = baseMat.GetColor("_BaseColor");
//baseMat.SetColor("_BaseColor", new Color(baseColor.r, baseColor.g, baseColor.b, 1.0f));
}
else
{
_baseGeo.transform.Find("group1/SM_jixiezhuti410").GetComponent().material = _baseAlpha;
//Material baseMat = _baseGeo.transform.Find("group1/SM_jixiezhuti410").GetComponent().material;
//Color baseColor = baseMat.GetColor("_BaseColor");
//baseMat.SetColor("_BaseColor", new Color(baseColor.r, baseColor.g, baseColor.b, 0.4f));
}
}
}
}
}