Files
MagnetismHeroes/Assets/MagnetismHeroes/UnityRuntime/Presentation/GroupBadge.cs
T

46 lines
2.4 KiB
C#

using TMPro;
using UnityEngine;
namespace MagnetismHeroes.UnityRuntime.Presentation
{
public sealed class GroupBadge : MonoBehaviour
{
[SerializeField] private TMP_Text _number;
[SerializeField] private Transform _face;
[SerializeField] private Transform _cape;
[SerializeField] private Transform _equipment;
[SerializeField] private SpriteRenderer _expression;
[SerializeField] private Sprite[] _expressions;
private float _celebrateUntil;
private Vector3 _facePosition;
private int _mood;
private float _look;
public bool IsReacting => _celebrateUntil > Time.unscaledTime;
public void React() => _celebrateUntil = Time.unscaledTime + .45f;
public void Mood(int expression, float look = 0) { _mood = expression; _look = look; }
public void ClearReaction() { _celebrateUntil = 0; _mood = 0; _look = 0; }
public void Bind(int count, Vector3 numberPosition, Vector3 facePosition)
{
_number.text = count.ToString(); _number.transform.position = numberPosition; _facePosition = facePosition;
}
public void FaceCamera(Camera camera)
{
float remaining = Mathf.Max(0, _celebrateUntil - Time.unscaledTime);
_number.transform.rotation = camera.transform.rotation;
_face.SetPositionAndRotation(_facePosition + camera.transform.up * (Mathf.Sin(remaining / .45f * Mathf.PI) * .025f),
camera.transform.rotation * Quaternion.Euler(0, 0, _look * 6 + Mathf.Sin(remaining * 18) * 3));
if (_equipment != null)
_equipment.SetPositionAndRotation(_facePosition + camera.transform.forward * .49f, camera.transform.rotation);
if (_expression != null && _expressions != null && _expressions.Length == 6)
_expression.sprite = _expressions[remaining > 0 ? 5 : _mood];
if (_cape != null)
{
_cape.SetPositionAndRotation(_facePosition + camera.transform.forward * .7f, camera.transform.rotation);
var ribbon = _cape.GetComponent<LineRenderer>();
if (ribbon != null) for (int i = 0; i < ribbon.positionCount; i++)
ribbon.SetPosition(i, new Vector3((_look == 0 ? -1 : _look) * (.12f + i * .075f), .03f + i * .012f + Mathf.Sin(Time.unscaledTime * 4 - i * .4f) * .025f, .02f));
}
}
}
}