NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/GameWrapper/Story/CmpPreviewTalk.cs

125 lines
3.5 KiB
C#

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 == 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 = Camera.main;
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;
}
}
}
}