using Framework; using TMPro; using UnityEngine; namespace GameWrapper.Story { public class CmpPreviewTalk : MonoBehaviour { public IStoryPlayer owner; public Transform bgTrans; public TextMeshPro textMesh; private string _cacheStr; private string _cachePlayerName; private int _playerType; private bool _isHide = true; public void Hide(bool force = false) { if (_isHide && !force) return; _isHide = true; // if (Application.isPlaying) // { // // 在运行中 // return; // } if (gameObject is null) return; if (gameObject.activeSelf) { gameObject.SetActive(false); } } public void SetText(string str, string playerName, int playerType) { if (Application.isPlaying) { // 在运行中 _SetToUI(str, playerName, playerType); return; } if (!gameObject.activeSelf) { gameObject.SetActive(true); } _isHide = false; // 看向摄像机 var storyCamera = UnityEngine.Camera.main; if (storyCamera == null) { storyCamera = UnityEngine.Object.FindFirstObjectByType(); } if (storyCamera == null) return; var cameraTrans = storyCamera.transform; transform.rotation = cameraTrans.rotation; if (owner.playerType == (int)EStoryPlayerType.NoOne) { // 旁白,需要同步位置到相机 var cameraPos = cameraTrans.position; // 向内部移动 var dir = cameraTrans.forward; var offset = 2f; cameraPos += dir * offset; transform.position = cameraPos; } if (_cachePlayerName == playerName && _cacheStr == str && _playerType == playerType) return; _playerType = playerType; _cachePlayerName = playerName; _cacheStr = str; if (playerName == "旁白") { textMesh.text = str; } else { textMesh.text = playerName + ":" + str; } // 更新背景大小 var size = textMesh.GetPreferredValues(); bgTrans.localScale = new Vector3(size.x, size.y, 1f); } private void _SetToUI(string str, string playerName, int playerType) { if (_cachePlayerName == playerName && _cacheStr == str && _playerType == playerType) return; _playerType = playerType; _cachePlayerName = playerName; _cacheStr = str; var sendData = new EDPlayerTalkData(); sendData.playerId = owner.playerId; sendData.talkMsg = str; sendData.isPangbai = owner.playerType == EStoryPlayerType.NoOne; if (!IsEditor) { EventManager.Instance.Send(EventManager.EventName.STORY_HANDLE_PLAYER_TALK_DATA, sendData); } } public static bool IsEditor { get { #if UNITY_EDITOR if (UnityEditor.EditorApplication.isPlaying == false) { return true; } #endif return false; } } } }