Skip to content
Snippets Groups Projects
Commit f9968781 authored by Victor's avatar Victor
Browse files

Move CircularButton and CircularHoldButton to Interaction package

parent f6a8c5cb
Branches
No related tags found
No related merge requests found
using System.Collections;
using Unity.Mathematics;
using UnityEngine;
using UnityEngine.Events;
public class CircularButton : MonoBehaviour
{
[SerializeField] protected Transform borderTransform;
[SerializeField] protected float borderDefaultScale = 2.6f;
[SerializeField] protected float borderMaxScale = 3.2f;
[SerializeField] protected float borderAnimDuration = 0.2f;
[SerializeField] protected AnimationCurve borderAnimCurve;
[SerializeField] private UnityEvent whenBorderAnimDone;
[SerializeField] protected float activeStateAnimDuration = 0.5f;
[SerializeField] protected AnimationCurve activeStateAnimCurve;
public void OnSelect()
{
StartCoroutine(AnimateBorder());
}
public void Activate()
{
gameObject.SetActive(true);
StartCoroutine(AnimateActiveState(-180f, 0, true));
}
public void Deactivate()
{
if (gameObject.activeSelf)
StartCoroutine(AnimateActiveState(0, 180f, false));
}
public void ActivateAfterDelay(float delay)
{
transform.localRotation = Quaternion.Euler(-180f, 0, 0);
gameObject.SetActive(true);
StartCoroutine(ActivateAfterDelayCoroutine(delay));
}
protected IEnumerator ActivateAfterDelayCoroutine(float delay)
{
yield return new WaitForSeconds(delay);
StartCoroutine(AnimateActiveState(-180f, 0, true));
}
protected IEnumerator AnimateBorder()
{
var elapsedTime = 0f;
while (elapsedTime < borderAnimDuration)
{
elapsedTime += Time.deltaTime;
var t = elapsedTime / borderAnimDuration;
var curveValue = borderAnimCurve.Evaluate(t);
var newScaleValue = math.lerp(borderDefaultScale, borderMaxScale, curveValue);
borderTransform.localScale = new Vector3(newScaleValue, newScaleValue, 1f);
yield return null;
}
borderTransform.localScale = new Vector3(borderDefaultScale, borderDefaultScale, 1f);
whenBorderAnimDone?.Invoke();
}
protected virtual IEnumerator AnimateActiveState(float startXRotation, float endXRotation, bool activeState)
{
var elapsedTime = 0f;
while (elapsedTime < activeStateAnimDuration)
{
elapsedTime += Time.deltaTime;
var t = elapsedTime / activeStateAnimDuration;
var curveValue = activeStateAnimCurve.Evaluate(t);
transform.localRotation = Quaternion.Euler(math.lerp(startXRotation, endXRotation, curveValue), 0, 0);
yield return null;
}
transform.localRotation = Quaternion.Euler(0, 0, 0);
if (!activeState)
gameObject.SetActive(false);
}
}
fileFormatVersion: 2
guid: 761e34d033d6447d6b99aa5c612036b9
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
using System.Collections;
using Unity.Mathematics;
using UnityEngine;
using UnityEngine.UI;
public class CircularHoldButton : CircularButton
{
[SerializeField] private GameObject buttonBorderHoldGameObject;
[SerializeField] private GameObject greyCircleGameObject;
[SerializeField] private GameObject greenCircleGameObject;
[SerializeField] private float holdDuration = 1.5f;
private Image _greyCircleImage;
private Image _greenCircleImage;
private bool _isHolding;
private bool _isHoldDone;
private float _holdTime;
private void Start()
{
_greyCircleImage = greyCircleGameObject.GetComponent<Image>();
_greenCircleImage = greenCircleGameObject.GetComponent<Image>();
}
private void Update()
{
if (_isHolding)
{
if (_isHoldDone)
{
_isHolding = false;
buttonBorderHoldGameObject.SetActive(false);
borderTransform.gameObject.SetActive(true);
StartCoroutine(AnimateBorder());
}
else
{
_holdTime += Time.deltaTime;
var t = _holdTime / holdDuration;
_greenCircleImage.fillAmount = math.lerp(0, 1f, t);
if (_holdTime >= holdDuration)
_isHoldDone = true;
}
}
else
{
_holdTime = 0;
_greenCircleImage.fillAmount = 0;
}
}
public new void OnSelect()
{
_isHolding = true;
}
public void OnUnselect()
{
_isHolding = false;
}
public new void ActivateAfterDelay(float delay)
{
_greyCircleImage.enabled = false;
transform.localRotation = Quaternion.Euler(-180f, 0, 0);
gameObject.SetActive(true);
StartCoroutine(ActivateAfterDelayCoroutine(delay));
}
public void Reset()
{
buttonBorderHoldGameObject.SetActive(true);
borderTransform.gameObject.SetActive(false);
_holdTime = 0;
_greenCircleImage.fillAmount = 0;
_isHoldDone = false;
}
protected override IEnumerator AnimateActiveState(float startXRotation, float endXRotation, bool activeState)
{
_greyCircleImage.enabled = activeState;
var elapsedTime = 0f;
while (elapsedTime < activeStateAnimDuration)
{
elapsedTime += Time.deltaTime;
var t = elapsedTime / activeStateAnimDuration;
var curveValue = activeStateAnimCurve.Evaluate(t);
transform.localRotation = Quaternion.Euler(math.lerp(startXRotation, endXRotation, curveValue), 0, 0);
yield return null;
}
transform.localRotation = Quaternion.Euler(0, 0, 0);
if (!activeState)
{
Reset();
gameObject.SetActive(false);
}
}
}
fileFormatVersion: 2
guid: aa4a286915b45493da19c4d4d19a109b
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
{ {
"name": "de.tu-dresden.hcp-xr.xr-starter", "name": "de.tu-dresden.hcp-xr.xr-starter",
"version": "1.0.3", "version": "1.0.4",
"displayName": "HCP-XR Starter", "displayName": "HCP-XR Starter",
"description": "This package helps you to get started quickly with your Unity XR projects.", "description": "This package helps you to get started quickly with your Unity XR projects.",
"unity": "6000.0", "unity": "6000.0",
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment