46 lines
2.4 KiB
C#
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));
|
|
}
|
|
}
|
|
}
|
|
}
|