using System.Collections;
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
using UnityEngine.UI;
|
[DisallowMultipleComponent]
|
[RequireComponent(typeof(RectTransform))]
|
[ExecuteAlways]
|
public class ChatBubbleBehaviour : MonoBehaviour
|
{
|
[SerializeField] Text m_Target;
|
[SerializeField] RectOffset m_Padding;
|
[SerializeField] FlipImage m_Flip;
|
[SerializeField] Image m_BubbleIcon;
|
[SerializeField] bool left = false;
|
[SerializeField] bool m_PreferredWidth = false;
|
[SerializeField] RectTransform m_ContainerVoice;
|
|
const float space = 5.0f;
|
|
private int bubbleId = 0;
|
|
RectTransform m_Rect;
|
RectTransform rect
|
{
|
get
|
{
|
if (m_Rect == null)
|
{
|
m_Rect = transform as RectTransform;
|
}
|
return m_Rect;
|
}
|
}
|
|
public RectOffset padding
|
{
|
get { return m_Padding; }
|
}
|
|
private void OnEnable()
|
{
|
Refresh();
|
}
|
|
public void DisplayContent(string content, bool _left = false)
|
{
|
if (m_Target == null)
|
{
|
return;
|
}
|
left = _left;
|
m_PreferredWidth = true;
|
var targetRect = m_Target.rectTransform;
|
var richText = m_Target as RichText;
|
if (richText != null && !left)
|
{
|
richText.AutoNewLine = false;
|
}
|
m_Target.text = content;
|
if (!left)
|
{
|
if (m_Target.preferredWidth > targetRect.rect.width)
|
{
|
m_Target.alignment = TextAnchor.UpperLeft;
|
m_PreferredWidth = false;
|
}
|
else
|
{
|
m_Target.alignment = TextAnchor.UpperRight;
|
}
|
}
|
if (richText != null)
|
{
|
richText.AutoNewLine = true;
|
}
|
|
Refresh();
|
}
|
|
public void DisplayBubble(int id)
|
{
|
bubbleId = id;
|
ChatBubbleManager.ChatBubble bubble;
|
if (ChatBubbleManager.Instance.TryGetBubble(id, out bubble))
|
{
|
var bubblePadding = left ? bubble.leftPadding : bubble.rifhtPadding;
|
padding.top = bubblePadding.top;
|
padding.left = bubblePadding.left;
|
padding.right = bubblePadding.right;
|
padding.bottom = bubblePadding.bottom;
|
|
bool requireFlip = false;
|
var iconKey = bubble.GetBubbleIcon(left, ref requireFlip);
|
|
//m_BubbleIcon.SetSprite(iconKey);
|
|
|
UIFrame frame = m_BubbleIcon.GetComponent<UIFrame>();
|
if (UIFrameMgr.Inst.ContainsDynamicImage(iconKey))
|
{
|
if (frame == null)
|
frame = m_BubbleIcon.gameObject.AddComponent<UIFrame>();
|
frame.ResetFrame(iconKey);
|
frame.enabled = true;
|
}
|
else
|
{
|
if (frame != null)
|
frame.enabled = false;
|
m_BubbleIcon.SetSprite(iconKey);
|
}
|
m_Flip.flipHorizontal = requireFlip;
|
m_Target.color = bubble.color;
|
|
var position = rect.anchoredPosition;
|
// TODO YYL
|
// ChatBubbleBoxConfig config = ChatBubbleBoxConfig.Get(bubbleId);
|
// position.y = -config.top;
|
if (rect.anchoredPosition != position)
|
{
|
rect.anchoredPosition = position;
|
}
|
|
Refresh();
|
}
|
}
|
|
[ExecuteAlways]
|
private void LateUpdate()
|
{
|
Refresh();
|
}
|
|
void Refresh()
|
{
|
if (m_Target == null)
|
{
|
return;
|
}
|
bool nullContent = string.IsNullOrEmpty(m_Target.text);
|
|
var targetRect = m_Target.rectTransform;
|
var sizeDelta = targetRect.sizeDelta;
|
|
var width = m_PreferredWidth || !Application.isPlaying ? m_Target.preferredWidth : sizeDelta.x;
|
if (nullContent)
|
{
|
width = 0f;
|
}
|
var height = sizeDelta.y;
|
if (nullContent)
|
{
|
height = 0;
|
}
|
|
if (m_ContainerVoice != null)
|
{
|
width = Mathf.Max(m_ContainerVoice.sizeDelta.x, width);
|
height += m_ContainerVoice.sizeDelta.y;
|
if (!nullContent)
|
{
|
height += space;
|
}
|
}
|
|
sizeDelta.x = width + m_Padding.left + m_Padding.right;
|
sizeDelta.y = height + m_Padding.top + m_Padding.bottom;
|
if (sizeDelta != rect.sizeDelta)
|
{
|
rect.sizeDelta = sizeDelta;
|
}
|
|
SetAnchor(m_Target.rectTransform);
|
if (m_ContainerVoice != null)
|
{
|
SetAnchor(m_ContainerVoice);
|
}
|
|
float top = padding.top;
|
Vector2 position = Vector2.zero;
|
position.x = left ? padding.left : -padding.right;
|
if (m_ContainerVoice != null)
|
{
|
position.y = -top;
|
if (m_ContainerVoice.anchoredPosition != position)
|
{
|
m_ContainerVoice.anchoredPosition = position;
|
}
|
top = top + m_ContainerVoice.sizeDelta.y;
|
top += space;
|
}
|
position.y = -top;
|
if (targetRect.anchoredPosition != position)
|
{
|
targetRect.anchoredPosition = position;
|
}
|
}
|
|
void SetAnchor(RectTransform targetRect)
|
{
|
if (!left)
|
{
|
if (targetRect.anchorMin != Vector2.one)
|
{
|
targetRect.anchorMin = Vector2.one;
|
}
|
if (targetRect.anchorMax != Vector2.one)
|
{
|
targetRect.anchorMax = Vector2.one;
|
}
|
if (targetRect.pivot != Vector2.one)
|
{
|
targetRect.pivot = Vector2.one;
|
}
|
}
|
else
|
{
|
if (targetRect.anchorMin != Vector2.up)
|
{
|
targetRect.anchorMin = Vector2.up;
|
}
|
if (targetRect.anchorMax != Vector2.up)
|
{
|
targetRect.anchorMax = Vector2.up;
|
}
|
if (targetRect.pivot != Vector2.up)
|
{
|
targetRect.pivot = Vector2.up;
|
}
|
}
|
}
|
|
public float GetBubbleHeight(string content, ArrayList list)
|
{
|
if (m_Target is RichText)
|
{
|
(m_Target as RichText).SetExtenalData(list);
|
}
|
m_Target.text = content;
|
var height = m_Target.preferredHeight;
|
bool nullContent = string.IsNullOrEmpty(content);
|
if (nullContent)
|
{
|
height = 0f;
|
}
|
if (m_ContainerVoice != null)
|
{
|
height += m_ContainerVoice.sizeDelta.y;
|
if (!nullContent)
|
{
|
height += space;
|
}
|
}
|
return height + padding.top + padding.bottom;
|
}
|
}
|