using Thousandto.Code.Center; using Thousandto.Code.Logic.WarningField; using Thousandto.Core.Asset; using Thousandto.Core.Base; using Thousandto.Plugins.Common.UniScene; using System.Collections.Generic; using UnityEngine; namespace Thousandto.Code.Logic { public class SkillSelectFiledManager { #region//静态变量和常量 private const string RootName = "[SkillSelectFiledRoot]"; private static Transform _root = null; private static GameObject _rootGo = null; private static GameObject _rectRes = null; private static GameObject _bigRoundRes = null; private static GameObject _smalRoundRes = null; private static GameObject _fanShapedCenterRes = null; private static GameObject _fanShapedLeftRes = null; private static GameObject _fanShapedRightRes = null; private static bool _isLoadRes = false; private const float _roundRadious = 0.1f; private const float _rectWidth = 0.1f; private const float _rectHeight = 0.1f; private const float _fanShapeRadious = 0.1f; private const float _fanShapeAngle = 30f; #endregion #region//私有变量 private List _instGoList = new List(); private List _renderList = new List(); private Transform _handleTrans = null; private SkillSelectFiledType _filedType = SkillSelectFiledType.SelectDir; private Color _curColor = Color.white; #endregion #region//属性 public static Transform Root { get { return _root; } } #endregion #region//构造函数 static SkillSelectFiledManager() { _rootGo = new GameObject(RootName); _root = _rootGo.transform; _root.parent = AppRoot.Transform; //GameObject.DontDestroyOnLoad(_rootGo); } #endregion #region//公有函数 //初始化处理 public void Initialize() { } //卸载处理 public void Uninitialize() { } /// ///显示选择位置效果 /// /// 大圈size /// /// 小圈size /// public void ShowSelectPosFiled(float bigSize, float smallSize) { DestoryFiled(); //尝试加载资源,防止资源未加载 CheckRes(); if (_bigRoundRes == null || _smalRoundRes == null) return; _filedType = SkillSelectFiledType.SelectPos; var newGo = new GameObject("[SelectPosFiled]"); newGo.transform.parent = Root; newGo.transform.localPosition = Vector3.zero; newGo.transform.localScale = Vector3.one; newGo.transform.localRotation = Quaternion.identity; //外圈 var bigRoundGo = GameObject.Instantiate(_bigRoundRes) as GameObject; bigRoundGo.transform.parent = newGo.transform; bigRoundGo.transform.localPosition = Vector3.zero; bigRoundGo.transform.localScale = new Vector3(bigSize / _roundRadious, 1f, bigSize / _roundRadious); bigRoundGo.transform.localRotation = Quaternion.identity; bigRoundGo.SetActive(true); //内圈 var smallRoundGo = GameObject.Instantiate(_smalRoundRes) as GameObject; smallRoundGo.transform.parent = newGo.transform; smallRoundGo.transform.localPosition = Vector3.zero; smallRoundGo.transform.localScale = new Vector3(smallSize / _roundRadious, 1f, smallSize / _roundRadious); smallRoundGo.transform.localRotation = Quaternion.identity; smallRoundGo.SetActive(true); //控制小的位置 _handleTrans = smallRoundGo.transform; _instGoList.Add(smallRoundGo); _instGoList.Add(bigRoundGo); _instGoList.Add(newGo); var renderArray = newGo.transform.GetComponentsInChildren(); _renderList.Clear(); if (renderArray.Length > 0) { for(int i=0;i< renderArray.Length;++i) { renderArray[i].sharedMaterial.SetColor(ShaderPropertyIDDefine.Color, Color.white); _renderList.Add(renderArray[i]); } } _curColor = Color.white; UnityUtils.SetLayer(newGo.transform, LayerUtils.LocalPlayer, true); } /// ///显示选择方向效果 /// /// 方向效果类型,分为矩形和扇形 /// /// 矩形代表高,扇形代表半径 /// /// 矩形代表宽,扇形代表角度 /// public void ShowSelectDirFiled(SkillSelectDirType type, float param1, float param2) { DestoryFiled(); //尝试加载资源,防止资源未加载 CheckRes(); if (_rectRes == null || _fanShapedCenterRes == null || _fanShapedLeftRes == null || _fanShapedRightRes == null) return; _filedType = SkillSelectFiledType.SelectDir; var newGo = new GameObject("[SelectDirFiled]"); newGo.transform.parent = Root; newGo.transform.localPosition = Vector3.zero; newGo.transform.localScale = Vector3.one; newGo.transform.localRotation = Quaternion.identity; //外圈 var bigRoundGo = GameObject.Instantiate(_bigRoundRes) as GameObject; bigRoundGo.transform.parent = newGo.transform; bigRoundGo.transform.localPosition = Vector3.zero; bigRoundGo.transform.localScale = new Vector3(param1 / _roundRadious, 1f, param1 / _roundRadious); bigRoundGo.transform.localRotation = Quaternion.identity; bigRoundGo.SetActive(true); switch (type) { case SkillSelectDirType.Rect: { var rectGo = GameObject.Instantiate(_rectRes) as GameObject; rectGo.transform.parent = newGo.transform; rectGo.transform.localPosition = Vector3.zero; rectGo.transform.localScale = new Vector3(param2 / _rectWidth, 1f, param1 / _rectHeight); rectGo.transform.localRotation = Quaternion.identity; rectGo.SetActive(true); _instGoList.Add(rectGo); _handleTrans = rectGo.transform; } break; case SkillSelectDirType.FanShaped: { var angle = param2; var fcount = angle / _fanShapeAngle; if (fcount % 1 != 0) { fcount += 1; } int count = (int)fcount - 2; var rootGo = new GameObject("[FanShanRoot]"); rootGo.transform.parent = newGo.transform; UnityUtils.Reset(rootGo.transform); rootGo.transform.localScale = new Vector3(param1 / _fanShapeRadious, 1f, param1 / _fanShapeRadious); _handleTrans = rootGo.transform; var leftEulerY = -(angle - _fanShapeAngle) / 2; var leftGo = GameObject.Instantiate(_fanShapedLeftRes) as GameObject; leftGo.transform.parent = rootGo.transform; UnityUtils.Reset(leftGo.transform); leftGo.transform.localEulerAngles = new Vector3(0f, leftEulerY, 0f); _instGoList.Add(leftGo); leftGo.SetActive(true); var rightGo = GameObject.Instantiate(_fanShapedRightRes) as GameObject; rightGo.transform.parent = rootGo.transform; UnityUtils.Reset(rightGo.transform); rightGo.transform.localEulerAngles = new Vector3(0f, (angle - _fanShapeAngle) / 2, 0f); _instGoList.Add(rightGo); rightGo.SetActive(true); angle -= 60f; for (int i = 0; i < count; ++i) { var centerGo = GameObject.Instantiate(_fanShapedCenterRes) as GameObject; centerGo.transform.parent = rootGo.transform; UnityUtils.Reset(centerGo.transform); centerGo.transform.localEulerAngles = new Vector3(0f, leftEulerY + (i + 1) * _fanShapeAngle, 0f); _instGoList.Add(centerGo); centerGo.SetActive(true); } _instGoList.Add(rootGo); } break; } _instGoList.Add(newGo); var renderArray = newGo.transform.GetComponentsInChildren(); _renderList.Clear(); if (renderArray.Length > 0) { for (int i = 0; i < renderArray.Length; ++i) { renderArray[i].sharedMaterial.SetColor(ShaderPropertyIDDefine.Color, Color.white); _renderList.Add(renderArray[i]); } } _curColor = Color.white; UnityUtils.SetLayer(newGo.transform, LayerUtils.LocalPlayer, true); } public void SetPosAndDir(Vector3 pos, Vector3 dir, Color color) { if (_handleTrans == null) return; switch (_filedType) { case SkillSelectFiledType.SelectDir: _handleTrans.forward = dir; break; case SkillSelectFiledType.SelectPos: _handleTrans.position = pos; break; } if(_curColor != color) { _curColor = color; for (int i = 0; i < _renderList.Count; ++i) { _renderList[i].sharedMaterial.SetColor(ShaderPropertyIDDefine.Color, _curColor); } } } public void UpdatePos(Vector3 pos) { pos.y += 0.2f; Root.position = pos; } //删除警示圈 public void DestoryFiled() { for (int i = 0; i < _instGoList.Count; ++i) { GameObject.DestroyImmediate(_instGoList[i]); } _instGoList.Clear(); _renderList.Clear(); _handleTrans = null; } #endregion #region//私有函数 private void CheckRes() { if (_isLoadRes) return; _isLoadRes = true; if (_rectRes == null) { var vfx = new FGameObjectVFX(ModelTypeCode.OtherVFX, 911, true, false); vfx.OnLoadFinishedCallBack = (fgo) => { if (fgo != null) { _rectRes = fgo.RealGameObject; //GameObject.DontDestroyOnLoad(_rectRes); } }; } if (_bigRoundRes == null) { var vfx = new FGameObjectVFX(ModelTypeCode.OtherVFX, 912, true, false); vfx.OnLoadFinishedCallBack = (fgo) => { if (fgo != null) { _bigRoundRes = fgo.RealGameObject; //GameObject.DontDestroyOnLoad(_bigRoundRes); } }; } if (_smalRoundRes == null) { var vfx = new FGameObjectVFX(ModelTypeCode.OtherVFX, 913, true, false); vfx.OnLoadFinishedCallBack = (fgo) => { if (fgo != null) { _smalRoundRes = fgo.RealGameObject; //GameObject.DontDestroyOnLoad(_smalRoundRes); } }; } if (_fanShapedCenterRes == null) { var vfx = new FGameObjectVFX(ModelTypeCode.OtherVFX, 914, true, false); vfx.OnLoadFinishedCallBack = (fgo) => { if (fgo != null) { _fanShapedCenterRes = fgo.RealGameObject; //GameObject.DontDestroyOnLoad(_fanShapedCenterRes); } }; } if (_fanShapedLeftRes == null) { var vfx = new FGameObjectVFX(ModelTypeCode.OtherVFX, 915, true, false); vfx.OnLoadFinishedCallBack = (fgo) => { if (fgo != null) { _fanShapedLeftRes = fgo.RealGameObject; //GameObject.DontDestroyOnLoad(_fanShapedLeftRes); } }; } if (_fanShapedRightRes == null) { var vfx = new FGameObjectVFX(ModelTypeCode.OtherVFX, 916, true, false); vfx.OnLoadFinishedCallBack = (fgo) => { if (fgo != null) { _fanShapedRightRes = fgo.RealGameObject; //GameObject.DontDestroyOnLoad(_fanShapedRightRes); } }; } } #endregion } }