//-------------------------------------------------------- // [Author]: 第二世界 // [ Date ]: Saturday, September 09, 2017 //-------------------------------------------------------- using Snxxz.UI; using System.Collections.Generic; using TableConfig; using UnityEngine; using UnityEngine.UI; using UnityStandardAssets.ImageEffects; namespace Snxxz.UI { public class UI3DModelExhibition : MonoBehaviour { [SerializeField] Transform m_PlayerShowPoint; [SerializeField] Transform m_HorseShowPoint; [SerializeField] Transform m_WingShowPoint; [SerializeField] Transform m_NPCShowPoint; [SerializeField] Transform m_DialogPoint; [SerializeField] Transform m_EquipmentPoint; [SerializeField] Camera m_ShowCamera; [SerializeField] bool m_Interactable = false; [SerializeField] UI3DModelInteractProcessor m_InteractProcessor; [SerializeField] ColorCorrectionCurves m_CameraColor; public bool interactable { get { return m_Interactable; } set { m_Interactable = value; } } UI3DShowHero playerModel = new UI3DShowHero(); int m_HorseModelId = 0; GameObject horseModel = null; public GameObject NpcModelHorse { get { return horseModel; } set { horseModel = value; } } int m_NPCId = 0; GameObject npcModel = null; SFXController m_NpcEffect; public GameObject NpcModelPet { get { return npcModel; } set { npcModel = value; } } int m_WingModelId = 0; GameObject wingModel = null; int m_EquipmentModelId = 0; GameObject equipmentModel = null; bool isShowingPlayer = false; bool isShowingHorse = false; bool isShowingNPC = false; bool isShowWing = false; bool isShowinEquipment = false; Vector2 prePosition = Vector2.zero; PlayerPackModel playerPack { get { return ModelCenter.Instance.GetModel(); } } public static UI3DModelExhibition Instance { get; set; } public static void CreateStage() { var gameObject = GameObject.Instantiate(Resources.Load("UI/Prefabs/UI3DModelExhibitionStage")); Instance = gameObject.GetComponent(); Instance.transform.position = new Vector3(1000, 2000, 3000); Instance.name = "UI3DModelExhibitionStage"; Instance.gameObject.SetActive(true); Instance.m_ShowCamera.enabled = false; DontDestroyOnLoad(gameObject); } public void BeginShowLoginPlayer(RawImage _rawImage, int _job) { var clothesItemId = 0; var weaponItemId = 0; var wingsItemId = 0; var secondaryItemId = 0; var _suitLevel = 0; var equipInfos = PlayerDatas.Instance.loginInfo.EquipInfo; for (int i = 0; i < equipInfos.Length; i++) { var equipInfo = equipInfos[i]; switch ((RoleEquipType)equipInfo.ItemPlace) { case RoleEquipType.retWeapon: weaponItemId = (int)equipInfo.ItemID; break; case RoleEquipType.retClothes: clothesItemId = (int)equipInfo.ItemID; if (equipInfo.IsSuite == 1) { Dictionary> _userDataDict = ConfigParse.Analysis(equipInfo.UserData); if (_userDataDict.ContainsKey(30)) { _suitLevel = _userDataDict[30][0]; } } break; case RoleEquipType.retWing: wingsItemId = (int)equipInfo.ItemID; break; case RoleEquipType.retWeapon2: secondaryItemId = (int)equipInfo.ItemID; break; } } BeginShowPlayer(_rawImage, _job, clothesItemId, _suitLevel, weaponItemId, wingsItemId, secondaryItemId, false); } public void BeginShowPlayer(RawImage _rawImage, int _job, bool _isDialogue = false) { var clothes = playerPack.GetItemModelByIndex(PackType.rptEquip, (int)RoleEquipType.retClothes); var clothesId = clothes == null ? 0 : (int)clothes.itemInfo.ItemID; var weapon = playerPack.GetItemModelByIndex(PackType.rptEquip, (int)RoleEquipType.retWeapon); var weaponId = weapon == null ? 0 : (int)weapon.itemInfo.ItemID; var wings = playerPack.GetItemModelByIndex(PackType.rptEquip, (int)RoleEquipType.retWing); var wingsId = wings == null ? 0 : (int)wings.itemInfo.ItemID; var secondary = playerPack.GetItemModelByIndex(PackType.rptEquip, (int)RoleEquipType.retWeapon2); var secondaryId = secondary == null ? 0 : (int)secondary.itemInfo.ItemID; int _suitLevel = 0; if (clothes != null) { if (clothes.itemInfo.IsSuite == 1) { if (clothes.GetUseDataModel(30) != null && clothes.GetUseDataModel(30)[0] != 0) { _suitLevel = clothes.GetUseDataModel(30)[0]; } } } BeginShowPlayer(_rawImage, _job, clothesId, _suitLevel, weaponId, wingsId, secondaryId, _isDialogue); } public void BeginShowPlayer(RawImage _rawImage, int _job, RoleEquipType _exceptEquip) { var clothes = _exceptEquip == RoleEquipType.retClothes ? null : playerPack.GetItemModelByIndex(PackType.rptEquip, (int)RoleEquipType.retClothes); var clothesId = clothes == null ? 0 : (int)clothes.itemInfo.ItemID; var weapon = _exceptEquip == RoleEquipType.retWeapon ? null : playerPack.GetItemModelByIndex(PackType.rptEquip, (int)RoleEquipType.retWeapon); var weaponId = weapon == null ? 0 : (int)weapon.itemInfo.ItemID; var wings = _exceptEquip == RoleEquipType.retWing ? null : playerPack.GetItemModelByIndex(PackType.rptEquip, (int)RoleEquipType.retWing); var wingsId = wings == null ? 0 : (int)wings.itemInfo.ItemID; var secondary = _exceptEquip == RoleEquipType.retWeapon2 ? null : playerPack.GetItemModelByIndex(PackType.rptEquip, (int)RoleEquipType.retWeapon2); var secondaryId = secondary == null ? 0 : (int)secondary.itemInfo.ItemID; int _suitLevel = 0; if (clothes != null) { if (clothes.itemInfo.IsSuite == 1) { if (clothes.GetUseDataModel(30) != null && clothes.GetUseDataModel(30)[0] != 0) { _suitLevel = clothes.GetUseDataModel(30)[0]; } } } BeginShowPlayer(_rawImage, _job, clothesId, _suitLevel, weaponId, wingsId, secondaryId, false); } public void BeginShowPlayer(RawImage _rawImage, int _job, int _clothesId, int suitLevel, int _weaponId, int _wingsId, int _secondaryId, bool _isDialogue = false) { StopShow(); var instance = playerModel.Show(_job, _clothesId, suitLevel, _weaponId, _wingsId, _secondaryId, _isDialogue ? m_DialogPoint : m_PlayerShowPoint); interactable = !_isDialogue; m_PlayerShowPoint.localEulerAngles = Vector3.zero; if (_isDialogue) { instance.transform.localPosition = GeneralConfig.Instance.heroDialogueOffset; instance.transform.localEulerAngles = GeneralConfig.Instance.heroDialogueRotation; instance.transform.localScale = GeneralConfig.Instance.heroDialogueScale * Vector3.one; } m_ShowCamera.enabled = true; isShowingPlayer = true; ResetCameraColor(); if (playerModel != null) { playerModel.StandUp(); } if (_rawImage != null) { _rawImage.rectTransform.sizeDelta = new Vector2(_rawImage.rectTransform.rect.height * 4f / 3, _rawImage.rectTransform.rect.height); m_InteractProcessor.rectTransform = _rawImage.rectTransform; _rawImage.texture = m_ShowCamera.targetTexture; _rawImage.material = MaterialUtility.GetGUIRenderTextureMaterial(); } } public void BeginShowOtherPlayer(RawImage _rawImage, int _job, int _clothesId, int suitEffect, int _weaponId, int _wingsId, int _secondaryId) { StopShow(); playerModel.Show(_job, _clothesId, suitEffect, _weaponId, _wingsId, _secondaryId, m_PlayerShowPoint); playerModel.UnloadClothedEffect(); playerModel.PutOnEffect(suitEffect); interactable = true; m_PlayerShowPoint.localEulerAngles = Vector3.zero; m_ShowCamera.enabled = true; isShowingPlayer = true; ResetCameraColor(); if (playerModel != null) { playerModel.StandUp(); } if (_rawImage != null) { _rawImage.rectTransform.sizeDelta = new Vector2(_rawImage.rectTransform.rect.height * 4f / 3, _rawImage.rectTransform.rect.height); m_InteractProcessor.rectTransform = _rawImage.rectTransform; _rawImage.texture = m_ShowCamera.targetTexture; _rawImage.material = MaterialUtility.GetGUIRenderTextureMaterial(); } } public void BeginShowSitDownPlayer(RawImage _rawImage, int _job) { BeginShowPlayer(_rawImage, _job); if (playerModel != null) { playerModel.SitDown(); } } public void StopShowPlayer() { StopShow(); } public void BeginShowHourse(int _modelId, RawImage _rawImage) { StopShow(); m_ShowCamera.enabled = true; if (_rawImage != null) { _rawImage.rectTransform.sizeDelta = new Vector2(_rawImage.rectTransform.rect.height * 4f / 3, _rawImage.rectTransform.rect.height); m_InteractProcessor.rectTransform = _rawImage.rectTransform; _rawImage.texture = m_ShowCamera.targetTexture; _rawImage.material = MaterialUtility.GetGUIRenderTextureMaterial(); } var instance = UI3DModelFactory.LoadUIHorse(_modelId); if (instance == null) { return; } isShowingHorse = true; interactable = true; m_HorseModelId = _modelId; horseModel = instance; m_HorseShowPoint.rotation = Quaternion.identity; var modelConfig = ConfigManager.Instance.GetTemplate(_modelId); instance.transform.SetParentEx(m_HorseShowPoint, modelConfig.UIOffset, modelConfig.UIRotation, Vector3.one * modelConfig.UIScale); instance.SetActive(true); ResetCameraColor(); } public void StopShowHourse() { StopShow(); } private GameObject ObjEquipment; public void BeginShowEquipment(int _modelId, Vector3 _localEulerAngles, RawImage _rawImage) { var instance = UI3DModelFactory.LoadUIWing(_modelId); ObjEquipment = instance; if (instance == null) { return; } StopShow(); isShowinEquipment = true; interactable = true; m_ShowCamera.enabled = true; m_EquipmentModelId = _modelId; equipmentModel = instance; instance.transform.SetParentEx(m_EquipmentPoint, Vector3.zero, _localEulerAngles, Vector3.one); instance.SetActive(true); ResetCameraColor(); if (_rawImage != null) { _rawImage.rectTransform.sizeDelta = new Vector2(_rawImage.rectTransform.rect.height * 4f / 3, _rawImage.rectTransform.rect.height); m_InteractProcessor.rectTransform = _rawImage.rectTransform; _rawImage.texture = m_ShowCamera.targetTexture; _rawImage.material = MaterialUtility.GetGUIRenderTextureMaterial(); } } public void StopShowEquipment() { StopShow(); } public void BeginShowWing(int _modelId, Vector3 _localEulerAngles, RawImage _rawImage) { StopShow(); m_ShowCamera.enabled = true; if (_rawImage != null) { _rawImage.rectTransform.sizeDelta = new Vector2(_rawImage.rectTransform.rect.height * 4f / 3, _rawImage.rectTransform.rect.height); m_InteractProcessor.rectTransform = _rawImage.rectTransform; _rawImage.texture = m_ShowCamera.targetTexture; _rawImage.material = MaterialUtility.GetGUIRenderTextureMaterial(); } var instance = UI3DModelFactory.LoadUIWing(_modelId); if (instance == null) { return; } isShowWing = true; interactable = true; m_WingModelId = _modelId; wingModel = instance; m_WingShowPoint.rotation = Quaternion.identity; var modelConfig = ConfigManager.Instance.GetTemplate(_modelId); instance.transform.SetParentEx(m_WingShowPoint, modelConfig.UIOffset, modelConfig.UIRotation, Vector3.one * modelConfig.UIScale); instance.SetActive(true); ResetCameraColor(); var animator = instance.GetComponent(); if (animator != null) { animator.Play("UI_Idle_Single"); } } public void StopShowWing() { StopShow(); } public void BeginShowNPC(int _npcId, Vector3 _localEulerAngles, RawImage _rawImage, bool _gray = false, bool _isDialogue = false) { BeginShowNPC(_npcId, Vector3.zero, _localEulerAngles, _rawImage, _gray, _isDialogue); } public void BeginShowNPC(int _npcId, Vector3 _offset, Vector3 _localEulerAngles, RawImage _rawImage, bool _gray = false, bool _isDialogue = false) { StopShow(); m_ShowCamera.enabled = true; if (_rawImage != null) { _rawImage.rectTransform.sizeDelta = new Vector2(_rawImage.rectTransform.rect.height * 4f / 3, _rawImage.rectTransform.rect.height); m_InteractProcessor.rectTransform = _rawImage.rectTransform; _rawImage.texture = m_ShowCamera.targetTexture; _rawImage.material = MaterialUtility.GetGUIRenderTextureMaterial(); } var instance = UI3DModelFactory.LoadUINPC(_npcId); if (instance == null) { return; } interactable = !_isDialogue; isShowingNPC = true; if (!_isDialogue) { m_NPCShowPoint.localEulerAngles = _localEulerAngles; } m_NPCId = _npcId; npcModel = instance; var config = ConfigManager.Instance.GetTemplate(_npcId); instance.transform.SetParentEx(_isDialogue ? m_DialogPoint : m_NPCShowPoint, _offset, Quaternion.identity, Vector3.one * config.UIModeLProportion); if (config.NPCEffect != 0) { var effectConfig = ConfigManager.Instance.GetTemplate(config.NPCEffect); var parent = instance.transform; if (!string.IsNullOrEmpty(effectConfig.nodeName)) { parent = instance.transform.GetChildTransformDeeply(effectConfig.nodeName); } m_NpcEffect = SFXPlayUtility.Instance.PlayBattleEffect(config.NPCEffect, parent); } if (_isDialogue) { instance.transform.localEulerAngles = _localEulerAngles; } instance.SetActive(true); ResetCameraColor(_gray); m_CameraColor.saturation = _gray ? 0.08f : 1f; } public void StopShowNPC() { StopShow(); } public void StopShow() { m_ShowCamera.enabled = false; if (isShowingNPC) { if (npcModel != null) { npcModel.transform.localScale = Vector3.one; if (m_NpcEffect != null) { SFXPlayUtility.Instance.Release(m_NpcEffect); m_NpcEffect = null; } UI3DModelFactory.ReleaseUINPC(m_NPCId, npcModel); npcModel = null; } m_NPCId = 0; isShowingNPC = false; } if (isShowingHorse) { if (horseModel != null) { horseModel.transform.localScale = Vector3.one; UI3DModelFactory.ReleaseUIHourse(m_HorseModelId, horseModel); horseModel = null; } m_HorseModelId = 0; isShowingHorse = false; } if (isShowingPlayer) { playerModel.Dispose(); isShowingPlayer = false; } if (isShowWing) { if (wingModel != null) { wingModel.transform.localScale = Vector3.one; UI3DModelFactory.ReleaseUIWing(m_WingModelId, wingModel); wingModel = null; } m_WingModelId = 0; isShowWing = false; } if (isShowinEquipment) { if (equipmentModel != null) { UI3DModelFactory.ReleaseUIWing(m_EquipmentModelId, equipmentModel); equipmentModel = null; } m_EquipmentModelId = 0; isShowinEquipment = false; } interactable = false; } public void ResetCameraColor(bool _enable = false) { m_CameraColor.enabled = _enable; } private void Awake() { m_InteractProcessor.clickEvent += OnClick3DModel; m_InteractProcessor.beginDragEvent += OnBeginDrag3DModel; m_InteractProcessor.endDragEvent += OnEndDrag3DModel; m_InteractProcessor.dragingEvent += OnDrag3DModel; } private void OnDestroy() { m_InteractProcessor.clickEvent -= OnClick3DModel; m_InteractProcessor.beginDragEvent -= OnBeginDrag3DModel; m_InteractProcessor.endDragEvent -= OnEndDrag3DModel; m_InteractProcessor.dragingEvent -= OnDrag3DModel; } private void LateUpdate() { if (isShowinEquipment && ObjEquipment != null) { if (WindowCenter.Instance.CheckOpen()) { ObjEquipment.transform.Rotate(WindowCenter.Instance.Get().RotateVector * 1f, Space.Self); } if (WindowCenter.Instance.CheckOpen()) { ObjEquipment.transform.Rotate(WindowCenter.Instance.Get().RotateVector * 1f, Space.Self); } } } private void OnBeginDrag3DModel(Vector2 _position) { if (!m_Interactable) { return; } prePosition = _position; } private void OnDrag3DModel(Vector2 _position) { if (!m_Interactable) { return; } var delta = _position - prePosition; if (isShowingPlayer) { m_PlayerShowPoint.localEulerAngles += new Vector3(0, -delta.x, 0); } if (isShowingHorse) { m_HorseShowPoint.localEulerAngles += new Vector3(0, -delta.x, 0); } if (isShowingNPC) { m_NPCShowPoint.localEulerAngles += new Vector3(0, -delta.x, 0); } prePosition = _position; } private void OnEndDrag3DModel(Vector2 _position) { if (!m_Interactable) { return; } } private void OnClick3DModel() { if (!m_Interactable) { return; } } } }