架构大更

This commit is contained in:
SoulliesOfficial
2026-03-20 11:56:50 -04:00
parent e60ef64d01
commit d09b58fd80
3663 changed files with 15232012 additions and 105579 deletions

View File

@@ -1,168 +1,172 @@
using MoreMountains.Feedbacks;
using MoreMountains.Tools;
using System.Collections;
using System.Collections;
using System.Collections.Generic;
using MoreMountains.Feedbacks;
using MoreMountains.Tools;
using UnityEngine;
namespace MoreMountains.Feel
{
/// <summary>
/// A simple class controlling the hero character in the Barbarians demo scene
/// It simulates a very simple character controller in an ARPG game
/// A simple class controlling the hero character in the Barbarians demo scene
/// It simulates a very simple character controller in an ARPG game
/// </summary>
[AddComponentMenu("")]
public class Barbarian : MonoBehaviour
{
[Header("Cooldown")]
/// a duration, in seconds, between two attacks, during which attacks are prevented
[Tooltip("a duration, in seconds, between two attacks, during which attacks are prevented")]
public float CooldownDuration = 0.1f;
public class Barbarian : MonoBehaviour
{
[Header("Cooldown")]
/// a duration, in seconds, between two attacks, during which attacks are prevented
[Tooltip("a duration, in seconds, between two attacks, during which attacks are prevented")]
public float CooldownDuration = 0.1f;
[Header("Feedbacks")]
/// a feedback to call when the attack starts
[Tooltip("a feedback to call when the attack starts")]
public MMFeedbacks AttackFeedback;
/// a feedback to call when each individual attack phase starts
[Tooltip("a feedback to call when each individual attack phase starts")]
public MMFeedbacks IndividualAttackFeedback;
/// a feedback to call when trying to attack while in cooldown
[Tooltip("a feedback to call when trying to attack while in cooldown")]
public MMFeedbacks DeniedFeedback;
[Header("Feedbacks")]
/// a feedback to call when the attack starts
[Tooltip("a feedback to call when the attack starts")]
public MMFeedbacks AttackFeedback;
[Header("Attack settings")]
/// a curve on which to move the character when it attacks
public MMTween.MMTweenCurve AttackCurve = MMTween.MMTweenCurve.EaseInOutOverhead;
/// the duration of the attack in seconds
public float AttackDuration = 2.5f;
/// an offset at which to attack enemies
public float AttackPositionOffset = 0.3f;
/// a duration by which to reduce movement duration after every attack (making each attack faster than the previous one)
public float IntervalDecrement = 0.1f;
/// a feedback to call when each individual attack phase starts
[Tooltip("a feedback to call when each individual attack phase starts")]
public MMFeedbacks IndividualAttackFeedback;
protected List<Vector3> _targets;
protected float _lastAttackStartedAt = -100f;
protected Vector3 _initialPosition;
protected Vector3 _initialLookAtTarget;
protected Vector3 _lookAtTarget;
protected BarbarianEnemy _enemy;
/// a feedback to call when trying to attack while in cooldown
[Tooltip("a feedback to call when trying to attack while in cooldown")]
public MMFeedbacks DeniedFeedback;
/// <summary>
/// On Awake we store our initial position
/// </summary>
protected virtual void Awake()
{
_initialPosition = this.transform.position;
_initialLookAtTarget = this.transform.position + this.transform.forward * 10f;
_lookAtTarget = _initialLookAtTarget;
}
[Header("Attack settings")]
/// a curve on which to move the character when it attacks
public MMTween.MMTweenCurve AttackCurve = MMTween.MMTweenCurve.EaseInOutOverhead;
/// <summary>
/// On Update we look for input
/// </summary>
protected virtual void Update()
{
HandleInput();
LookAtTarget();
}
/// the duration of the attack in seconds
public float AttackDuration = 2.5f;
/// <summary>
/// Makes the character look at the target it's attacking
/// </summary>
protected virtual void LookAtTarget()
{
Vector3 direction = _lookAtTarget - _initialPosition;
this.transform.LookAt(_lookAtTarget + direction * 5f);
}
/// an offset at which to attack enemies
public float AttackPositionOffset = 0.3f;
/// <summary>
/// Detects input
/// </summary>
protected virtual void HandleInput()
{
if (FeelDemosInputHelper.CheckMainActionInputPressedThisFrame())
{
Attack();
}
}
/// a duration by which to reduce movement duration after every attack (making each attack faster than the previous one)
public float IntervalDecrement = 0.1f;
/// <summary>
/// Performs an attack if possible, otherwise plays a denied feedback
/// </summary>
protected virtual void Attack()
{
if (Time.time - _lastAttackStartedAt < CooldownDuration + AttackDuration)
{
DeniedFeedback?.PlayFeedbacks();
}
else
{
AcquireTargets();
StartCoroutine(AttackCoroutine());
_lastAttackStartedAt = Time.time;
}
}
protected BarbarianEnemy _enemy;
protected Vector3 _initialLookAtTarget;
protected Vector3 _initialPosition;
protected float _lastAttackStartedAt = -100f;
protected Vector3 _lookAtTarget;
/// <summary>
/// Finds targets around the Barbarian and stores them
/// </summary>
protected virtual void AcquireTargets()
{
_targets = new List<Vector3>();
protected List<Vector3> _targets;
Collider[] hitColliders = Physics.OverlapSphere(this.transform.position, 5f);
foreach (var hitCollider in hitColliders)
{
Vector3 enemyPosition = hitCollider.transform.position;
Vector3 direction = this.transform.position - enemyPosition;
/// <summary>
/// On Awake we store our initial position
/// </summary>
protected virtual void Awake()
{
_initialPosition = transform.position;
_initialLookAtTarget = transform.position + transform.forward * 10f;
_lookAtTarget = _initialLookAtTarget;
}
if (hitCollider.GetComponent<BarbarianEnemy>() != null)
{
_targets.Add(enemyPosition + direction * AttackPositionOffset);
}
}
_targets.MMShuffle();
}
/// <summary>
/// A coroutine used to move to each stored target to attack them
/// </summary>
/// <returns></returns>
protected virtual IEnumerator AttackCoroutine()
{
float intervalDuration = AttackDuration / _targets.Count;
// we play our initial attack feedback
AttackFeedback?.PlayFeedbacks();
/// <summary>
/// On Update we look for input
/// </summary>
protected virtual void Update()
{
HandleInput();
LookAtTarget();
}
int enemyCounter = 0;
/// <summary>
/// When we collide with an enemy, we apply damage to it
/// </summary>
/// <param name="other"></param>
protected virtual void OnTriggerEnter(Collider other)
{
_enemy = other.GetComponent<BarbarianEnemy>();
if (_enemy != null)
{
// we randomize the damage done and apply it to the enemy
var damage = Random.Range(50, 250);
_enemy.TakeDamage(damage);
}
}
foreach (Vector3 destination in _targets)
{
// for each new enemy, we play an attack feedback
IndividualAttackFeedback?.PlayFeedbacks();
MMTween.MoveTransform(this, this.transform, this.transform.position, destination, null, 0f, intervalDuration, AttackCurve);
_lookAtTarget = destination;
yield return MMCoroutine.WaitFor(intervalDuration - enemyCounter * IntervalDecrement);
enemyCounter++;
}
/// <summary>
/// Makes the character look at the target it's attacking
/// </summary>
protected virtual void LookAtTarget()
{
var direction = _lookAtTarget - _initialPosition;
transform.LookAt(_lookAtTarget + direction * 5f);
}
MMTween.MoveTransform(this, this.transform, this.transform.position, _initialPosition, null, 0f, intervalDuration, AttackCurve);
_lookAtTarget = _initialLookAtTarget;
}
/// <summary>
/// Detects input
/// </summary>
protected virtual void HandleInput()
{
if (FeelDemosInputHelper.CheckMainActionInputPressedThisFrame()) Attack();
}
/// <summary>
/// When we collide with an enemy, we apply damage to it
/// </summary>
/// <param name="other"></param>
protected virtual void OnTriggerEnter(Collider other)
{
_enemy = other.GetComponent<BarbarianEnemy>();
if (_enemy != null)
{
// we randomize the damage done and apply it to the enemy
int damage = Random.Range(50, 250);
_enemy.TakeDamage(damage);
}
}
}
/// <summary>
/// Performs an attack if possible, otherwise plays a denied feedback
/// </summary>
protected virtual void Attack()
{
if (Time.time - _lastAttackStartedAt < CooldownDuration + AttackDuration)
{
DeniedFeedback?.PlayFeedbacks();
}
else
{
AcquireTargets();
StartCoroutine(AttackCoroutine());
_lastAttackStartedAt = Time.time;
}
}
/// <summary>
/// Finds targets around the Barbarian and stores them
/// </summary>
protected virtual void AcquireTargets()
{
_targets = new List<Vector3>();
var hitColliders = Physics.OverlapSphere(transform.position, 5f);
foreach (var hitCollider in hitColliders)
{
var enemyPosition = hitCollider.transform.position;
var direction = transform.position - enemyPosition;
if (hitCollider.GetComponent<BarbarianEnemy>() != null)
_targets.Add(enemyPosition + direction * AttackPositionOffset);
}
_targets.MMShuffle();
}
/// <summary>
/// A coroutine used to move to each stored target to attack them
/// </summary>
/// <returns></returns>
protected virtual IEnumerator AttackCoroutine()
{
var intervalDuration = AttackDuration / _targets.Count;
// we play our initial attack feedback
AttackFeedback?.PlayFeedbacks();
var enemyCounter = 0;
foreach (var destination in _targets)
{
// for each new enemy, we play an attack feedback
IndividualAttackFeedback?.PlayFeedbacks();
MMTween.MoveTransform(this, transform, transform.position, destination, null, 0f, intervalDuration,
AttackCurve);
_lookAtTarget = destination;
yield return MMCoroutine.WaitFor(intervalDuration - enemyCounter * IntervalDecrement);
enemyCounter++;
}
MMTween.MoveTransform(this, transform, transform.position, _initialPosition, null, 0f, intervalDuration,
AttackCurve);
_lookAtTarget = _initialLookAtTarget;
}
}
}

View File

@@ -4,66 +4,64 @@ using UnityEngine;
namespace MoreMountains.Feel
{
[AddComponentMenu("")]
public class FeelBrass : MonoBehaviour
{
[Header("Bindings")]
/// a reference to the MMAudioAnalyzer in the scene
public MMAudioAnalyzer TargetAnalyzer;
/// a light we want to control based on the current level of the music
public Light TargetLight;
[AddComponentMenu("")]
public class FeelBrass : MonoBehaviour
{
[Header("Bindings")]
/// a reference to the MMAudioAnalyzer in the scene
public MMAudioAnalyzer TargetAnalyzer;
[Header("Cooldown")]
/// a duration, in seconds, between two special dance moves, during which moves are prevented
[Tooltip("a duration, in seconds, between two special dance moves, during which moves are prevented")]
public float CooldownDuration = 0.1f;
/// a light we want to control based on the current level of the music
public Light TargetLight;
[Header("Feedbacks")]
/// a feedback to play when doing a special dance move
[Tooltip("a feedback to play when doing a special dance move")]
public MMFeedbacks SpecialDanceMoveFeedbacks;
protected float _lastMoveStartedAt = -100f;
/// <summary>
/// On Update we look for input
/// </summary>
protected virtual void Update()
{
HandleInput();
ControlLightIntensity();
}
[Header("Cooldown")]
/// a duration, in seconds, between two special dance moves, during which moves are prevented
[Tooltip("a duration, in seconds, between two special dance moves, during which moves are prevented")]
public float CooldownDuration = 0.1f;
/// <summary>
/// Detects input
/// </summary>
protected virtual void HandleInput()
{
if (FeelDemosInputHelper.CheckMainActionInputPressedThisFrame())
{
SpecialDanceMove();
}
}
[Header("Feedbacks")]
/// a feedback to play when doing a special dance move
[Tooltip("a feedback to play when doing a special dance move")]
public MMFeedbacks SpecialDanceMoveFeedbacks;
/// <summary>
/// Updates the light's intensity in real time based on the music's levels
/// </summary>
protected virtual void ControlLightIntensity()
{
// this simple line lets us grab the current normalized & buffered amplitude of the music, and feed it to the light
TargetLight.intensity = TargetAnalyzer.NormalizedBufferedAmplitude * 5f;
}
protected float _lastMoveStartedAt = -100f;
/// <summary>
/// Performs a move if possible, otherwise plays a denied feedback
/// </summary>
protected virtual void SpecialDanceMove()
{
if (Time.time - _lastMoveStartedAt >= CooldownDuration)
{
SpecialDanceMoveFeedbacks?.PlayFeedbacks();
_lastMoveStartedAt = Time.time;
}
}
}
/// <summary>
/// On Update we look for input
/// </summary>
protected virtual void Update()
{
HandleInput();
ControlLightIntensity();
}
/// <summary>
/// Detects input
/// </summary>
protected virtual void HandleInput()
{
if (FeelDemosInputHelper.CheckMainActionInputPressedThisFrame()) SpecialDanceMove();
}
/// <summary>
/// Updates the light's intensity in real time based on the music's levels
/// </summary>
protected virtual void ControlLightIntensity()
{
// this simple line lets us grab the current normalized & buffered amplitude of the music, and feed it to the light
TargetLight.intensity = TargetAnalyzer.NormalizedBufferedAmplitude * 5f;
}
/// <summary>
/// Performs a move if possible, otherwise plays a denied feedback
/// </summary>
protected virtual void SpecialDanceMove()
{
if (Time.time - _lastMoveStartedAt >= CooldownDuration)
{
SpecialDanceMoveFeedbacks?.PlayFeedbacks();
_lastMoveStartedAt = Time.time;
}
}
}
}

View File

@@ -1,23 +1,18 @@
using System.Collections;
using System.Collections.Generic;
using MoreMountains.Feedbacks;
using MoreMountains.Feedbacks;
using UnityEngine;
namespace MoreMountains.Feel
{
/// <summary>
/// This component checks whether the user pressed Enter and plays the associated feedback if that's the case
/// This component checks whether the user pressed Enter and plays the associated feedback if that's the case
/// </summary>
public class FeelDemosNextDemoButtonInput : MonoBehaviour
{
public MMFeedbacks OnInputFeedback;
{
public MMFeedbacks OnInputFeedback;
protected virtual void Update()
{
if (FeelDemosInputHelper.CheckEnterPressedThisFrame())
{
OnInputFeedback?.PlayFeedbacks();
}
}
}
protected virtual void Update()
{
if (FeelDemosInputHelper.CheckEnterPressedThisFrame()) OnInputFeedback?.PlayFeedbacks();
}
}
}

View File

@@ -3,81 +3,84 @@ using UnityEngine;
#if MM_UGUI2
using TMPro;
#endif
#if MM_UI
namespace MoreMountains.Feel
{
/// <summary>
/// A small script used to power the FeelMMSoundManagerPlaylistManager demo scene
/// A small script used to power the FeelMMSoundManagerPlaylistManager demo scene
/// </summary>
[AddComponentMenu("")]
public class PlaylistDemo : MonoBehaviour
{
/// the playlist manager to read data on
public MMSMPlaylistManager PlaylistManager;
/// a progress bar meant to display the progress of the song currently playing
public MMProgressBar ProgressBar;
#if MM_UGUI2
/// the name of the song currently playing
public TMP_Text SongName;
/// a text displaying the current progress of the song in minutes/seconds
public TMP_Text SongDuration;
#endif
public class PlaylistDemo : MonoBehaviour
{
/// the playlist manager to read data on
public MMSMPlaylistManager PlaylistManager;
/// <summary>
/// On Update, updates the progress bar and song duration counter
/// </summary>
protected virtual void Update()
{
if (PlaylistManager.CurrentClipDuration == 0f)
{
ProgressBar.SetBar(0f, 0f, 1f);
}
else
{
ProgressBar.SetBar(PlaylistManager.CurrentTime, 0f, PlaylistManager.CurrentClipDuration);
#if MM_UGUI2
SongDuration.text = MMTime.FloatToTimeString(PlaylistManager.CurrentTime, false, true, true, false)
+ " / "
+ MMTime.FloatToTimeString(PlaylistManager.CurrentClipDuration, false, true, true, false);
#endif
}
}
/// a progress bar meant to display the progress of the song currently playing
public MMProgressBar ProgressBar;
/// <summary>
/// Updates the song name display
/// </summary>
protected virtual void UpdateSongName()
{
int displayIndex = PlaylistManager.CurrentSongIndex + 1;
#if MM_UGUI2
SongName.text = displayIndex + ". " + PlaylistManager.CurrentSongName;
#endif
}
/// <summary>
/// When a new song starts to play, we update its name
/// </summary>
/// <param name="channel"></param>
protected virtual void OnPlayEvent(int channel)
{
UpdateSongName();
}
/// <summary>
/// Starts listening for events
/// </summary>
protected virtual void OnEnable()
{
MMPlaylistNewSongStartedEvent.Register(OnPlayEvent);
}
/// <summary>
/// Stops listening for events
/// </summary>
protected virtual void OnDisable()
{
MMPlaylistNewSongStartedEvent.Unregister(OnPlayEvent);
}
}
}
/// <summary>
/// On Update, updates the progress bar and song duration counter
/// </summary>
protected virtual void Update()
{
if (PlaylistManager.CurrentClipDuration == 0f)
{
ProgressBar.SetBar(0f, 0f, 1f);
}
else
{
ProgressBar.SetBar(PlaylistManager.CurrentTime, 0f, PlaylistManager.CurrentClipDuration);
#if MM_UGUI2
SongDuration.text = MMTime.FloatToTimeString(PlaylistManager.CurrentTime)
+ " / "
+ MMTime.FloatToTimeString(PlaylistManager.CurrentClipDuration);
#endif
}
}
/// <summary>
/// Starts listening for events
/// </summary>
protected virtual void OnEnable()
{
MMPlaylistNewSongStartedEvent.Register(OnPlayEvent);
}
/// <summary>
/// Stops listening for events
/// </summary>
protected virtual void OnDisable()
{
MMPlaylistNewSongStartedEvent.Unregister(OnPlayEvent);
}
/// <summary>
/// Updates the song name display
/// </summary>
protected virtual void UpdateSongName()
{
var displayIndex = PlaylistManager.CurrentSongIndex + 1;
#if MM_UGUI2
SongName.text = displayIndex + ". " + PlaylistManager.CurrentSongName;
#endif
}
/// <summary>
/// When a new song starts to play, we update its name
/// </summary>
/// <param name="channel"></param>
protected virtual void OnPlayEvent(int channel)
{
UpdateSongName();
}
#if MM_UGUI2
/// the name of the song currently playing
public TMP_Text SongName;
/// a text displaying the current progress of the song in minutes/seconds
public TMP_Text SongDuration;
#endif
}
}
#endif

View File

@@ -1,3 +1,3 @@
{
"reference": "GUID:4a1cb1490dc4df8409b2580d6b44e75e"
"reference": "GUID:4a1cb1490dc4df8409b2580d6b44e75e"
}

View File

@@ -1,81 +1,80 @@
using MoreMountains.Feedbacks;
using MoreMountains.Tools;
#if MM_UGUI2
using TMPro;
#endif
using UnityEngine;
#if MM_UGUI2
#endif
namespace MoreMountains.Feel
{
[AddComponentMenu("")]
public class FeelSpringsVector3Demo : MonoBehaviour
{
[Header("Spring")]
public MMSpringFloat SpringX;
public MMSpringFloat SpringY;
public MMSpringFloat SpringZ;
[AddComponentMenu("")]
public class FeelSpringsVector3Demo : MonoBehaviour
{
[Header("Spring")] public MMSpringFloat SpringX;
[Header("Bindings")]
public FeelSpringsDemoSlider DampingXSlider;
public FeelSpringsDemoSlider FrequencyXSlider;
public FeelSpringsDemoSlider DampingYSlider;
public FeelSpringsDemoSlider FrequencyYSlider;
public FeelSpringsDemoSlider DampingZSlider;
public FeelSpringsDemoSlider FrequencyZSlider;
public FeelSpringsDemoSlider BumpAmountSlider;
public Transform MovingObject;
public MMSpringFloat SpringY;
public MMSpringFloat SpringZ;
protected Vector3 _newPosition;
[Header("Bindings")] public FeelSpringsDemoSlider DampingXSlider;
protected float _range = 0.375f;
public FeelSpringsDemoSlider FrequencyXSlider;
public FeelSpringsDemoSlider DampingYSlider;
public FeelSpringsDemoSlider FrequencyYSlider;
public FeelSpringsDemoSlider DampingZSlider;
public FeelSpringsDemoSlider FrequencyZSlider;
public FeelSpringsDemoSlider BumpAmountSlider;
public Transform MovingObject;
protected virtual void OnEnable()
{
SpringX.CurrentValue = 0f;
SpringX.TargetValue = 0f;
SpringX.Velocity = 0f;
SpringY.CurrentValue = 0f;
SpringY.TargetValue = 0f;
SpringY.Velocity = 0f;
SpringZ.CurrentValue = 0f;
SpringZ.TargetValue = 0f;
SpringZ.Velocity = 0f;
}
public virtual void RandomMove()
{
SpringX.MoveTo(UnityEngine.Random.Range(-1f,1f));
SpringY.MoveTo(UnityEngine.Random.Range(-1f,1f));
SpringZ.MoveTo(UnityEngine.Random.Range(-1f,1f));
}
protected Vector3 _newPosition;
public virtual void RandomBump()
{
float bumpAmount = BumpAmountSlider.value;
SpringX.BumpRandom(-bumpAmount, bumpAmount);
SpringY.BumpRandom(-bumpAmount, bumpAmount);
SpringZ.BumpRandom(-bumpAmount, bumpAmount);
}
protected virtual void Update()
{
SpringX.Damping = DampingXSlider.value;
SpringY.Damping = DampingYSlider.value;
SpringX.Frequency = FrequencyXSlider.value;
SpringY.Frequency = FrequencyYSlider.value;
SpringZ.Damping = DampingZSlider.value;
SpringZ.Frequency = FrequencyZSlider.value;
SpringX.UpdateSpringValue(Time.deltaTime);
SpringY.UpdateSpringValue(Time.deltaTime);
SpringZ.UpdateSpringValue(Time.deltaTime);
protected float _range = 0.375f;
_newPosition = MovingObject.transform.localPosition;
_newPosition.x = MMMaths.Remap(SpringX.CurrentValue, -1f, 1f, -_range, _range);
_newPosition.y = MMMaths.Remap(SpringY.CurrentValue, -1f, 1f, -_range, _range) + 1f;
_newPosition.z = MMMaths.Remap(SpringZ.CurrentValue, -1f, 1f, -_range, _range);
protected virtual void Update()
{
SpringX.Damping = DampingXSlider.value;
SpringY.Damping = DampingYSlider.value;
SpringX.Frequency = FrequencyXSlider.value;
SpringY.Frequency = FrequencyYSlider.value;
SpringZ.Damping = DampingZSlider.value;
SpringZ.Frequency = FrequencyZSlider.value;
SpringX.UpdateSpringValue(Time.deltaTime);
SpringY.UpdateSpringValue(Time.deltaTime);
SpringZ.UpdateSpringValue(Time.deltaTime);
MovingObject.transform.localPosition = _newPosition;
}
}
}
_newPosition = MovingObject.transform.localPosition;
_newPosition.x = MMMaths.Remap(SpringX.CurrentValue, -1f, 1f, -_range, _range);
_newPosition.y = MMMaths.Remap(SpringY.CurrentValue, -1f, 1f, -_range, _range) + 1f;
_newPosition.z = MMMaths.Remap(SpringZ.CurrentValue, -1f, 1f, -_range, _range);
MovingObject.transform.localPosition = _newPosition;
}
protected virtual void OnEnable()
{
SpringX.CurrentValue = 0f;
SpringX.TargetValue = 0f;
SpringX.Velocity = 0f;
SpringY.CurrentValue = 0f;
SpringY.TargetValue = 0f;
SpringY.Velocity = 0f;
SpringZ.CurrentValue = 0f;
SpringZ.TargetValue = 0f;
SpringZ.Velocity = 0f;
}
public virtual void RandomMove()
{
SpringX.MoveTo(Random.Range(-1f, 1f));
SpringY.MoveTo(Random.Range(-1f, 1f));
SpringZ.MoveTo(Random.Range(-1f, 1f));
}
public virtual void RandomBump()
{
var bumpAmount = BumpAmountSlider.value;
SpringX.BumpRandom(-bumpAmount, bumpAmount);
SpringY.BumpRandom(-bumpAmount, bumpAmount);
SpringZ.BumpRandom(-bumpAmount, bumpAmount);
}
}
}

View File

@@ -1,3 +1,3 @@
#MainContainer {
background-color: rgba(15, 123, 138, 255) !important ;
background-color: rgba(15, 123, 138, 255) !important;
}

View File

@@ -1,28 +1,37 @@
<ui:UXML xmlns:ui="UnityEngine.UIElements" xmlns:uie="UnityEditor.UIElements" editor-extension-mode="False">
<Style src="../Stylesheets/FeelUIToolkitFeedbacksDemoStylesheet.uss?fileID=7433441132597879392&amp;guid=4b112bc2d5df4c247864fd3499a53d9e&amp;type=3#FeelUIToolkitFeedbacksDemoStylesheet" />
<ui:UXML xmlns:ui="UnityEngine.UIElements" editor-extension-mode="False">
<Style src="../Stylesheets/FeelUIToolkitFeedbacksDemoStylesheet.uss?fileID=7433441132597879392&amp;guid=4b112bc2d5df4c247864fd3499a53d9e&amp;type=3#FeelUIToolkitFeedbacksDemoStylesheet"/>
<ui:VisualElement name="MainContainer" class="MainContainer">
<ui:Label text="FEEL UI Toolkit Demo" display-tooltip-when-elided="true" name="Title" style="flex-basis: 10%; justify-content: center; -unity-text-align: middle-center; -unity-font: url(&quot;../Fonts/UIToolkitDemo_BigJohn.otf?fileID=12800000&amp;guid=3258cbeb41f23b545a323883d7b047b9&amp;type=3#UIToolkitDemo_BigJohn&quot;); -unity-font-style: normal; font-size: 40px; -unity-font-definition: initial; background-color: rgb(255, 196, 0); color: rgb(0, 0, 0); width: 100%;" />
<ui:VisualElement name="Container" style="flex-grow: 1; flex-basis: 50%; -unity-background-image-tint-color: rgb(31, 31, 31); flex-direction: row; align-items: center; background-color: rgba(31, 31, 31, 0); justify-content: center;">
<ui:VisualElement name="DemoFace" style="background-image: none; width: 128px; height: 128px;" />
<ui:Label text="Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." display-tooltip-when-elided="true" name="DemoText" class="MainText" style="-unity-font: url(&quot;../Fonts/UIToolkitDemo_Lato.ttf?fileID=12800000&amp;guid=6f8c7831e01d1074488720a8bac8a393&amp;type=3#UIToolkitDemo_Lato&quot;);" />
<ui:Label text="FEEL UI Toolkit Demo" display-tooltip-when-elided="true" name="Title"
style="flex-basis: 10%; justify-content: center; -unity-text-align: middle-center; -unity-font: url(&quot;../Fonts/UIToolkitDemo_BigJohn.otf?fileID=12800000&amp;guid=3258cbeb41f23b545a323883d7b047b9&amp;type=3#UIToolkitDemo_BigJohn&quot;); -unity-font-style: normal; font-size: 40px; -unity-font-definition: initial; background-color: rgb(255, 196, 0); color: rgb(0, 0, 0); width: 100%;"/>
<ui:VisualElement name="Container"
style="flex-grow: 1; flex-basis: 50%; -unity-background-image-tint-color: rgb(31, 31, 31); flex-direction: row; align-items: center; background-color: rgba(31, 31, 31, 0); justify-content: center;">
<ui:VisualElement name="DemoFace" style="background-image: none; width: 128px; height: 128px;"/>
<ui:Label
text="Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
display-tooltip-when-elided="true" name="DemoText" class="MainText"
style="-unity-font: url(&quot;../Fonts/UIToolkitDemo_Lato.ttf?fileID=12800000&amp;guid=6f8c7831e01d1074488720a8bac8a393&amp;type=3#UIToolkitDemo_Lato&quot;);"/>
</ui:VisualElement>
<ui:VisualElement name="Buttons" style="background-color: rgba(31, 31, 31, 0); display: flex; flex-grow: 0; flex-basis: 40%; justify-content: center; flex-direction: row; height: 312px; position: relative; left: 0; top: 0; right: 0; bottom: 0; flex-wrap: wrap; flex-shrink: 1; align-items: flex-end; padding-left: 20px; padding-right: 20px; padding-top: 20px; padding-bottom: 20px; margin-left: 0; margin-right: 0; margin-top: 0; margin-bottom: 0; -unity-background-image-tint-color: rgb(31, 31, 31);">
<ui:Button text="Background Color" display-tooltip-when-elided="true" name="BtnBackgroundColor" class="button nop" />
<ui:Button text="Border Color" display-tooltip-when-elided="true" name="BtnBorderColor" enable-rich-text="false" class="button FeelBackground" />
<ui:Button text="Border Radius" display-tooltip-when-elided="true" name="BtnBorderRadius" class="button" />
<ui:Button text="Border Width" display-tooltip-when-elided="true" name="BtnBorderWidth" class="button" />
<ui:Button text="Class" display-tooltip-when-elided="true" name="BtnClass" class="button" />
<ui:Button text="Font Size" display-tooltip-when-elided="true" name="BtnFontSize" class="button" />
<ui:Button text="Image Tint" display-tooltip-when-elided="true" name="BtnTint" class="button" />
<ui:Button text="Opacity" display-tooltip-when-elided="true" name="BtnOpacity" class="button" />
<ui:Button text="Rotate" display-tooltip-when-elided="true" name="BtnRotate" class="button" />
<ui:Button text="Scale" display-tooltip-when-elided="true" name="BtnScale" class="button" />
<ui:Button text="Size" display-tooltip-when-elided="true" name="BtnSize" class="button" />
<ui:Button text="Stylesheet" display-tooltip-when-elided="true" name="BtnStylesheet" class="button" />
<ui:Button text="Text" display-tooltip-when-elided="true" name="BtnText" class="button" />
<ui:Button text="Text Color" display-tooltip-when-elided="true" name="BtnTextColor" class="button" />
<ui:Button text="Translate" display-tooltip-when-elided="true" name="BtnTranslate" class="button" />
<ui:Button text="Visible" display-tooltip-when-elided="true" name="BtnVisible" class="button" style="flex-wrap: nowrap;" />
<ui:VisualElement name="Buttons"
style="background-color: rgba(31, 31, 31, 0); display: flex; flex-grow: 0; flex-basis: 40%; justify-content: center; flex-direction: row; height: 312px; position: relative; left: 0; top: 0; right: 0; bottom: 0; flex-wrap: wrap; flex-shrink: 1; align-items: flex-end; padding-left: 20px; padding-right: 20px; padding-top: 20px; padding-bottom: 20px; margin-left: 0; margin-right: 0; margin-top: 0; margin-bottom: 0; -unity-background-image-tint-color: rgb(31, 31, 31);">
<ui:Button text="Background Color" display-tooltip-when-elided="true" name="BtnBackgroundColor"
class="button nop"/>
<ui:Button text="Border Color" display-tooltip-when-elided="true" name="BtnBorderColor"
enable-rich-text="false" class="button FeelBackground"/>
<ui:Button text="Border Radius" display-tooltip-when-elided="true" name="BtnBorderRadius" class="button"/>
<ui:Button text="Border Width" display-tooltip-when-elided="true" name="BtnBorderWidth" class="button"/>
<ui:Button text="Class" display-tooltip-when-elided="true" name="BtnClass" class="button"/>
<ui:Button text="Font Size" display-tooltip-when-elided="true" name="BtnFontSize" class="button"/>
<ui:Button text="Image Tint" display-tooltip-when-elided="true" name="BtnTint" class="button"/>
<ui:Button text="Opacity" display-tooltip-when-elided="true" name="BtnOpacity" class="button"/>
<ui:Button text="Rotate" display-tooltip-when-elided="true" name="BtnRotate" class="button"/>
<ui:Button text="Scale" display-tooltip-when-elided="true" name="BtnScale" class="button"/>
<ui:Button text="Size" display-tooltip-when-elided="true" name="BtnSize" class="button"/>
<ui:Button text="Stylesheet" display-tooltip-when-elided="true" name="BtnStylesheet" class="button"/>
<ui:Button text="Text" display-tooltip-when-elided="true" name="BtnText" class="button"/>
<ui:Button text="Text Color" display-tooltip-when-elided="true" name="BtnTextColor" class="button"/>
<ui:Button text="Translate" display-tooltip-when-elided="true" name="BtnTranslate" class="button"/>
<ui:Button text="Visible" display-tooltip-when-elided="true" name="BtnVisible" class="button"
style="flex-wrap: nowrap;"/>
</ui:VisualElement>
</ui:VisualElement>
</ui:UXML>