Files
webRtc/Packages/com.unity.renderstreaming@3.1.0-exp.9/Samples~/Example/WebBrowserInput/UIController.cs
2026-04-28 16:48:04 +08:00

124 lines
4.0 KiB
C#

using System.Linq;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UI;
namespace Unity.RenderStreaming.Samples
{
[RequireComponent(typeof(RectTransform))]
class UIController : MonoBehaviour
{
[SerializeField] Text text;
[SerializeField] CanvasGroup canvasGroup;
[SerializeField] Image pointer;
[SerializeField] GameObject noticeTouchControl;
[SerializeField]
private AnimationCurve transitionCurve =
new AnimationCurve(
new Keyframe(0.75f, 1f, 0f, 0f),
new Keyframe(1f, 0f, 0f, 0f));
private float timeTransition = 0f;
private Color transparentColor = new Color(0, 0, 0, 0);
private RectTransform m_rectTransform = null;
private Keyboard m_keyboard;
private Mouse m_mouse;
private Touchscreen m_screen;
public void SetDevice(InputDevice device, bool add = false)
{
switch (device)
{
case Mouse mouse:
m_mouse = add ? mouse : null;
return;
case Keyboard keyboard:
m_keyboard = add ? keyboard : null;
if (add)
m_keyboard.onTextInput += OnTextInput;
return;
case Touchscreen screen:
m_screen = add ? screen : null;
if (noticeTouchControl != null)
{
noticeTouchControl.SetActive(add);
}
return;
}
}
void Start()
{
m_rectTransform = GetComponent<RectTransform>();
canvasGroup.alpha = 0;
text.text = string.Empty;
}
void FixedUpdate()
{
if (m_keyboard != null && !m_keyboard.anyKey.isPressed &&
!Mathf.Approximately(canvasGroup.alpha, 0f))
{
timeTransition += Time.deltaTime;
canvasGroup.alpha = transitionCurve.Evaluate(timeTransition);
if (Mathf.Approximately(canvasGroup.alpha, 0f))
{
text.text = string.Empty;
}
}
bool pointerFromMouse = HighlightPointerFromMouse(
m_mouse, new Vector2Int(Screen.width, Screen.height));
if (pointerFromMouse)
return;
var touches = m_screen?.GetTouches();
if (touches != null && touches.Count() > 0)
{
var position = Vector2.zero;
var count = touches.Count();
var activeTouches = touches.ToArray();
for (var i = 0; i < count; i++)
{
position += activeTouches[i].screenPosition;
}
pointer.rectTransform.anchoredPosition = position / (float)count;
pointer.color = Color.red;
}
else
{
pointer.color = transparentColor;
}
}
//----------------------------------------------------------------------------------------------------------------------
bool HighlightPointerFromMouse(Mouse mouse, Vector2Int screenSize)
{
if (mouse == null)
return false;
if (!Screen.safeArea.Contains(mouse.position.ReadValue()))
return false;
if (!mouse.leftButton.isPressed && !mouse.rightButton.isPressed)
return false;
Vector2 mousePos = mouse.position.ReadValue();
Vector2 pos = mousePos / screenSize * new Vector2(m_rectTransform.rect.width, m_rectTransform.rect.height);
pointer.rectTransform.anchoredPosition = pos;
pointer.color = Color.red;
return true;
}
void OnTextInput(char c)
{
canvasGroup.alpha = 1f;
text.text = c.ToString();
timeTransition = 0;
}
}
}