Compare commits

..

12 commits
1.2.1 ... main

Author SHA1 Message Date
Gerard Gascón
672856770f
Updated version 2022-10-10 23:33:21 +02:00
Gerard Gascón
8857a11038
Added auto-save 2022-10-10 23:32:15 +02:00
Gerard Gascón
09973676e1
Update package.json 2022-09-25 12:07:36 +02:00
Gerard Gascón
629841b912
Update README.md 2022-09-25 12:06:48 +02:00
Gerard Gascón
c6fe332009
Add files via upload 2022-09-25 12:04:28 +02:00
Gerard Gascón
ff9831ed0b
Update README.md 2022-09-23 09:13:16 +02:00
Gerard Gascón
10cccc9b70
Added in-dialogue sounds 2022-09-22 13:52:08 +02:00
Gerard Gascón
1fde00e811 Revert "Add files via upload"
This reverts commit 1df7a33ab0.
2022-09-22 13:50:33 +02:00
Gerard Gascón
5dc6b69d49 Revert "Revert "Update README.md""
This reverts commit 0837786d01.
2022-09-22 13:50:23 +02:00
Gerard Gascón
0837786d01 Revert "Update README.md"
This reverts commit 4151df9226.
2022-09-22 13:49:54 +02:00
Gerard Gascón
5575d911c8
Update README.md 2022-09-22 13:44:49 +02:00
Gerard Gascón
1df7a33ab0
Add files via upload 2022-09-22 13:43:53 +02:00
10 changed files with 279 additions and 23 deletions

View file

@ -2,8 +2,6 @@
This package contains simple tools to use in your project. This package contains simple tools to use in your project.
This package will be updated once I find another useful tool or someone suggest me one.
## Features ## Features
- **AudioManager** with Play, Pause and most of the other basic things, as well as some effects like FadeIn or FadeOut. - **AudioManager** with Play, Pause and most of the other basic things, as well as some effects like FadeIn or FadeOut.
@ -12,7 +10,8 @@ This package will be updated once I find another useful tool or someone suggest
- Basic menu with **music and SFX sliders** as well as **resolution and quality dropdowns.** - Basic menu with **music and SFX sliders** as well as **resolution and quality dropdowns.**
- An **object pooler** with the ability to create pools with an undetermined size. - An **object pooler** with the ability to create pools with an undetermined size.
- A basic **scene manager** with a loading screen with progress bar. - A basic **scene manager** with a loading screen with progress bar.
- A simple **timer** that is displayed inside a TextMeshPro object. - A simple **timer** that allows you to easily create clocks, countdowns and stopwatches with TextMeshPro
- An **auto-save** feature to reduce the chances of loosing data on crashes.
All of that comes with some editor menu items for creating all of that as fast as possible. All of that comes with some editor menu items for creating all of that as fast as possible.
@ -34,7 +33,7 @@ Download latest package from the Release section Import SimpleTools.unitypackage
## Usage ## Usage
### AudioManager ### **AudioManager**
```csharp ```csharp
using SimpleTools.AudioManager; using SimpleTools.AudioManager;
@ -43,6 +42,7 @@ AudioManager.instance.Play("Name"); //Plays the sound with that name
AudioManager.instance.Play("Name", 1f); //Starts playing the sound "Name" in 1 second AudioManager.instance.Play("Name", 1f); //Starts playing the sound "Name" in 1 second
AudioManager.instance.PlayOneShot("Name"); //Plays one shot of that sound (Useful for repeated sounds) AudioManager.instance.PlayOneShot("Name"); //Plays one shot of that sound (Useful for repeated sounds)
AudioManager.instance.PlayWithIntro("Intro", "Loop"); //Plays the intro and then the loop AudioManager.instance.PlayWithIntro("Intro", "Loop"); //Plays the intro and then the loop
AudioManager.instance.PlayRandomSound("Name1", "Name2", "Name3"); // Plays one shot of a random sound
AudioManager.instance.Pause("Name"); //Pauses the sound AudioManager.instance.Pause("Name"); //Pauses the sound
AudioManager.instance.UnPause("Name"); //Unpauses the sound AudioManager.instance.UnPause("Name"); //Unpauses the sound
@ -60,7 +60,7 @@ AudioManager.instance.FadeMutedIn("Name", 1f); //Fade In a muted sound with a sp
AudioManager.instance.FadeMutedOut("Name", 1f); //Fade Out a sound without stopping it AudioManager.instance.FadeMutedOut("Name", 1f); //Fade Out a sound without stopping it
``` ```
### ObjectPooler ### **ObjectPooler**
The SpawnFromPool function always return a GameObject The SpawnFromPool function always return a GameObject
@ -81,7 +81,7 @@ Pooler.SpawnFromPool("Name", Vector3.zero, transform, true); //Spawn into a spec
Pooler.SpawnFromPool("Name", Vector3.zero, Quaternion.identity, transform, true); //Spawn into a specific position, rotation, parent and instantiate in worldSpace or not Pooler.SpawnFromPool("Name", Vector3.zero, Quaternion.identity, transform, true); //Spawn into a specific position, rotation, parent and instantiate in worldSpace or not
``` ```
### Dialogue System ### **Dialogue System**
The Dialogue function returns a bool (true if it's talking, false if it has ended) The Dialogue function returns a bool (true if it's talking, false if it has ended)
@ -89,22 +89,25 @@ The Dialogue function returns a bool (true if it's talking, false if it has ende
using SimpleTools.DialogueSystem; using SimpleTools.DialogueSystem;
Dialogue dialogue; //The dialogue scriptable object goes here Dialogue dialogue; //The dialogue scriptable object goes here
DialogueSystem.instance.Dialogue(dialogue); //Start/Continue the dialogue DialogueManager.instance.Dialogue(dialogue); //Start/Continue the dialogue
DialogueSystem.instance.Dialogue(dialogue, "Sound1", "Sound2"); //Start/Continue the dialogue with a random set of sounds for the text reveal DialogueManager.instance.Dialogue(dialogue, "Sound1", "Sound2"); //Start/Continue the dialogue with a random set of sounds for the text reveal
``` ```
Text commands: Text commands:
```html ```
<color=color></color> --> Sets font color within tags <color=color></color> --> Sets font color within tags
<size=percentage></size> --> Sets font size within tags <size=percentage></size> --> Sets font size within tags
<sprite=index> --> Draws a sprite from the TextMeshPro <sprite=index> --> Draws a sprite from the TextMeshPro
<p:[tiny,short,normal,long,read]> --> Pauses during a period of time <p:[tiny,short,normal,long,read]> --> Pauses during a period of time
<anim:[wobble,wave,rainbow,shake]></anim> --> Reproduces an animation <anim:[wobble,wave,rainbow,shake]></anim> --> Reproduces an animation
<sp:number></sp> --> Changes reveal speed <sp:number></sp> --> Changes reveal speed
<snd:name> --> Plays a sound effect
<stopmsc:name,time> --> Fades a music out
<playmsc:name,time> --> Fades a music in
``` ```
### SceneManager ### **SceneManager**
```csharp ```csharp
using SimpleTools.SceneManagement; using SimpleTools.SceneManagement;
@ -113,7 +116,7 @@ Loader.Load(0); //Loads a scene with a specific build index
Loader.Load("Scene"); //Loads a scene with a specific name Loader.Load("Scene"); //Loads a scene with a specific name
``` ```
### ScreenShake ### **ScreenShake**
```csharp ```csharp
using SimpleTools.Cinemachine; using SimpleTools.Cinemachine;
@ -121,7 +124,7 @@ using SimpleTools.Cinemachine;
ScreenShake.Shake(1f, .25f); //Shakes the camera with an intensity and duration ScreenShake.Shake(1f, .25f); //Shakes the camera with an intensity and duration
``` ```
### Timer ### **Timer**
```csharp ```csharp
using SimpleTools.Timer; using SimpleTools.Timer;
@ -139,8 +142,12 @@ timer.ResetTimer(); //Pause and sets the time to the default one
timer.Restart(); //Restarts the timer timer.Restart(); //Restarts the timer
``` ```
### Editor ### **Auto-save**
To enable auto-save you have access the menu from the top bar, *Simple Tools>Auto Save Configuration.* You can auto-save every several minutes or auto-save every time you enter play mode.
### **Editor**
You can easily set up some things by right clicking in your Project Tab and then selecting Tools and clicking on the one you want to create. You can easily set up some things by right clicking in your Project Tab and then selecting Tools and clicking on the one you want to create.
Also you can right click in the Hierarchy for easily creating some GameObjects with the Tools in it. Also you can right click in the Hierarchy for easily creating some GameObjects with the Tools in it.

View file

@ -47,6 +47,7 @@ namespace SimpleTools.AudioManager {
/// <summary>Use this to play a sound with a specific name /// <summary>Use this to play a sound with a specific name
/// <para>It has to be in the Sound asset referenced in the AudioManager instance</para> /// <para>It has to be in the Sound asset referenced in the AudioManager instance</para>
/// </summary> /// </summary>
/// <param name="name" type="string">The name of the sound</param>
public void Play(string name) { public void Play(string name) {
Sounds.List s = Array.Find(soundList.sounds, sound => sound.name == name); Sounds.List s = Array.Find(soundList.sounds, sound => sound.name == name);
if (s == null) { if (s == null) {
@ -60,6 +61,8 @@ namespace SimpleTools.AudioManager {
/// <summary>Use this to play a sound with a specific name and with a certain delay /// <summary>Use this to play a sound with a specific name and with a certain delay
/// <para>It has to be in the Sound asset referenced in the AudioManager instance</para> /// <para>It has to be in the Sound asset referenced in the AudioManager instance</para>
/// </summary> /// </summary>
/// <param name="name" type="string">The name of the sound</param>
/// <param name="delay" type="float">The delay in seconds</param>
public void Play(string name, float delay) { public void Play(string name, float delay) {
Sounds.List s = Array.Find(soundList.sounds, sound => sound.name == name); Sounds.List s = Array.Find(soundList.sounds, sound => sound.name == name);
if (s == null) { if (s == null) {
@ -73,6 +76,7 @@ namespace SimpleTools.AudioManager {
/// <summary>Use this to play one shot of a sound with a specific name /// <summary>Use this to play one shot of a sound with a specific name
/// <para>It has to be in the Sound asset referenced in the AudioManager instance</para> /// <para>It has to be in the Sound asset referenced in the AudioManager instance</para>
/// </summary> /// </summary>
/// <param name="name" type="string">The name of the sound</param>
public void PlayOneShot(string name) { public void PlayOneShot(string name) {
Sounds.List s = Array.Find(soundList.sounds, sound => sound.name == name); Sounds.List s = Array.Find(soundList.sounds, sound => sound.name == name);
if (s == null) { if (s == null) {
@ -86,6 +90,8 @@ namespace SimpleTools.AudioManager {
/// <summary>Use this to play an intro song and then start playing the song loop /// <summary>Use this to play an intro song and then start playing the song loop
/// <para>It has to be in the Sound asset referenced in the AudioManager instance</para> /// <para>It has to be in the Sound asset referenced in the AudioManager instance</para>
/// </summary> /// </summary>
/// <param name="intro" type="string">The name of the intro song</param>
/// <param name="song" type="string">The name of the song loop</param>
public void PlayWithIntro(string intro, string song) { public void PlayWithIntro(string intro, string song) {
Sounds.List s = Array.Find(soundList.sounds, sound => sound.name == intro); Sounds.List s = Array.Find(soundList.sounds, sound => sound.name == intro);
if (s == null) { if (s == null) {
@ -102,6 +108,7 @@ namespace SimpleTools.AudioManager {
/// <summary>Use this to play one shot of a random sound within a list /// <summary>Use this to play one shot of a random sound within a list
/// <para>They have to be in the Sound asset referenced in the AudioManager instance</para> /// <para>They have to be in the Sound asset referenced in the AudioManager instance</para>
/// </summary> /// </summary>
/// <param name="names" type="string[]">The names of the sounds</param>
public void PlayRandomSound(params string[] names) { public void PlayRandomSound(params string[] names) {
int random = UnityEngine.Random.Range(0, names.Length); int random = UnityEngine.Random.Range(0, names.Length);
PlayOneShot(names[random]); PlayOneShot(names[random]);
@ -111,6 +118,7 @@ namespace SimpleTools.AudioManager {
/// <summary>Use this to pause a sound with a specific name /// <summary>Use this to pause a sound with a specific name
/// <para>It has to be in the Sound asset referenced in the AudioManager instance</para> /// <para>It has to be in the Sound asset referenced in the AudioManager instance</para>
/// </summary> /// </summary>
/// <param name="name" type="string">The name of the sound</param>
public void Pause(string name) { public void Pause(string name) {
Sounds.List s = Array.Find(soundList.sounds, sound => sound.name == name); Sounds.List s = Array.Find(soundList.sounds, sound => sound.name == name);
if (s == null) { if (s == null) {
@ -124,6 +132,7 @@ namespace SimpleTools.AudioManager {
/// <summary>Use this to unpause a sound with a specific name /// <summary>Use this to unpause a sound with a specific name
/// <para>It has to be in the Sound asset referenced in the AudioManager instance</para> /// <para>It has to be in the Sound asset referenced in the AudioManager instance</para>
/// </summary> /// </summary>
/// <param name="name" type="string">The name of the sound</param>
public void UnPause(string name) { public void UnPause(string name) {
Sounds.List s = Array.Find(soundList.sounds, sound => sound.name == name); Sounds.List s = Array.Find(soundList.sounds, sound => sound.name == name);
if (s == null) { if (s == null) {
@ -139,6 +148,7 @@ namespace SimpleTools.AudioManager {
/// <summary>Use this to stop a sound with a specific name /// <summary>Use this to stop a sound with a specific name
/// <para>It has to be in the Sound asset referenced in the AudioManager instance</para> /// <para>It has to be in the Sound asset referenced in the AudioManager instance</para>
/// </summary> /// </summary>
/// <param name="name" type="string">The name of the sound</param>
public void Stop(string name) { public void Stop(string name) {
Sounds.List s = Array.Find(soundList.sounds, sound => sound.name == name); Sounds.List s = Array.Find(soundList.sounds, sound => sound.name == name);
if (s == null) { if (s == null) {
@ -163,6 +173,8 @@ namespace SimpleTools.AudioManager {
/// <summary>This function returns the AudioSource that contains a specific sound /// <summary>This function returns the AudioSource that contains a specific sound
/// <para>It has to be in the Sound asset referenced in the AudioManager instance</para> /// <para>It has to be in the Sound asset referenced in the AudioManager instance</para>
/// </summary> /// </summary>
/// <param name="name">The name of the sound</param>
/// <returns>The AudioSource in the scene</returns>
public AudioSource GetSource(string name) { public AudioSource GetSource(string name) {
Sounds.List s = Array.Find(soundList.sounds, sound => sound.name == name); Sounds.List s = Array.Find(soundList.sounds, sound => sound.name == name);
if (s == null) { if (s == null) {
@ -175,6 +187,8 @@ namespace SimpleTools.AudioManager {
/// <summary>Use this to start playing a sound with a fade in /// <summary>Use this to start playing a sound with a fade in
/// <para>It has to be in the Sound asset referenced in the AudioManager instance</para> /// <para>It has to be in the Sound asset referenced in the AudioManager instance</para>
/// </summary> /// </summary>
/// <param name="name" type="string">The name of the sound</param>
/// <param name="duration" type="float">The duration of the fade in</param>
public void FadeIn(string name, float duration) { public void FadeIn(string name, float duration) {
StartCoroutine(FadeInCoroutine(name, duration)); StartCoroutine(FadeInCoroutine(name, duration));
} }
@ -195,6 +209,8 @@ namespace SimpleTools.AudioManager {
/// <summary>Use this to stop playing a sound with a fade out /// <summary>Use this to stop playing a sound with a fade out
/// <para>It has to be in the Sound asset referenced in the AudioManager instance</para> /// <para>It has to be in the Sound asset referenced in the AudioManager instance</para>
/// </summary> /// </summary>
/// <param name="name" type="string">The name of the sound</param>
/// <param name="duration" type="float">The duration of the fade out</param>
public void FadeOut(string name, float duration) { public void FadeOut(string name, float duration) {
StartCoroutine(FadeOutCoroutine(name, duration)); StartCoroutine(FadeOutCoroutine(name, duration));
} }
@ -217,6 +233,7 @@ namespace SimpleTools.AudioManager {
/// <summary>Use this to start playing a sound muted /// <summary>Use this to start playing a sound muted
/// <para>It has to be in the Sound asset referenced in the AudioManager instance</para> /// <para>It has to be in the Sound asset referenced in the AudioManager instance</para>
/// </summary> /// </summary>
/// <param name="name" type="string">The name of the sound</param>
public void PlayMuted(string name) { public void PlayMuted(string name) {
Sounds.List s = Array.Find(soundList.sounds, sound => sound.name == name); Sounds.List s = Array.Find(soundList.sounds, sound => sound.name == name);
if (s == null) { if (s == null) {
@ -231,6 +248,8 @@ namespace SimpleTools.AudioManager {
/// <para>It has to be in the Sound asset referenced in the AudioManager instance</para> /// <para>It has to be in the Sound asset referenced in the AudioManager instance</para>
/// <para>WARNING: If the PlayMuted hasn't been called before, this function won't work</para> /// <para>WARNING: If the PlayMuted hasn't been called before, this function won't work</para>
/// </summary> /// </summary>
/// <param name="name" type="string">The name of the sound</param>
/// <param name="duration">The duration of the fade in</param>
public void FadeMutedIn(string name, float duration) { public void FadeMutedIn(string name, float duration) {
StartCoroutine(FadeMutedInCoroutine(name, duration)); StartCoroutine(FadeMutedInCoroutine(name, duration));
} }
@ -250,6 +269,8 @@ namespace SimpleTools.AudioManager {
/// <summary>Use this to fade out a sound and keep playing that muted /// <summary>Use this to fade out a sound and keep playing that muted
/// <para>It has to be in the Sound asset referenced in the AudioManager instance</para> /// <para>It has to be in the Sound asset referenced in the AudioManager instance</para>
/// </summary> /// </summary>
/// <param name="name" type="string">The name of the sound</param>
/// <param name="duration">The duration of the fade out</param>
public void FadeMutedOut(string name, float duration) { public void FadeMutedOut(string name, float duration) {
StartCoroutine(FadeMutedOutCoroutine(name, duration)); StartCoroutine(FadeMutedOutCoroutine(name, duration));
} }

8
Tools/AutoSave.meta Normal file
View file

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 2f2d8faa0dc23b34f9f347dc08bd85be
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,124 @@
#if UNITY_EDITOR
using UnityEngine;
using UnityEditor;
using System;
using System.Threading;
using UnityEditor.SceneManagement;
using System.Threading.Tasks;
namespace SimpleTools.AutoSave {
public class AutoSaveConfig : EditorWindow {
[MenuItem("Simple Tools/Auto Save Configuration")]
public static void ShowWindow(){
EditorWindow w = GetWindow<AutoSaveConfig>("Auto-save Configuration");
w.position = new Rect(w.position.position, new Vector2(400, 150));
var data = EditorPrefs.GetString("AutoSave", JsonUtility.ToJson(w, false));
JsonUtility.FromJsonOverwrite(data, w);
}
[InitializeOnLoadMethod]
static void OnInitialize(){
int _index = EditorPrefs.GetInt("Index", 0);
bool _logging = EditorPrefs.GetBool("Logging", false);
ChangeAutoSaveMode(_index, _logging);
}
protected void OnEnable() {
OnInitialize();
}
protected void OnDisable() {
var data = JsonUtility.ToJson(this, false);
EditorPrefs.SetString("AutoSave", data);
EditorPrefs.SetInt("Index", index);
EditorPrefs.SetBool("Logging", logging);
}
readonly static string[] options = new string[] { "Disabled", "On Play", "1 Minute", "10 Minutes", "1 Hour" };
public static int index;
public static bool enabled;
public static bool logging;
void OnGUI() {
GUILayout.Label("Select auto-save mode:", EditorStyles.boldLabel);
int i = EditorGUILayout.Popup(index, options);
if (i != index) ChangeAutoSaveMode(i, logging);
GUILayout.Label("Log a message every time a the scene gets saved.");
if (logging) {
if (GUILayout.Button("Disable Logging")){
logging ^= true;
ChangeAutoSaveMode(i, logging);
}
} else {
if (GUILayout.Button("Enable Logging")) {
logging ^= true;
ChangeAutoSaveMode(i, logging);
}
}
}
static CancellationTokenSource _tokenSource;
static Task _task;
static int frequency;
static void ChangeAutoSaveMode(int mode, bool log){
index = mode;
logging = log;
CancelTask();
enabled = true;
EditorApplication.playModeStateChanged -= AutoSaveWhenPlayModeStarts;
switch(index){
case 0:
enabled = false;
return;
case 1:
EditorApplication.playModeStateChanged += AutoSaveWhenPlayModeStarts;
return;
case 2:
frequency = 1 * 60 * 1000;
break;
case 3:
frequency = 10 * 60 * 1000;
break;
case 4:
frequency = 60 * 60 * 1000;
break;
}
_tokenSource = new CancellationTokenSource();
_task = SaveInterval(_tokenSource.Token);
}
static void AutoSaveWhenPlayModeStarts(PlayModeStateChange state){
if(state == PlayModeStateChange.ExitingEditMode){
EditorSceneManager.SaveOpenScenes();
AssetDatabase.SaveAssets();
if (logging) Debug.Log($"Auto-saved at {DateTime.Now:h:mm:ss tt}");
}
}
static void CancelTask() {
if (_task == null) return;
_tokenSource.Cancel();
}
static async Task SaveInterval(CancellationToken token) {
while (!token.IsCancellationRequested) {
await Task.Delay(frequency, token);
if (token.IsCancellationRequested) break;
if (!enabled || Application.isPlaying || BuildPipeline.isBuildingPlayer || EditorApplication.isCompiling) return;
if (!UnityEditorInternal.InternalEditorUtility.isApplicationActive) return;
EditorSceneManager.SaveOpenScenes();
AssetDatabase.SaveAssets();
if (logging) Debug.Log($"Auto-saved at {DateTime.Now:h:mm:ss tt}");
}
}
}
}
#endif

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: e3f4095259fcc1f45991636604af9829
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -5,6 +5,7 @@ namespace SimpleTools.Cinemachine {
public class CMCameraTrigger : MonoBehaviour { public class CMCameraTrigger : MonoBehaviour {
CinemachineVirtualCamera vcam; CinemachineVirtualCamera vcam;
[SerializeField, Tooltip("Name of the collider's tag that will trigger the camera.")] string triggerTagName;
void Awake() { void Awake() {
vcam = GetComponentInChildren<CinemachineVirtualCamera>(true); vcam = GetComponentInChildren<CinemachineVirtualCamera>(true);
@ -13,12 +14,12 @@ namespace SimpleTools.Cinemachine {
#region 3D #region 3D
void OnTriggerEnter(Collider col) { void OnTriggerEnter(Collider col) {
if (col.CompareTag("Player")) { if (col.CompareTag(triggerTagName)) {
vcam.gameObject.SetActive(true); vcam.gameObject.SetActive(true);
} }
} }
void OnTriggerExit(Collider col) { void OnTriggerExit(Collider col) {
if (col.CompareTag("Player")) { if (col.CompareTag(triggerTagName)) {
vcam.gameObject.SetActive(true); vcam.gameObject.SetActive(true);
} }
} }
@ -26,12 +27,12 @@ namespace SimpleTools.Cinemachine {
#region 2D #region 2D
void OnTriggerEnter2D(Collider2D col) { void OnTriggerEnter2D(Collider2D col) {
if (col.CompareTag("Player")) { if (col.CompareTag(triggerTagName)) {
vcam.gameObject.SetActive(true); vcam.gameObject.SetActive(true);
} }
} }
void OnTriggerExit2D(Collider2D col) { void OnTriggerExit2D(Collider2D col) {
if (col.CompareTag("Player")) { if (col.CompareTag(triggerTagName)) {
vcam.gameObject.SetActive(false); vcam.gameObject.SetActive(false);
} }
} }

View file

@ -14,7 +14,7 @@ namespace SimpleTools.DialogueSystem {
Queue<Sprite> characterImages; Queue<Sprite> characterImages;
bool talking; bool talking;
public DialogueItems dialogueItems; public DialogueManagerItems dialogueItems;
public static DialogueManager instance; public static DialogueManager instance;
void Awake() { void Awake() {
@ -27,10 +27,21 @@ namespace SimpleTools.DialogueSystem {
dialogueVertexAnimator = new DialogueVertexAnimator(dialogueItems.textBox); dialogueVertexAnimator = new DialogueVertexAnimator(dialogueItems.textBox);
} }
/// <summary>
/// This is the main function to call to start a dialogue.
/// </summary>
/// <param name="dialogue">The dialogue to start.</param>
/// <returns>A bool that is false if the dialogue has finished and true if it hasn't.</returns>
public bool Dialogue(Dialogue dialogue) { public bool Dialogue(Dialogue dialogue) {
return Dialogue(dialogue, string.Empty); return Dialogue(dialogue, string.Empty);
} }
/// <summary>
/// This is the main function to call to start a dialogue.
/// </summary>
/// <param name="dialogue">The dialogue to start.</param>
/// <param name="sounds">The sounds from the AudioManager that will be played on character reveal.</param>
/// <returns>A bool that is false if the dialogue has finished and true if it hasn't.</returns>
public bool Dialogue(Dialogue dialogue, params string[] sounds) { public bool Dialogue(Dialogue dialogue, params string[] sounds) {
dialogueVertexAnimator.SetAudioSourceGroup(sounds); dialogueVertexAnimator.SetAudioSourceGroup(sounds);
@ -49,6 +60,8 @@ namespace SimpleTools.DialogueSystem {
talking = true; talking = true;
if (sentences.Count == 0) { if (sentences.Count == 0) {
if (dialogueVertexAnimator.IsMessageAnimating())
return true;
talking = false; talking = false;
return false; return false;
} }
@ -66,6 +79,8 @@ namespace SimpleTools.DialogueSystem {
return true; return true;
} else { } else {
if (sentences.Count == 0) { if (sentences.Count == 0) {
if (dialogueVertexAnimator.IsMessageAnimating())
return true;
talking = false; talking = false;
return false; return false;
} }
@ -102,7 +117,7 @@ namespace SimpleTools.DialogueSystem {
} }
[System.Serializable] [System.Serializable]
public struct DialogueItems { public struct DialogueManagerItems {
public Image characterImage; public Image characterImage;
public TMP_Text characterName; public TMP_Text characterName;
public TMP_Text textBox; public TMP_Text textBox;

View file

@ -11,6 +11,12 @@ namespace SimpleTools.DialogueSystem {
const string REMAINDER_REGEX = "(.*?((?=>)|(/|$)))"; const string REMAINDER_REGEX = "(.*?((?=>)|(/|$)))";
const string PAUSE_REGEX_STRING = "<p:(?<pause>" + REMAINDER_REGEX + ")>"; const string PAUSE_REGEX_STRING = "<p:(?<pause>" + REMAINDER_REGEX + ")>";
static readonly Regex pauseRegex = new Regex(PAUSE_REGEX_STRING); static readonly Regex pauseRegex = new Regex(PAUSE_REGEX_STRING);
const string SOUND_REGEX_STRING = "<snd:(?<sound>" + REMAINDER_REGEX + ")>";
static readonly Regex soundRegex = new Regex(SOUND_REGEX_STRING);
const string PLAYMUSIC_REGEX_STRING = "<playmsc:(?<playmusic>" + REMAINDER_REGEX + ")>";
static readonly Regex playMusicRegex = new Regex(PLAYMUSIC_REGEX_STRING);
const string STOPMUSIC_REGEX_STRING = "<stopmsc:(?<stopmusic>" + REMAINDER_REGEX + ")>";
static readonly Regex stopMusicRegex = new Regex(STOPMUSIC_REGEX_STRING);
const string SPEED_REGEX_STRING = "<sp:(?<speed>" + REMAINDER_REGEX + ")>"; const string SPEED_REGEX_STRING = "<sp:(?<speed>" + REMAINDER_REGEX + ")>";
static readonly Regex speedRegex = new Regex(SPEED_REGEX_STRING); static readonly Regex speedRegex = new Regex(SPEED_REGEX_STRING);
const string ANIM_START_REGEX_STRING = "<anim:(?<anim>" + REMAINDER_REGEX + ")>"; const string ANIM_START_REGEX_STRING = "<anim:(?<anim>" + REMAINDER_REGEX + ")>";
@ -31,6 +37,9 @@ namespace SimpleTools.DialogueSystem {
processedMessage = message; processedMessage = message;
processedMessage = HandlePauseTags(processedMessage, result); processedMessage = HandlePauseTags(processedMessage, result);
processedMessage = HandleSoundTags(processedMessage, result);
processedMessage = HandlePlayMusicTags(processedMessage, result);
processedMessage = HandleStopMusicTags(processedMessage, result);
processedMessage = HandleSpeedTags(processedMessage, result); processedMessage = HandleSpeedTags(processedMessage, result);
processedMessage = HandleAnimStartTags(processedMessage, result); processedMessage = HandleAnimStartTags(processedMessage, result);
processedMessage = HandleAnimEndTags(processedMessage, result); processedMessage = HandleAnimEndTags(processedMessage, result);
@ -96,6 +105,48 @@ namespace SimpleTools.DialogueSystem {
processedMessage = Regex.Replace(processedMessage, PAUSE_REGEX_STRING, ""); processedMessage = Regex.Replace(processedMessage, PAUSE_REGEX_STRING, "");
return processedMessage; return processedMessage;
} }
static string HandleSoundTags(string processedMessage, List<DialogueCommand> result) {
MatchCollection soundMatches = soundRegex.Matches(processedMessage);
foreach (Match match in soundMatches) {
string val = match.Groups["sound"].Value;
string soundName = val;
result.Add(new DialogueCommand {
position = VisibleCharactersUpToIndex(processedMessage, match.Index),
type = DialogueCommandType.Sound,
stringValue = soundName
});
}
processedMessage = Regex.Replace(processedMessage, SOUND_REGEX_STRING, "");
return processedMessage;
}
static string HandlePlayMusicTags(string processedMessage, List<DialogueCommand> result) {
MatchCollection playMatches = playMusicRegex.Matches(processedMessage);
foreach (Match match in playMatches) {
string val = match.Groups["playmusic"].Value;
string functionName = val;
result.Add(new DialogueCommand {
position = VisibleCharactersUpToIndex(processedMessage, match.Index),
type = DialogueCommandType.PlayMusic,
stringValue = functionName
});
}
processedMessage = Regex.Replace(processedMessage, PLAYMUSIC_REGEX_STRING, "");
return processedMessage;
}
static string HandleStopMusicTags(string processedMessage, List<DialogueCommand> result) {
MatchCollection stopMatches = stopMusicRegex.Matches(processedMessage);
foreach (Match match in stopMatches) {
string val = match.Groups["stopmusic"].Value;
string functionName = val;
result.Add(new DialogueCommand {
position = VisibleCharactersUpToIndex(processedMessage, match.Index),
type = DialogueCommandType.StopMusic,
stringValue = functionName
});
}
processedMessage = Regex.Replace(processedMessage, STOPMUSIC_REGEX_STRING, "");
return processedMessage;
}
static TextAnimationType GetTextAnimationType(string stringVal) { static TextAnimationType GetTextAnimationType(string stringVal) {
TextAnimationType result; TextAnimationType result;
@ -139,7 +190,10 @@ namespace SimpleTools.DialogueSystem {
Pause, Pause,
TextSpeedChange, TextSpeedChange,
AnimStart, AnimStart,
AnimEnd AnimEnd,
Sound,
PlayMusic,
StopMusic
} }
public enum TextAnimationType { public enum TextAnimationType {

View file

@ -1,6 +1,7 @@
using System; using System;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Globalization;
using TMPro; using TMPro;
using UnityEngine; using UnityEngine;
@ -134,6 +135,20 @@ namespace SimpleTools.DialogueSystem {
case DialogueCommandType.TextSpeedChange: case DialogueCommandType.TextSpeedChange:
secondsPerCharacter = 1f / command.floatValue; secondsPerCharacter = 1f / command.floatValue;
break; break;
case DialogueCommandType.Sound:
AudioManager.AudioManager.instance.PlayOneShot(command.stringValue);
break;
case DialogueCommandType.PlayMusic:
string[] split0 = command.stringValue.Split(',');
AudioManager.AudioManager.instance.FadeIn(split0[0], float.Parse(split0[1], CultureInfo.InvariantCulture));
break;
case DialogueCommandType.StopMusic:
string[] split1 = command.stringValue.Split(',');
for (int j = 0; j < split1.Length; j++) {
Debug.Log(split1[j]);
}
AudioManager.AudioManager.instance.FadeOut(split1[0], float.Parse(split1[1], CultureInfo.InvariantCulture));
break;
} }
commands.RemoveAt(i); commands.RemoveAt(i);
i--; i--;
@ -191,7 +206,7 @@ namespace SimpleTools.DialogueSystem {
TextAnimInfo info = textAnimInfo[i]; TextAnimInfo info = textAnimInfo[i];
if (charIndex >= info.startIndex && charIndex < info.endIndex) { if (charIndex >= info.startIndex && charIndex < info.endIndex) {
if (info.type == TextAnimationType.rainbow) { if (info.type == TextAnimationType.rainbow) {
color = Color.HSVToRGB(Mathf.Repeat((time + destinationVertice.x * RAINBOW_LENGTH_ADJUSTMENT), 1f), .6f, 1); color = Color.HSVToRGB(Mathf.Repeat((time + destinationVertice.x * RAINBOW_LENGTH_ADJUSTMENT), 1f), .75f, 1);
} }
} }
} }

View file

@ -1,6 +1,6 @@
{ {
"name": "com.geri.simpletools", "name": "com.geri.simpletools",
"version": "1.2.1", "version": "1.3.0",
"displayName": "Simple Tools", "displayName": "Simple Tools",
"description": "This package contains simple tools to use in your project.", "description": "This package contains simple tools to use in your project.",
"unity": "2018.4", "unity": "2018.4",