201 changed files with 17687 additions and 399 deletions
@ -0,0 +1,6 @@ |
|||||
|
{ |
||||
|
"version": "1.0", |
||||
|
"components": [ |
||||
|
"Microsoft.VisualStudio.Workload.ManagedGame" |
||||
|
] |
||||
|
} |
||||
@ -0,0 +1,8 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: 344d15cb1e8bb3d4f938bacdd1ca85b9 |
||||
|
folderAsset: yes |
||||
|
DefaultImporter: |
||||
|
externalObjects: {} |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
@ -0,0 +1,7 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: 146af9f28785df94e96dd4051f3c1f0e |
||||
|
DefaultImporter: |
||||
|
externalObjects: {} |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
@ -0,0 +1,7 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: 63abef4a9c33fec46880ba4a9d4a2499 |
||||
|
DefaultImporter: |
||||
|
externalObjects: {} |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
@ -0,0 +1,8 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: a1729eb01237c4b439d1cfdb21359820 |
||||
|
folderAsset: yes |
||||
|
DefaultImporter: |
||||
|
externalObjects: {} |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
@ -0,0 +1,8 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: 4ba1065a189eb434d8b09b7a55fda5b4 |
||||
|
folderAsset: yes |
||||
|
DefaultImporter: |
||||
|
externalObjects: {} |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
@ -0,0 +1,123 @@ |
|||||
|
using DG.Tweening; |
||||
|
using System; |
||||
|
using System.Collections; |
||||
|
using UnityEngine; |
||||
|
using Core.Settings; |
||||
|
using Core.Ads.BridgeInterfaces; |
||||
|
|
||||
|
namespace Core.Ads |
||||
|
{ |
||||
|
public class AdsManager |
||||
|
{ |
||||
|
private static GameObject _holder = null; |
||||
|
|
||||
|
public static void Init() |
||||
|
{ |
||||
|
_holder = new GameObject("[AdsManager]"); |
||||
|
|
||||
|
GameObject.DontDestroyOnLoad(_holder); |
||||
|
|
||||
|
if (CoreSettings.data.needInterstitial) |
||||
|
{ |
||||
|
_interstitial = GameObject.Instantiate(Resources.Load<GameObject>("Ads/[Interstitial]"), _holder.transform).GetComponent<IInterstitialBridge>(); |
||||
|
_interstitial.OnEnded += () => OnInterstitialShowed?.Invoke(); |
||||
|
} |
||||
|
|
||||
|
if (CoreSettings.data.needBanner) |
||||
|
_banner = GameObject.Instantiate(Resources.Load<GameObject>("Ads/[Banner]"), _holder.transform).GetComponent<IBannerBridge>(); |
||||
|
|
||||
|
if (CoreSettings.data.needRewarded) |
||||
|
_rewarded = GameObject.Instantiate(Resources.Load<GameObject>("Ads/[Rewarded]"), _holder.transform).GetComponent<IRewardedBridge>(); |
||||
|
} |
||||
|
|
||||
|
private static IInterstitialBridge _interstitial = null; |
||||
|
private static IRewardedBridge _rewarded = null; |
||||
|
private static IBannerBridge _banner = null; |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Interstitial
|
||||
|
/// </summary>
|
||||
|
///
|
||||
|
public static event Action OnInterstitialShowed = null; |
||||
|
|
||||
|
public static bool IsInterstitialReady() |
||||
|
{ |
||||
|
if (CoreSettings.data.needInterstitial) |
||||
|
return _interstitial.IsReady(); |
||||
|
else |
||||
|
Debug.LogError("AdsManager: Interstitial ads is disabled"); |
||||
|
|
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
public static bool IsInterstitialVisible() |
||||
|
{ |
||||
|
if (CoreSettings.data.needInterstitial) |
||||
|
return _interstitial.IsVisible(); |
||||
|
else |
||||
|
Debug.LogError("AdsManager: Interstitial ads is disabled"); |
||||
|
|
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
public static void ShowInterstitial() |
||||
|
{ |
||||
|
if (CoreSettings.data.needInterstitial) |
||||
|
_interstitial.Show(); |
||||
|
else |
||||
|
Debug.LogError("AdsManager: Interstitial ads is disabled"); |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Rewarded
|
||||
|
/// </summary>
|
||||
|
///
|
||||
|
public static bool IsRewardedReady() |
||||
|
{ |
||||
|
if (CoreSettings.data.needRewarded) |
||||
|
_rewarded.IsReady(); |
||||
|
else |
||||
|
Debug.LogError("AdsManager: Rewarded ads is disabled"); |
||||
|
|
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
public static void ShowRewarded(Action onSucces, Action onFailed) |
||||
|
{ |
||||
|
if (CoreSettings.data.needRewarded) |
||||
|
_rewarded.Show(onSucces, onFailed); |
||||
|
else |
||||
|
Debug.LogError("AdsManager: Rewarded ads is disabled"); |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Banner
|
||||
|
/// </summary>
|
||||
|
///
|
||||
|
public static bool IsBannerVisible() |
||||
|
{ |
||||
|
if (CoreSettings.data.needBanner) |
||||
|
_banner.IsVisible(); |
||||
|
else |
||||
|
Debug.LogError("AdsManager: Banner ads is disabled"); |
||||
|
|
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
public static void ShowBanner(BannerPositions position) |
||||
|
{ |
||||
|
if (CoreSettings.data.needBanner) |
||||
|
_banner.Show(position); |
||||
|
else |
||||
|
Debug.LogError("AdsManager: Banner ads is disabled"); |
||||
|
} |
||||
|
|
||||
|
public static void HideBanner() |
||||
|
{ |
||||
|
if (CoreSettings.data.needBanner) |
||||
|
_banner.Hide(); |
||||
|
else |
||||
|
Debug.LogError("AdsManager: Banner ads is disabled"); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,11 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: ebc044ffb918ac04abbc22d23b54110d |
||||
|
MonoImporter: |
||||
|
externalObjects: {} |
||||
|
serializedVersion: 2 |
||||
|
defaultReferences: [] |
||||
|
executionOrder: 0 |
||||
|
icon: {instanceID: 0} |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
@ -0,0 +1,13 @@ |
|||||
|
namespace Core.Ads |
||||
|
{ |
||||
|
public enum BannerPositions |
||||
|
{ |
||||
|
None = -1, |
||||
|
TopLeft = 0, |
||||
|
TopCenter = 1, |
||||
|
TopRight = 2, |
||||
|
BottomLeft = 3, |
||||
|
BottomCenter = 4, |
||||
|
BottomRight = 5, |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,11 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: 2e28a4d499fcd1e4a8c7646f8c952a6a |
||||
|
MonoImporter: |
||||
|
externalObjects: {} |
||||
|
serializedVersion: 2 |
||||
|
defaultReferences: [] |
||||
|
executionOrder: 0 |
||||
|
icon: {instanceID: 0} |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
@ -0,0 +1,8 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: 99d32c2f7a54c5b40a447ec0d984cfb4 |
||||
|
folderAsset: yes |
||||
|
DefaultImporter: |
||||
|
externalObjects: {} |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
@ -0,0 +1,11 @@ |
|||||
|
using UnityEngine; |
||||
|
|
||||
|
namespace Core.Ads.BridgeInterfaces |
||||
|
{ |
||||
|
public interface IBannerBridge |
||||
|
{ |
||||
|
void Show(BannerPositions position); |
||||
|
void Hide(); |
||||
|
bool IsVisible(); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,11 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: de562e46c37025145b6ec7b7b26d41d5 |
||||
|
MonoImporter: |
||||
|
externalObjects: {} |
||||
|
serializedVersion: 2 |
||||
|
defaultReferences: [] |
||||
|
executionOrder: 0 |
||||
|
icon: {instanceID: 0} |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
@ -0,0 +1,13 @@ |
|||||
|
using System; |
||||
|
using UnityEngine; |
||||
|
|
||||
|
namespace Core.Ads.BridgeInterfaces |
||||
|
{ |
||||
|
public interface IInterstitialBridge |
||||
|
{ |
||||
|
Action OnEnded { get; set; } |
||||
|
bool IsReady(); |
||||
|
void Show(); |
||||
|
bool IsVisible(); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,11 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: eaa9bf69f41d0244b8c36086568630e0 |
||||
|
MonoImporter: |
||||
|
externalObjects: {} |
||||
|
serializedVersion: 2 |
||||
|
defaultReferences: [] |
||||
|
executionOrder: 0 |
||||
|
icon: {instanceID: 0} |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
@ -0,0 +1,11 @@ |
|||||
|
using System; |
||||
|
using UnityEngine; |
||||
|
|
||||
|
namespace Core.Ads.BridgeInterfaces |
||||
|
{ |
||||
|
public interface IRewardedBridge |
||||
|
{ |
||||
|
bool IsReady(); |
||||
|
void Show(Action onSucces, Action onFailed); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,11 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: a97196986656edd419f16bd8a1e9a698 |
||||
|
MonoImporter: |
||||
|
externalObjects: {} |
||||
|
serializedVersion: 2 |
||||
|
defaultReferences: [] |
||||
|
executionOrder: 0 |
||||
|
icon: {instanceID: 0} |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
@ -0,0 +1,8 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: f70e498000590fd46a6dc564a8e78fc2 |
||||
|
folderAsset: yes |
||||
|
DefaultImporter: |
||||
|
externalObjects: {} |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
@ -0,0 +1,8 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: 78f247ce8241a0647bc76dc7fa3979be |
||||
|
folderAsset: yes |
||||
|
DefaultImporter: |
||||
|
externalObjects: {} |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
@ -0,0 +1,44 @@ |
|||||
|
using Core.Ads.BridgeInterfaces; |
||||
|
using System.Linq; |
||||
|
using UnityEngine; |
||||
|
using UnityEngine.UI; |
||||
|
|
||||
|
namespace Core.Ads.Bridges.DemoAds |
||||
|
{ |
||||
|
public class DemoBannerAds : MonoBehaviour, IBannerBridge |
||||
|
{ |
||||
|
[SerializeField] private CanvasScaler _canvasScaler = null; |
||||
|
[SerializeField] private RectTransform[] _banners = new RectTransform[0]; |
||||
|
|
||||
|
public void Show(BannerPositions position) |
||||
|
{ |
||||
|
if (position == BannerPositions.None) |
||||
|
return; |
||||
|
|
||||
|
Hide(); |
||||
|
|
||||
|
_banners[(int)position].sizeDelta = CalculateCanvasBannerSize(); |
||||
|
_banners[(int)position].gameObject.SetActive(true); |
||||
|
} |
||||
|
|
||||
|
public void Hide() |
||||
|
{ |
||||
|
for (int i = 0; i < _banners.Length; i++) |
||||
|
_banners[i].gameObject.SetActive(false); |
||||
|
} |
||||
|
|
||||
|
public bool IsVisible() |
||||
|
{ |
||||
|
return _banners.Where(b => b.gameObject.activeSelf).Count() > 0; |
||||
|
} |
||||
|
|
||||
|
private Vector2 CalculateCanvasBannerSize() |
||||
|
{ |
||||
|
float bannerSizePixels = Screen.height <= 400 ? 32 : Screen.height < 720 ? 50 : 90; |
||||
|
var percent = (100f / Screen.height) * bannerSizePixels; |
||||
|
var bannerSize = _canvasScaler.referenceResolution.y * (percent / 100f); |
||||
|
|
||||
|
return new Vector2(bannerSize * 6.4f, bannerSize); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,11 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: 56a352b0726e3c04b8a452a12f1d08e8 |
||||
|
MonoImporter: |
||||
|
externalObjects: {} |
||||
|
serializedVersion: 2 |
||||
|
defaultReferences: [] |
||||
|
executionOrder: 0 |
||||
|
icon: {instanceID: 0} |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
@ -0,0 +1,61 @@ |
|||||
|
using Core.Ads.BridgeInterfaces; |
||||
|
using Core.Settings; |
||||
|
using System; |
||||
|
using System.Collections; |
||||
|
using UnityEngine; |
||||
|
|
||||
|
namespace Core.Ads.Bridges.DemoAds |
||||
|
{ |
||||
|
public class DemoInterstitialAds : MonoBehaviour, IInterstitialBridge |
||||
|
{ |
||||
|
[SerializeField] private GameObject _body = null; |
||||
|
|
||||
|
public Action OnEnded { get; set; } |
||||
|
|
||||
|
private static bool _isInterstitialReady = false; |
||||
|
|
||||
|
private void Awake() |
||||
|
{ |
||||
|
StartCoroutine(InterstitialTimer()); |
||||
|
} |
||||
|
|
||||
|
public bool IsReady() |
||||
|
{ |
||||
|
return _isInterstitialReady; |
||||
|
} |
||||
|
|
||||
|
public void Show() |
||||
|
{ |
||||
|
if (IsReady()) |
||||
|
{ |
||||
|
_body.SetActive(true); |
||||
|
StartCoroutine(InterstitialTimer()); |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
Debug.LogError("AdsManager: Interstitial ads is not ready"); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public bool IsVisible() |
||||
|
{ |
||||
|
return _body.activeSelf; |
||||
|
} |
||||
|
|
||||
|
public void CloseInterstitial() |
||||
|
{ |
||||
|
_body.SetActive(false); |
||||
|
OnEnded?.Invoke(); |
||||
|
} |
||||
|
|
||||
|
private IEnumerator InterstitialTimer() |
||||
|
{ |
||||
|
_isInterstitialReady = false; |
||||
|
|
||||
|
yield return new WaitForSeconds(CoreSettings.data.interstitialInterval); |
||||
|
|
||||
|
_isInterstitialReady = true; |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,11 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: c873a6dc7007f2245873024667ba02ef |
||||
|
MonoImporter: |
||||
|
externalObjects: {} |
||||
|
serializedVersion: 2 |
||||
|
defaultReferences: [] |
||||
|
executionOrder: 0 |
||||
|
icon: {instanceID: 0} |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
@ -0,0 +1,38 @@ |
|||||
|
using Core.Ads.BridgeInterfaces; |
||||
|
using System; |
||||
|
using UnityEngine; |
||||
|
|
||||
|
namespace Core.Ads.Bridges.DemoAds |
||||
|
{ |
||||
|
public class DemoRewardedAds : MonoBehaviour, IRewardedBridge |
||||
|
{ |
||||
|
[SerializeField] private GameObject _body = null; |
||||
|
|
||||
|
private Action onSucces = null; |
||||
|
private Action onFailed = null; |
||||
|
|
||||
|
public bool IsReady() |
||||
|
{ |
||||
|
return true; |
||||
|
} |
||||
|
|
||||
|
public void Show(Action onSucces, Action onFailed) |
||||
|
{ |
||||
|
this.onSucces = onSucces; |
||||
|
this.onFailed = onFailed; |
||||
|
_body.SetActive(true); |
||||
|
} |
||||
|
|
||||
|
public void OnSuccesClick() |
||||
|
{ |
||||
|
_body.SetActive(false); |
||||
|
onSucces?.Invoke(); |
||||
|
} |
||||
|
|
||||
|
public void OnFailedClick() |
||||
|
{ |
||||
|
_body.SetActive(false); |
||||
|
onFailed?.Invoke(); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,11 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: 474311b49c69091468bfed033f2e2f9f |
||||
|
MonoImporter: |
||||
|
externalObjects: {} |
||||
|
serializedVersion: 2 |
||||
|
defaultReferences: [] |
||||
|
executionOrder: 0 |
||||
|
icon: {instanceID: 0} |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
@ -0,0 +1,8 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: 5b843a837c8f9494984d386f480ac955 |
||||
|
folderAsset: yes |
||||
|
DefaultImporter: |
||||
|
externalObjects: {} |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
@ -0,0 +1,201 @@ |
|||||
|
using Localization; |
||||
|
using System.Collections; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Linq; |
||||
|
using UnityEngine; |
||||
|
using Core.Settings; |
||||
|
|
||||
|
public static class AudioController |
||||
|
{ |
||||
|
public static void Init() |
||||
|
{ |
||||
|
GameObject audioParent = new GameObject("[AudioController]"); |
||||
|
|
||||
|
GameObject.DontDestroyOnLoad(audioParent); |
||||
|
|
||||
|
_musicParent = new GameObject("[Music]"); |
||||
|
_musicParent.transform.parent = audioParent.transform; |
||||
|
|
||||
|
_soundsParent = new GameObject("[Sounds]"); |
||||
|
_soundsParent.transform.parent = audioParent.transform; |
||||
|
|
||||
|
_voicesParent = new GameObject("[Voices]"); |
||||
|
_voicesParent.transform.parent = audioParent.transform; |
||||
|
|
||||
|
AudioClip[] musicAnsSounds = Resources.LoadAll<AudioClip>("CoreAudio/MusicAndSounds"); |
||||
|
|
||||
|
for (int i = 0; i < musicAnsSounds.Length; i++) |
||||
|
{ |
||||
|
_musicAndSounds.Add(musicAnsSounds[i].name, musicAnsSounds[i]); |
||||
|
} |
||||
|
|
||||
|
for (int l = 0; l < CoreSettings.data.availableLanguages.Count; l++) |
||||
|
{ |
||||
|
SystemLanguage language = CoreSettings.data.availableLanguages[l]; |
||||
|
|
||||
|
Dictionary<string, AudioClip> voicesDictionary = new Dictionary<string, AudioClip>(); |
||||
|
|
||||
|
AudioClip[] voices = Resources.LoadAll<AudioClip>("CoreAudio/Voices/" + language.ToString()); |
||||
|
|
||||
|
for (int i = 0; i < voices.Length; i++) |
||||
|
voicesDictionary.Add(voices[i].name, voices[i]); |
||||
|
|
||||
|
_voicesDictionary.Add(language, voicesDictionary); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
private static GameObject _musicParent = null; |
||||
|
private static GameObject _soundsParent = null; |
||||
|
private static GameObject _voicesParent = null; |
||||
|
|
||||
|
private static AudioSource _musicSource = null; |
||||
|
private static List<AudioSource> _soundsSources = new List<AudioSource>(); |
||||
|
private static List<AudioSource> _voicesSources = new List<AudioSource>(); |
||||
|
|
||||
|
private static Dictionary<string, AudioClip> _musicAndSounds = new Dictionary<string, AudioClip>(); |
||||
|
private static Dictionary<SystemLanguage, Dictionary<string, AudioClip>> _voicesDictionary = new Dictionary<SystemLanguage, Dictionary<string, AudioClip>>(); |
||||
|
|
||||
|
public static float MusicVolume |
||||
|
{ |
||||
|
get => PlayerPrefs.GetFloat("MusicVolume", 1f); |
||||
|
set |
||||
|
{ |
||||
|
PlayerPrefs.SetFloat("MusicVolume", value); |
||||
|
_musicSource.volume = CoreSettings.data.musicVolume * value; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public static float SoundsVolume |
||||
|
{ |
||||
|
get => PlayerPrefs.GetFloat("MusicVolume", 1f); |
||||
|
set |
||||
|
{ |
||||
|
PlayerPrefs.SetFloat("MusicVolume", value); |
||||
|
|
||||
|
for (int i = 0; i < _soundsSources.Count; i++) |
||||
|
_soundsSources[i].volume = CoreSettings.data.soundsVolume * value; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public static float VoicesVolume |
||||
|
{ |
||||
|
get => PlayerPrefs.GetFloat("MusicVolume", 1f); |
||||
|
set |
||||
|
{ |
||||
|
PlayerPrefs.SetFloat("MusicVolume", value); |
||||
|
|
||||
|
for (int i = 0; i < _voicesSources.Count; i++) |
||||
|
_voicesSources[i].volume = CoreSettings.data.voicesVolume * value; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public static float PlayMusic(string name) |
||||
|
{ |
||||
|
if (_musicSource == null) |
||||
|
{ |
||||
|
_musicSource = _musicParent.AddComponent<AudioSource>(); |
||||
|
_musicSource.loop = true; |
||||
|
_musicSource.playOnAwake = false; |
||||
|
_musicSource.volume = CoreSettings.data.musicVolume * MusicVolume; |
||||
|
} |
||||
|
|
||||
|
if (_musicAndSounds.ContainsKey(name)) |
||||
|
{ |
||||
|
_musicSource.clip = _musicAndSounds[name]; |
||||
|
_musicSource.Play(); |
||||
|
|
||||
|
return _musicAndSounds[name].length; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
Debug.LogError($"AudioController: music \"{name}\" not found"); |
||||
|
return 0f; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public static void StopMusic() |
||||
|
{ |
||||
|
_musicSource.Stop(); |
||||
|
} |
||||
|
|
||||
|
public static float PlaySound(string name, bool isLoop = false) |
||||
|
{ |
||||
|
AudioSource playSource = _soundsSources.Where(s => !s.isPlaying).FirstOrDefault(); |
||||
|
|
||||
|
if (playSource == null) |
||||
|
{ |
||||
|
playSource = _soundsParent.AddComponent<AudioSource>(); |
||||
|
playSource.loop = false; |
||||
|
playSource.playOnAwake = false; |
||||
|
playSource.volume = CoreSettings.data.soundsVolume * SoundsVolume; |
||||
|
|
||||
|
_soundsSources.Add(playSource); |
||||
|
} |
||||
|
|
||||
|
if (_musicAndSounds.ContainsKey(name)) |
||||
|
{ |
||||
|
playSource.clip = _musicAndSounds[name]; |
||||
|
playSource.loop = isLoop; |
||||
|
playSource.Play(); |
||||
|
|
||||
|
return _musicAndSounds[name].length; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
Debug.LogError($"AudioController: sound \"{name}\" not found"); |
||||
|
return 0f; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public static void StopSound(string name) |
||||
|
{ |
||||
|
AudioSource playSource = _soundsSources.Where(s => s.clip.name == name).FirstOrDefault(); |
||||
|
|
||||
|
if (playSource != null) |
||||
|
playSource.Stop(); |
||||
|
} |
||||
|
|
||||
|
public static float PlayVoice(string name) |
||||
|
{ |
||||
|
AudioSource playSource = _voicesSources.Where(s => !s.isPlaying).FirstOrDefault(); |
||||
|
|
||||
|
if (playSource == null) |
||||
|
{ |
||||
|
playSource = _voicesParent.AddComponent<AudioSource>(); |
||||
|
playSource.loop = false; |
||||
|
playSource.playOnAwake = false; |
||||
|
playSource.volume = CoreSettings.data.voicesVolume * VoicesVolume; |
||||
|
|
||||
|
_voicesSources.Add(playSource); |
||||
|
} |
||||
|
|
||||
|
if (_voicesDictionary.ContainsKey(LocalizationManager.CurrentLanguage)) |
||||
|
{ |
||||
|
if (_voicesDictionary[LocalizationManager.CurrentLanguage].ContainsKey(name)) |
||||
|
{ |
||||
|
playSource.clip = _voicesDictionary[LocalizationManager.CurrentLanguage][name]; |
||||
|
playSource.Play(); |
||||
|
|
||||
|
return _voicesDictionary[LocalizationManager.CurrentLanguage][name].length; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
Debug.LogError($"AudioController: voice \"{name}\" not found"); |
||||
|
return 0f; |
||||
|
} |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
Debug.LogError($"AudioController: voice \"{name}\" not found"); |
||||
|
return 0f; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public static void StopVoice(string name) |
||||
|
{ |
||||
|
AudioSource playSource = _voicesSources.Where(s => s.clip.name == name).FirstOrDefault(); |
||||
|
|
||||
|
if (playSource != null) |
||||
|
playSource.Stop(); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,11 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: 69b1385ae5f722f48ba1c6c3464ce832 |
||||
|
MonoImporter: |
||||
|
externalObjects: {} |
||||
|
serializedVersion: 2 |
||||
|
defaultReferences: [] |
||||
|
executionOrder: 0 |
||||
|
icon: {instanceID: 0} |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
@ -0,0 +1,38 @@ |
|||||
|
using Localization; |
||||
|
using UnityEngine; |
||||
|
using Core.SceneManagement; |
||||
|
using Core.Settings; |
||||
|
using Core.Social; |
||||
|
using Core.Ads; |
||||
|
|
||||
|
namespace Core |
||||
|
{ |
||||
|
public class CoreInitializer |
||||
|
{ |
||||
|
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterSceneLoad)] |
||||
|
public static void Init() |
||||
|
{ |
||||
|
AdsManager.Init(); |
||||
|
LocalizationManager.Init(); |
||||
|
AudioController.Init(); |
||||
|
|
||||
|
if (CoreSettings.data.usSocialModule) |
||||
|
{ |
||||
|
SocialServerHandler.Init(); |
||||
|
|
||||
|
if (UserData.ID == -1) |
||||
|
{ |
||||
|
GameObject.Instantiate(CoreSettings.data.loginWindowPrefab); |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
SceneLoader.Init(); |
||||
|
} |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
SceneLoader.Init(); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,11 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: 5fdc739549ded714d92ed59025fa163c |
||||
|
MonoImporter: |
||||
|
externalObjects: {} |
||||
|
serializedVersion: 2 |
||||
|
defaultReferences: [] |
||||
|
executionOrder: 0 |
||||
|
icon: {instanceID: 0} |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
@ -0,0 +1,8 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: 8ab8697467d349f4c8c0e01b9ab90303 |
||||
|
folderAsset: yes |
||||
|
DefaultImporter: |
||||
|
externalObjects: {} |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
File diff suppressed because it is too large
@ -0,0 +1,7 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: 8c2e5eea00fe3ba48a408c1549fcdf66 |
||||
|
TextScriptImporter: |
||||
|
externalObjects: {} |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
Binary file not shown.
@ -0,0 +1,33 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: 9c22424d9115fe748a5bb58354c968b7 |
||||
|
PluginImporter: |
||||
|
externalObjects: {} |
||||
|
serializedVersion: 2 |
||||
|
iconMap: {} |
||||
|
executionOrder: {} |
||||
|
defineConstraints: [] |
||||
|
isPreloaded: 0 |
||||
|
isOverridable: 0 |
||||
|
isExplicitlyReferenced: 0 |
||||
|
validateReferences: 1 |
||||
|
platformData: |
||||
|
- first: |
||||
|
Any: |
||||
|
second: |
||||
|
enabled: 1 |
||||
|
settings: {} |
||||
|
- first: |
||||
|
Editor: Editor |
||||
|
second: |
||||
|
enabled: 0 |
||||
|
settings: |
||||
|
DefaultValueInitialized: true |
||||
|
- first: |
||||
|
Windows Store Apps: WindowsStoreApps |
||||
|
second: |
||||
|
enabled: 0 |
||||
|
settings: |
||||
|
CPU: AnyCPU |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
@ -0,0 +1,8 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: 7bb6a2f94e5e4394089bf3e86e4ad427 |
||||
|
folderAsset: yes |
||||
|
DefaultImporter: |
||||
|
externalObjects: {} |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
@ -0,0 +1,110 @@ |
|||||
|
<?xml version="1.0"?> |
||||
|
<doc> |
||||
|
<assembly> |
||||
|
<name>DOTweenEditor</name> |
||||
|
</assembly> |
||||
|
<members> |
||||
|
<member name="M:DG.DOTweenEditor.DOTweenEditorPreview.Start(System.Action)"> |
||||
|
<summary> |
||||
|
Starts the update loop of tween in the editor. Has no effect during playMode. |
||||
|
</summary> |
||||
|
<param name="onPreviewUpdated">Eventual callback to call after every update</param> |
||||
|
</member> |
||||
|
<member name="M:DG.DOTweenEditor.DOTweenEditorPreview.Stop(System.Boolean,System.Boolean)"> |
||||
|
<summary> |
||||
|
Stops the update loop and clears the onPreviewUpdated callback. |
||||
|
</summary> |
||||
|
<param name="resetTweenTargets">If TRUE also resets the tweened objects to their original state. |
||||
|
Note that this works by calling Rewind on all tweens, so it will work correctly |
||||
|
only if you have a single tween type per object and it wasn't killed</param> |
||||
|
<param name="clearTweens">If TRUE also kills any cached tween</param> |
||||
|
</member> |
||||
|
<member name="M:DG.DOTweenEditor.DOTweenEditorPreview.PrepareTweenForPreview(DG.Tweening.Tween,System.Boolean,System.Boolean,System.Boolean)"> |
||||
|
<summary> |
||||
|
Readies the tween for editor preview by setting its UpdateType to Manual plus eventual extra settings. |
||||
|
</summary> |
||||
|
<param name="t">The tween to ready</param> |
||||
|
<param name="clearCallbacks">If TRUE (recommended) removes all callbacks (OnComplete/Rewind/etc)</param> |
||||
|
<param name="preventAutoKill">If TRUE prevents the tween from being auto-killed at completion</param> |
||||
|
<param name="andPlay">If TRUE starts playing the tween immediately</param> |
||||
|
</member> |
||||
|
<member name="F:DG.DOTweenEditor.EditorVersion.Version"> |
||||
|
<summary>Full major version + first minor version (ex: 2018.1f)</summary> |
||||
|
</member> |
||||
|
<member name="F:DG.DOTweenEditor.EditorVersion.MajorVersion"> |
||||
|
<summary>Major version</summary> |
||||
|
</member> |
||||
|
<member name="F:DG.DOTweenEditor.EditorVersion.MinorVersion"> |
||||
|
<summary>First minor version (ex: in 2018.1 it would be 1)</summary> |
||||
|
</member> |
||||
|
<member name="M:DG.DOTweenEditor.EditorUtils.SetEditorTexture(UnityEngine.Texture2D,UnityEngine.FilterMode,System.Int32)"> |
||||
|
<summary> |
||||
|
Checks that the given editor texture use the correct import settings, |
||||
|
and applies them if they're incorrect. |
||||
|
</summary> |
||||
|
</member> |
||||
|
<member name="M:DG.DOTweenEditor.EditorUtils.DOTweenSetupRequired"> |
||||
|
<summary> |
||||
|
Returns TRUE if setup is required |
||||
|
</summary> |
||||
|
</member> |
||||
|
<member name="M:DG.DOTweenEditor.EditorUtils.AssetExists(System.String)"> |
||||
|
<summary> |
||||
|
Returns TRUE if the file/directory at the given path exists. |
||||
|
</summary> |
||||
|
<param name="adbPath">Path, relative to Unity's project folder</param> |
||||
|
<returns></returns> |
||||
|
</member> |
||||
|
<member name="M:DG.DOTweenEditor.EditorUtils.ADBPathToFullPath(System.String)"> |
||||
|
<summary> |
||||
|
Converts the given project-relative path to a full path, |
||||
|
with backward (\) slashes). |
||||
|
</summary> |
||||
|
</member> |
||||
|
<member name="M:DG.DOTweenEditor.EditorUtils.FullPathToADBPath(System.String)"> |
||||
|
<summary> |
||||
|
Converts the given full path to a path usable with AssetDatabase methods |
||||
|
(relative to Unity's project folder, and with the correct Unity forward (/) slashes). |
||||
|
</summary> |
||||
|
</member> |
||||
|
<member name="M:DG.DOTweenEditor.EditorUtils.ConnectToSourceAsset``1(System.String,System.Boolean)"> |
||||
|
<summary> |
||||
|
Connects to a <see cref="T:UnityEngine.ScriptableObject"/> asset. |
||||
|
If the asset already exists at the given path, loads it and returns it. |
||||
|
Otherwise, either returns NULL or automatically creates it before loading and returning it |
||||
|
(depending on the given parameters). |
||||
|
</summary> |
||||
|
<typeparam name="T">Asset type</typeparam> |
||||
|
<param name="adbFilePath">File path (relative to Unity's project folder)</param> |
||||
|
<param name="createIfMissing">If TRUE and the requested asset doesn't exist, forces its creation</param> |
||||
|
</member> |
||||
|
<member name="M:DG.DOTweenEditor.EditorUtils.GetAssemblyFilePath(System.Reflection.Assembly)"> |
||||
|
<summary> |
||||
|
Full path for the given loaded assembly, assembly file included |
||||
|
</summary> |
||||
|
</member> |
||||
|
<member name="M:DG.DOTweenEditor.EditorUtils.AddGlobalDefine(System.String)"> |
||||
|
<summary> |
||||
|
Adds the given global define if it's not already present |
||||
|
</summary> |
||||
|
</member> |
||||
|
<member name="M:DG.DOTweenEditor.EditorUtils.RemoveGlobalDefine(System.String)"> |
||||
|
<summary> |
||||
|
Removes the given global define if it's present |
||||
|
</summary> |
||||
|
</member> |
||||
|
<member name="M:DG.DOTweenEditor.EditorUtils.HasGlobalDefine(System.String,System.Nullable{UnityEditor.BuildTargetGroup})"> |
||||
|
<summary> |
||||
|
Returns TRUE if the given global define is present in all the <see cref="T:UnityEditor.BuildTargetGroup"/> |
||||
|
or only in the given <see cref="T:UnityEditor.BuildTargetGroup"/>, depending on passed parameters.<para/> |
||||
|
</summary> |
||||
|
<param name="id"></param> |
||||
|
<param name="buildTargetGroup"><see cref="T:UnityEditor.BuildTargetGroup"/>to use. Leave NULL to check in all of them.</param> |
||||
|
</member> |
||||
|
<member name="T:DG.DOTweenEditor.DOTweenDefines"> |
||||
|
<summary> |
||||
|
Not used as menu item anymore, but as a utiity function |
||||
|
</summary> |
||||
|
</member> |
||||
|
</members> |
||||
|
</doc> |
||||
@ -0,0 +1,7 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: d5f031fa9b0ca764db0a49248c0f6efc |
||||
|
TextScriptImporter: |
||||
|
externalObjects: {} |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
Binary file not shown.
@ -0,0 +1,33 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: 452543c36a693aa478de0a291b50ebc4 |
||||
|
PluginImporter: |
||||
|
externalObjects: {} |
||||
|
serializedVersion: 2 |
||||
|
iconMap: {} |
||||
|
executionOrder: {} |
||||
|
defineConstraints: [] |
||||
|
isPreloaded: 0 |
||||
|
isOverridable: 0 |
||||
|
isExplicitlyReferenced: 0 |
||||
|
validateReferences: 1 |
||||
|
platformData: |
||||
|
- first: |
||||
|
Any: |
||||
|
second: |
||||
|
enabled: 0 |
||||
|
settings: {} |
||||
|
- first: |
||||
|
Editor: Editor |
||||
|
second: |
||||
|
enabled: 1 |
||||
|
settings: |
||||
|
DefaultValueInitialized: true |
||||
|
- first: |
||||
|
Windows Store Apps: WindowsStoreApps |
||||
|
second: |
||||
|
enabled: 0 |
||||
|
settings: |
||||
|
CPU: AnyCPU |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
@ -0,0 +1,8 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: 79036b2c8a080394d88f70a06756834e |
||||
|
folderAsset: yes |
||||
|
DefaultImporter: |
||||
|
externalObjects: {} |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
|
After Width: | Height: | Size: 1.5 KiB |
@ -0,0 +1,92 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: fa2d6f75ad76e484db36b3c0642e1a61 |
||||
|
TextureImporter: |
||||
|
internalIDToNameTable: [] |
||||
|
externalObjects: {} |
||||
|
serializedVersion: 11 |
||||
|
mipmaps: |
||||
|
mipMapMode: 0 |
||||
|
enableMipMap: 1 |
||||
|
sRGBTexture: 1 |
||||
|
linearTexture: 0 |
||||
|
fadeOut: 0 |
||||
|
borderMipMap: 0 |
||||
|
mipMapsPreserveCoverage: 0 |
||||
|
alphaTestReferenceValue: 0.5 |
||||
|
mipMapFadeDistanceStart: 1 |
||||
|
mipMapFadeDistanceEnd: 3 |
||||
|
bumpmap: |
||||
|
convertToNormalMap: 0 |
||||
|
externalNormalMap: 0 |
||||
|
heightScale: 0.25 |
||||
|
normalMapFilter: 0 |
||||
|
isReadable: 0 |
||||
|
streamingMipmaps: 0 |
||||
|
streamingMipmapsPriority: 0 |
||||
|
grayScaleToAlpha: 0 |
||||
|
generateCubemap: 6 |
||||
|
cubemapConvolution: 0 |
||||
|
seamlessCubemap: 0 |
||||
|
textureFormat: 1 |
||||
|
maxTextureSize: 2048 |
||||
|
textureSettings: |
||||
|
serializedVersion: 2 |
||||
|
filterMode: 1 |
||||
|
aniso: 1 |
||||
|
mipBias: 0 |
||||
|
wrapU: 0 |
||||
|
wrapV: 0 |
||||
|
wrapW: 0 |
||||
|
nPOTScale: 1 |
||||
|
lightmap: 0 |
||||
|
compressionQuality: 50 |
||||
|
spriteMode: 0 |
||||
|
spriteExtrude: 1 |
||||
|
spriteMeshType: 1 |
||||
|
alignment: 0 |
||||
|
spritePivot: {x: 0.5, y: 0.5} |
||||
|
spritePixelsToUnits: 100 |
||||
|
spriteBorder: {x: 0, y: 0, z: 0, w: 0} |
||||
|
spriteGenerateFallbackPhysicsShape: 1 |
||||
|
alphaUsage: 1 |
||||
|
alphaIsTransparency: 0 |
||||
|
spriteTessellationDetail: -1 |
||||
|
textureType: 0 |
||||
|
textureShape: 1 |
||||
|
singleChannelComponent: 0 |
||||
|
maxTextureSizeSet: 0 |
||||
|
compressionQualitySet: 0 |
||||
|
textureFormatSet: 0 |
||||
|
applyGammaDecoding: 0 |
||||
|
platformSettings: |
||||
|
- serializedVersion: 3 |
||||
|
buildTarget: DefaultTexturePlatform |
||||
|
maxTextureSize: 2048 |
||||
|
resizeAlgorithm: 0 |
||||
|
textureFormat: -1 |
||||
|
textureCompression: 1 |
||||
|
compressionQuality: 50 |
||||
|
crunchedCompression: 0 |
||||
|
allowsAlphaSplitting: 0 |
||||
|
overridden: 0 |
||||
|
androidETC2FallbackOverride: 0 |
||||
|
forceMaximumCompressionQuality_BC6H_BC7: 0 |
||||
|
spriteSheet: |
||||
|
serializedVersion: 2 |
||||
|
sprites: [] |
||||
|
outline: [] |
||||
|
physicsShape: [] |
||||
|
bones: [] |
||||
|
spriteID: |
||||
|
internalID: 0 |
||||
|
vertices: [] |
||||
|
indices: |
||||
|
edges: [] |
||||
|
weights: [] |
||||
|
secondaryTextures: [] |
||||
|
spritePackingTag: |
||||
|
pSDRemoveMatte: 0 |
||||
|
pSDShowRemoveMatteOption: 0 |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
|
After Width: | Height: | Size: 319 B |
@ -0,0 +1,92 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: 702da108cfdf2f4408878c37f7cab826 |
||||
|
TextureImporter: |
||||
|
internalIDToNameTable: [] |
||||
|
externalObjects: {} |
||||
|
serializedVersion: 11 |
||||
|
mipmaps: |
||||
|
mipMapMode: 0 |
||||
|
enableMipMap: 1 |
||||
|
sRGBTexture: 1 |
||||
|
linearTexture: 0 |
||||
|
fadeOut: 0 |
||||
|
borderMipMap: 0 |
||||
|
mipMapsPreserveCoverage: 0 |
||||
|
alphaTestReferenceValue: 0.5 |
||||
|
mipMapFadeDistanceStart: 1 |
||||
|
mipMapFadeDistanceEnd: 3 |
||||
|
bumpmap: |
||||
|
convertToNormalMap: 0 |
||||
|
externalNormalMap: 0 |
||||
|
heightScale: 0.25 |
||||
|
normalMapFilter: 0 |
||||
|
isReadable: 0 |
||||
|
streamingMipmaps: 0 |
||||
|
streamingMipmapsPriority: 0 |
||||
|
grayScaleToAlpha: 0 |
||||
|
generateCubemap: 6 |
||||
|
cubemapConvolution: 0 |
||||
|
seamlessCubemap: 0 |
||||
|
textureFormat: 1 |
||||
|
maxTextureSize: 2048 |
||||
|
textureSettings: |
||||
|
serializedVersion: 2 |
||||
|
filterMode: 1 |
||||
|
aniso: 1 |
||||
|
mipBias: 0 |
||||
|
wrapU: 0 |
||||
|
wrapV: 0 |
||||
|
wrapW: 0 |
||||
|
nPOTScale: 1 |
||||
|
lightmap: 0 |
||||
|
compressionQuality: 50 |
||||
|
spriteMode: 0 |
||||
|
spriteExtrude: 1 |
||||
|
spriteMeshType: 1 |
||||
|
alignment: 0 |
||||
|
spritePivot: {x: 0.5, y: 0.5} |
||||
|
spritePixelsToUnits: 100 |
||||
|
spriteBorder: {x: 0, y: 0, z: 0, w: 0} |
||||
|
spriteGenerateFallbackPhysicsShape: 1 |
||||
|
alphaUsage: 1 |
||||
|
alphaIsTransparency: 0 |
||||
|
spriteTessellationDetail: -1 |
||||
|
textureType: 0 |
||||
|
textureShape: 1 |
||||
|
singleChannelComponent: 0 |
||||
|
maxTextureSizeSet: 0 |
||||
|
compressionQualitySet: 0 |
||||
|
textureFormatSet: 0 |
||||
|
applyGammaDecoding: 0 |
||||
|
platformSettings: |
||||
|
- serializedVersion: 3 |
||||
|
buildTarget: DefaultTexturePlatform |
||||
|
maxTextureSize: 2048 |
||||
|
resizeAlgorithm: 0 |
||||
|
textureFormat: -1 |
||||
|
textureCompression: 1 |
||||
|
compressionQuality: 50 |
||||
|
crunchedCompression: 0 |
||||
|
allowsAlphaSplitting: 0 |
||||
|
overridden: 0 |
||||
|
androidETC2FallbackOverride: 0 |
||||
|
forceMaximumCompressionQuality_BC6H_BC7: 0 |
||||
|
spriteSheet: |
||||
|
serializedVersion: 2 |
||||
|
sprites: [] |
||||
|
outline: [] |
||||
|
physicsShape: [] |
||||
|
bones: [] |
||||
|
spriteID: |
||||
|
internalID: 0 |
||||
|
vertices: [] |
||||
|
indices: |
||||
|
edges: [] |
||||
|
weights: [] |
||||
|
secondaryTextures: [] |
||||
|
spritePackingTag: |
||||
|
pSDRemoveMatte: 0 |
||||
|
pSDShowRemoveMatteOption: 0 |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
|
After Width: | Height: | Size: 4.3 KiB |
@ -0,0 +1,92 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: 50563b8d027adb54a89df9f736c9bc31 |
||||
|
TextureImporter: |
||||
|
internalIDToNameTable: [] |
||||
|
externalObjects: {} |
||||
|
serializedVersion: 11 |
||||
|
mipmaps: |
||||
|
mipMapMode: 0 |
||||
|
enableMipMap: 0 |
||||
|
sRGBTexture: 1 |
||||
|
linearTexture: 0 |
||||
|
fadeOut: 0 |
||||
|
borderMipMap: 0 |
||||
|
mipMapsPreserveCoverage: 0 |
||||
|
alphaTestReferenceValue: 0.5 |
||||
|
mipMapFadeDistanceStart: 1 |
||||
|
mipMapFadeDistanceEnd: 3 |
||||
|
bumpmap: |
||||
|
convertToNormalMap: 0 |
||||
|
externalNormalMap: 0 |
||||
|
heightScale: 0.25 |
||||
|
normalMapFilter: 0 |
||||
|
isReadable: 0 |
||||
|
streamingMipmaps: 0 |
||||
|
streamingMipmapsPriority: 0 |
||||
|
grayScaleToAlpha: 0 |
||||
|
generateCubemap: 6 |
||||
|
cubemapConvolution: 0 |
||||
|
seamlessCubemap: 0 |
||||
|
textureFormat: 1 |
||||
|
maxTextureSize: 2048 |
||||
|
textureSettings: |
||||
|
serializedVersion: 2 |
||||
|
filterMode: 1 |
||||
|
aniso: 1 |
||||
|
mipBias: 0 |
||||
|
wrapU: 1 |
||||
|
wrapV: 1 |
||||
|
wrapW: 1 |
||||
|
nPOTScale: 0 |
||||
|
lightmap: 0 |
||||
|
compressionQuality: 50 |
||||
|
spriteMode: 0 |
||||
|
spriteExtrude: 1 |
||||
|
spriteMeshType: 1 |
||||
|
alignment: 0 |
||||
|
spritePivot: {x: 0.5, y: 0.5} |
||||
|
spritePixelsToUnits: 100 |
||||
|
spriteBorder: {x: 0, y: 0, z: 0, w: 0} |
||||
|
spriteGenerateFallbackPhysicsShape: 1 |
||||
|
alphaUsage: 1 |
||||
|
alphaIsTransparency: 1 |
||||
|
spriteTessellationDetail: -1 |
||||
|
textureType: 2 |
||||
|
textureShape: 1 |
||||
|
singleChannelComponent: 0 |
||||
|
maxTextureSizeSet: 0 |
||||
|
compressionQualitySet: 0 |
||||
|
textureFormatSet: 0 |
||||
|
applyGammaDecoding: 0 |
||||
|
platformSettings: |
||||
|
- serializedVersion: 3 |
||||
|
buildTarget: DefaultTexturePlatform |
||||
|
maxTextureSize: 256 |
||||
|
resizeAlgorithm: 0 |
||||
|
textureFormat: -1 |
||||
|
textureCompression: 1 |
||||
|
compressionQuality: 50 |
||||
|
crunchedCompression: 0 |
||||
|
allowsAlphaSplitting: 0 |
||||
|
overridden: 0 |
||||
|
androidETC2FallbackOverride: 0 |
||||
|
forceMaximumCompressionQuality_BC6H_BC7: 0 |
||||
|
spriteSheet: |
||||
|
serializedVersion: 2 |
||||
|
sprites: [] |
||||
|
outline: [] |
||||
|
physicsShape: [] |
||||
|
bones: [] |
||||
|
spriteID: |
||||
|
internalID: 0 |
||||
|
vertices: [] |
||||
|
indices: |
||||
|
edges: [] |
||||
|
weights: [] |
||||
|
secondaryTextures: [] |
||||
|
spritePackingTag: |
||||
|
pSDRemoveMatte: 0 |
||||
|
pSDShowRemoveMatteOption: 0 |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
|
After Width: | Height: | Size: 4.3 KiB |
@ -0,0 +1,92 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: dbe24fadac9c2114b8318900f9992ce9 |
||||
|
TextureImporter: |
||||
|
internalIDToNameTable: [] |
||||
|
externalObjects: {} |
||||
|
serializedVersion: 11 |
||||
|
mipmaps: |
||||
|
mipMapMode: 0 |
||||
|
enableMipMap: 1 |
||||
|
sRGBTexture: 1 |
||||
|
linearTexture: 0 |
||||
|
fadeOut: 0 |
||||
|
borderMipMap: 0 |
||||
|
mipMapsPreserveCoverage: 0 |
||||
|
alphaTestReferenceValue: 0.5 |
||||
|
mipMapFadeDistanceStart: 1 |
||||
|
mipMapFadeDistanceEnd: 3 |
||||
|
bumpmap: |
||||
|
convertToNormalMap: 0 |
||||
|
externalNormalMap: 0 |
||||
|
heightScale: 0.25 |
||||
|
normalMapFilter: 0 |
||||
|
isReadable: 0 |
||||
|
streamingMipmaps: 0 |
||||
|
streamingMipmapsPriority: 0 |
||||
|
grayScaleToAlpha: 0 |
||||
|
generateCubemap: 6 |
||||
|
cubemapConvolution: 0 |
||||
|
seamlessCubemap: 0 |
||||
|
textureFormat: 1 |
||||
|
maxTextureSize: 2048 |
||||
|
textureSettings: |
||||
|
serializedVersion: 2 |
||||
|
filterMode: 1 |
||||
|
aniso: 1 |
||||
|
mipBias: 0 |
||||
|
wrapU: 0 |
||||
|
wrapV: 0 |
||||
|
wrapW: 0 |
||||
|
nPOTScale: 1 |
||||
|
lightmap: 0 |
||||
|
compressionQuality: 50 |
||||
|
spriteMode: 0 |
||||
|
spriteExtrude: 1 |
||||
|
spriteMeshType: 1 |
||||
|
alignment: 0 |
||||
|
spritePivot: {x: 0.5, y: 0.5} |
||||
|
spritePixelsToUnits: 100 |
||||
|
spriteBorder: {x: 0, y: 0, z: 0, w: 0} |
||||
|
spriteGenerateFallbackPhysicsShape: 1 |
||||
|
alphaUsage: 1 |
||||
|
alphaIsTransparency: 0 |
||||
|
spriteTessellationDetail: -1 |
||||
|
textureType: 0 |
||||
|
textureShape: 1 |
||||
|
singleChannelComponent: 0 |
||||
|
maxTextureSizeSet: 0 |
||||
|
compressionQualitySet: 0 |
||||
|
textureFormatSet: 0 |
||||
|
applyGammaDecoding: 0 |
||||
|
platformSettings: |
||||
|
- serializedVersion: 3 |
||||
|
buildTarget: DefaultTexturePlatform |
||||
|
maxTextureSize: 2048 |
||||
|
resizeAlgorithm: 0 |
||||
|
textureFormat: -1 |
||||
|
textureCompression: 1 |
||||
|
compressionQuality: 50 |
||||
|
crunchedCompression: 0 |
||||
|
allowsAlphaSplitting: 0 |
||||
|
overridden: 0 |
||||
|
androidETC2FallbackOverride: 0 |
||||
|
forceMaximumCompressionQuality_BC6H_BC7: 0 |
||||
|
spriteSheet: |
||||
|
serializedVersion: 2 |
||||
|
sprites: [] |
||||
|
outline: [] |
||||
|
physicsShape: [] |
||||
|
bones: [] |
||||
|
spriteID: |
||||
|
internalID: 0 |
||||
|
vertices: [] |
||||
|
indices: |
||||
|
edges: [] |
||||
|
weights: [] |
||||
|
secondaryTextures: [] |
||||
|
spritePackingTag: |
||||
|
pSDRemoveMatte: 0 |
||||
|
pSDShowRemoveMatteOption: 0 |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
|
After Width: | Height: | Size: 22 KiB |
@ -0,0 +1,92 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: 2f7c3708c746e884e9f7fd68f2695df3 |
||||
|
TextureImporter: |
||||
|
internalIDToNameTable: [] |
||||
|
externalObjects: {} |
||||
|
serializedVersion: 11 |
||||
|
mipmaps: |
||||
|
mipMapMode: 0 |
||||
|
enableMipMap: 0 |
||||
|
sRGBTexture: 1 |
||||
|
linearTexture: 0 |
||||
|
fadeOut: 0 |
||||
|
borderMipMap: 0 |
||||
|
mipMapsPreserveCoverage: 0 |
||||
|
alphaTestReferenceValue: 0.5 |
||||
|
mipMapFadeDistanceStart: 1 |
||||
|
mipMapFadeDistanceEnd: 3 |
||||
|
bumpmap: |
||||
|
convertToNormalMap: 0 |
||||
|
externalNormalMap: 0 |
||||
|
heightScale: 0.25 |
||||
|
normalMapFilter: 0 |
||||
|
isReadable: 0 |
||||
|
streamingMipmaps: 0 |
||||
|
streamingMipmapsPriority: 0 |
||||
|
grayScaleToAlpha: 0 |
||||
|
generateCubemap: 6 |
||||
|
cubemapConvolution: 0 |
||||
|
seamlessCubemap: 0 |
||||
|
textureFormat: 1 |
||||
|
maxTextureSize: 2048 |
||||
|
textureSettings: |
||||
|
serializedVersion: 2 |
||||
|
filterMode: 1 |
||||
|
aniso: 1 |
||||
|
mipBias: 0 |
||||
|
wrapU: 1 |
||||
|
wrapV: 1 |
||||
|
wrapW: 1 |
||||
|
nPOTScale: 0 |
||||
|
lightmap: 0 |
||||
|
compressionQuality: 50 |
||||
|
spriteMode: 0 |
||||
|
spriteExtrude: 1 |
||||
|
spriteMeshType: 1 |
||||
|
alignment: 0 |
||||
|
spritePivot: {x: 0.5, y: 0.5} |
||||
|
spritePixelsToUnits: 100 |
||||
|
spriteBorder: {x: 0, y: 0, z: 0, w: 0} |
||||
|
spriteGenerateFallbackPhysicsShape: 1 |
||||
|
alphaUsage: 1 |
||||
|
alphaIsTransparency: 1 |
||||
|
spriteTessellationDetail: -1 |
||||
|
textureType: 2 |
||||
|
textureShape: 1 |
||||
|
singleChannelComponent: 0 |
||||
|
maxTextureSizeSet: 0 |
||||
|
compressionQualitySet: 0 |
||||
|
textureFormatSet: 0 |
||||
|
applyGammaDecoding: 0 |
||||
|
platformSettings: |
||||
|
- serializedVersion: 3 |
||||
|
buildTarget: DefaultTexturePlatform |
||||
|
maxTextureSize: 512 |
||||
|
resizeAlgorithm: 0 |
||||
|
textureFormat: -1 |
||||
|
textureCompression: 1 |
||||
|
compressionQuality: 50 |
||||
|
crunchedCompression: 0 |
||||
|
allowsAlphaSplitting: 0 |
||||
|
overridden: 0 |
||||
|
androidETC2FallbackOverride: 0 |
||||
|
forceMaximumCompressionQuality_BC6H_BC7: 0 |
||||
|
spriteSheet: |
||||
|
serializedVersion: 2 |
||||
|
sprites: [] |
||||
|
outline: [] |
||||
|
physicsShape: [] |
||||
|
bones: [] |
||||
|
spriteID: |
||||
|
internalID: 0 |
||||
|
vertices: [] |
||||
|
indices: |
||||
|
edges: [] |
||||
|
weights: [] |
||||
|
secondaryTextures: [] |
||||
|
spritePackingTag: |
||||
|
pSDRemoveMatte: 0 |
||||
|
pSDShowRemoveMatteOption: 0 |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
@ -0,0 +1,8 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: 67f5f077fcc7bc044950ce9572a5e0bc |
||||
|
folderAsset: yes |
||||
|
DefaultImporter: |
||||
|
externalObjects: {} |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
@ -0,0 +1,202 @@ |
|||||
|
// Author: Daniele Giardini - http://www.demigiant.com
|
||||
|
// Created: 2018/07/13
|
||||
|
|
||||
|
#if true // MODULE_MARKER
|
||||
|
using System; |
||||
|
using DG.Tweening.Core; |
||||
|
using DG.Tweening.Plugins.Options; |
||||
|
using UnityEngine; |
||||
|
#if UNITY_5 || UNITY_2017_1_OR_NEWER
|
||||
|
using UnityEngine.Audio; // Required for AudioMixer
|
||||
|
#endif
|
||||
|
|
||||
|
#pragma warning disable 1591
|
||||
|
namespace DG.Tweening |
||||
|
{ |
||||
|
public static class DOTweenModuleAudio |
||||
|
{ |
||||
|
#region Shortcuts
|
||||
|
|
||||
|
#region Audio
|
||||
|
|
||||
|
/// <summary>Tweens an AudioSource's volume to the given value.
|
||||
|
/// Also stores the AudioSource as the tween's target so it can be used for filtered operations</summary>
|
||||
|
/// <param name="endValue">The end value to reach (0 to 1)</param><param name="duration">The duration of the tween</param>
|
||||
|
public static TweenerCore<float, float, FloatOptions> DOFade(this AudioSource target, float endValue, float duration) |
||||
|
{ |
||||
|
if (endValue < 0) endValue = 0; |
||||
|
else if (endValue > 1) endValue = 1; |
||||
|
TweenerCore<float, float, FloatOptions> t = DOTween.To(() => target.volume, x => target.volume = x, endValue, duration); |
||||
|
t.SetTarget(target); |
||||
|
return t; |
||||
|
} |
||||
|
|
||||
|
/// <summary>Tweens an AudioSource's pitch to the given value.
|
||||
|
/// Also stores the AudioSource as the tween's target so it can be used for filtered operations</summary>
|
||||
|
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
|
public static TweenerCore<float, float, FloatOptions> DOPitch(this AudioSource target, float endValue, float duration) |
||||
|
{ |
||||
|
TweenerCore<float, float, FloatOptions> t = DOTween.To(() => target.pitch, x => target.pitch = x, endValue, duration); |
||||
|
t.SetTarget(target); |
||||
|
return t; |
||||
|
} |
||||
|
|
||||
|
#endregion
|
||||
|
|
||||
|
#if UNITY_5 || UNITY_2017_1_OR_NEWER
|
||||
|
#region AudioMixer (Unity 5 or Newer)
|
||||
|
|
||||
|
/// <summary>Tweens an AudioMixer's exposed float to the given value.
|
||||
|
/// Also stores the AudioMixer as the tween's target so it can be used for filtered operations.
|
||||
|
/// Note that you need to manually expose a float in an AudioMixerGroup in order to be able to tween it from an AudioMixer.</summary>
|
||||
|
/// <param name="floatName">Name given to the exposed float to set</param>
|
||||
|
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
|
public static TweenerCore<float, float, FloatOptions> DOSetFloat(this AudioMixer target, string floatName, float endValue, float duration) |
||||
|
{ |
||||
|
TweenerCore<float, float, FloatOptions> t = DOTween.To(()=> { |
||||
|
float currVal; |
||||
|
target.GetFloat(floatName, out currVal); |
||||
|
return currVal; |
||||
|
}, x=> target.SetFloat(floatName, x), endValue, duration); |
||||
|
t.SetTarget(target); |
||||
|
return t; |
||||
|
} |
||||
|
|
||||
|
#region Operation Shortcuts
|
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Completes all tweens that have this target as a reference
|
||||
|
/// (meaning tweens that were started from this target, or that had this target added as an Id)
|
||||
|
/// and returns the total number of tweens completed
|
||||
|
/// (meaning the tweens that don't have infinite loops and were not already complete)
|
||||
|
/// </summary>
|
||||
|
/// <param name="withCallbacks">For Sequences only: if TRUE also internal Sequence callbacks will be fired,
|
||||
|
/// otherwise they will be ignored</param>
|
||||
|
public static int DOComplete(this AudioMixer target, bool withCallbacks = false) |
||||
|
{ |
||||
|
return DOTween.Complete(target, withCallbacks); |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Kills all tweens that have this target as a reference
|
||||
|
/// (meaning tweens that were started from this target, or that had this target added as an Id)
|
||||
|
/// and returns the total number of tweens killed.
|
||||
|
/// </summary>
|
||||
|
/// <param name="complete">If TRUE completes the tween before killing it</param>
|
||||
|
public static int DOKill(this AudioMixer target, bool complete = false) |
||||
|
{ |
||||
|
return DOTween.Kill(target, complete); |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Flips the direction (backwards if it was going forward or viceversa) of all tweens that have this target as a reference
|
||||
|
/// (meaning tweens that were started from this target, or that had this target added as an Id)
|
||||
|
/// and returns the total number of tweens flipped.
|
||||
|
/// </summary>
|
||||
|
public static int DOFlip(this AudioMixer target) |
||||
|
{ |
||||
|
return DOTween.Flip(target); |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Sends to the given position all tweens that have this target as a reference
|
||||
|
/// (meaning tweens that were started from this target, or that had this target added as an Id)
|
||||
|
/// and returns the total number of tweens involved.
|
||||
|
/// </summary>
|
||||
|
/// <param name="to">Time position to reach
|
||||
|
/// (if higher than the whole tween duration the tween will simply reach its end)</param>
|
||||
|
/// <param name="andPlay">If TRUE will play the tween after reaching the given position, otherwise it will pause it</param>
|
||||
|
public static int DOGoto(this AudioMixer target, float to, bool andPlay = false) |
||||
|
{ |
||||
|
return DOTween.Goto(target, to, andPlay); |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Pauses all tweens that have this target as a reference
|
||||
|
/// (meaning tweens that were started from this target, or that had this target added as an Id)
|
||||
|
/// and returns the total number of tweens paused.
|
||||
|
/// </summary>
|
||||
|
public static int DOPause(this AudioMixer target) |
||||
|
{ |
||||
|
return DOTween.Pause(target); |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Plays all tweens that have this target as a reference
|
||||
|
/// (meaning tweens that were started from this target, or that had this target added as an Id)
|
||||
|
/// and returns the total number of tweens played.
|
||||
|
/// </summary>
|
||||
|
public static int DOPlay(this AudioMixer target) |
||||
|
{ |
||||
|
return DOTween.Play(target); |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Plays backwards all tweens that have this target as a reference
|
||||
|
/// (meaning tweens that were started from this target, or that had this target added as an Id)
|
||||
|
/// and returns the total number of tweens played.
|
||||
|
/// </summary>
|
||||
|
public static int DOPlayBackwards(this AudioMixer target) |
||||
|
{ |
||||
|
return DOTween.PlayBackwards(target); |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Plays forward all tweens that have this target as a reference
|
||||
|
/// (meaning tweens that were started from this target, or that had this target added as an Id)
|
||||
|
/// and returns the total number of tweens played.
|
||||
|
/// </summary>
|
||||
|
public static int DOPlayForward(this AudioMixer target) |
||||
|
{ |
||||
|
return DOTween.PlayForward(target); |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Restarts all tweens that have this target as a reference
|
||||
|
/// (meaning tweens that were started from this target, or that had this target added as an Id)
|
||||
|
/// and returns the total number of tweens restarted.
|
||||
|
/// </summary>
|
||||
|
public static int DORestart(this AudioMixer target) |
||||
|
{ |
||||
|
return DOTween.Restart(target); |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Rewinds all tweens that have this target as a reference
|
||||
|
/// (meaning tweens that were started from this target, or that had this target added as an Id)
|
||||
|
/// and returns the total number of tweens rewinded.
|
||||
|
/// </summary>
|
||||
|
public static int DORewind(this AudioMixer target) |
||||
|
{ |
||||
|
return DOTween.Rewind(target); |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Smoothly rewinds all tweens that have this target as a reference
|
||||
|
/// (meaning tweens that were started from this target, or that had this target added as an Id)
|
||||
|
/// and returns the total number of tweens rewinded.
|
||||
|
/// </summary>
|
||||
|
public static int DOSmoothRewind(this AudioMixer target) |
||||
|
{ |
||||
|
return DOTween.SmoothRewind(target); |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Toggles the paused state (plays if it was paused, pauses if it was playing) of all tweens that have this target as a reference
|
||||
|
/// (meaning tweens that were started from this target, or that had this target added as an Id)
|
||||
|
/// and returns the total number of tweens involved.
|
||||
|
/// </summary>
|
||||
|
public static int DOTogglePause(this AudioMixer target) |
||||
|
{ |
||||
|
return DOTween.TogglePause(target); |
||||
|
} |
||||
|
|
||||
|
#endregion
|
||||
|
|
||||
|
#endregion
|
||||
|
#endif
|
||||
|
|
||||
|
#endregion
|
||||
|
} |
||||
|
} |
||||
|
#endif
|
||||
@ -0,0 +1,11 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: eb1a012f311912c488e8b1a6a93b4f64 |
||||
|
MonoImporter: |
||||
|
externalObjects: {} |
||||
|
serializedVersion: 2 |
||||
|
defaultReferences: [] |
||||
|
executionOrder: 0 |
||||
|
icon: {instanceID: 0} |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
@ -0,0 +1,142 @@ |
|||||
|
using UnityEngine; |
||||
|
|
||||
|
#if false || EPO_DOTWEEN // MODULE_MARKER
|
||||
|
|
||||
|
using EPOOutline; |
||||
|
using DG.Tweening.Plugins.Options; |
||||
|
using DG.Tweening; |
||||
|
using DG.Tweening.Core; |
||||
|
|
||||
|
namespace DG.Tweening |
||||
|
{ |
||||
|
public static class DOTweenModuleEPOOutline |
||||
|
{ |
||||
|
public static int DOKill(this SerializedPass target, bool complete) |
||||
|
{ |
||||
|
return DOTween.Kill(target, complete); |
||||
|
} |
||||
|
|
||||
|
public static TweenerCore<float, float, FloatOptions> DOFloat(this SerializedPass target, string propertyName, float endValue, float duration) |
||||
|
{ |
||||
|
var tweener = DOTween.To(() => target.GetFloat(propertyName), x => target.SetFloat(propertyName, x), endValue, duration); |
||||
|
tweener.SetOptions(true).SetTarget(target); |
||||
|
return tweener; |
||||
|
} |
||||
|
|
||||
|
public static TweenerCore<Color, Color, ColorOptions> DOFade(this SerializedPass target, string propertyName, float endValue, float duration) |
||||
|
{ |
||||
|
var tweener = DOTween.ToAlpha(() => target.GetColor(propertyName), x => target.SetColor(propertyName, x), endValue, duration); |
||||
|
tweener.SetOptions(true).SetTarget(target); |
||||
|
return tweener; |
||||
|
} |
||||
|
|
||||
|
public static TweenerCore<Color, Color, ColorOptions> DOColor(this SerializedPass target, string propertyName, Color endValue, float duration) |
||||
|
{ |
||||
|
var tweener = DOTween.To(() => target.GetColor(propertyName), x => target.SetColor(propertyName, x), endValue, duration); |
||||
|
tweener.SetOptions(false).SetTarget(target); |
||||
|
return tweener; |
||||
|
} |
||||
|
|
||||
|
public static TweenerCore<Vector4, Vector4, VectorOptions> DOVector(this SerializedPass target, string propertyName, Vector4 endValue, float duration) |
||||
|
{ |
||||
|
var tweener = DOTween.To(() => target.GetVector(propertyName), x => target.SetVector(propertyName, x), endValue, duration); |
||||
|
tweener.SetOptions(false).SetTarget(target); |
||||
|
return tweener; |
||||
|
} |
||||
|
|
||||
|
public static TweenerCore<float, float, FloatOptions> DOFloat(this SerializedPass target, int propertyId, float endValue, float duration) |
||||
|
{ |
||||
|
var tweener = DOTween.To(() => target.GetFloat(propertyId), x => target.SetFloat(propertyId, x), endValue, duration); |
||||
|
tweener.SetOptions(true).SetTarget(target); |
||||
|
return tweener; |
||||
|
} |
||||
|
|
||||
|
public static TweenerCore<Color, Color, ColorOptions> DOFade(this SerializedPass target, int propertyId, float endValue, float duration) |
||||
|
{ |
||||
|
var tweener = DOTween.ToAlpha(() => target.GetColor(propertyId), x => target.SetColor(propertyId, x), endValue, duration); |
||||
|
tweener.SetOptions(true).SetTarget(target); |
||||
|
return tweener; |
||||
|
} |
||||
|
|
||||
|
public static TweenerCore<Color, Color, ColorOptions> DOColor(this SerializedPass target, int propertyId, Color endValue, float duration) |
||||
|
{ |
||||
|
var tweener = DOTween.To(() => target.GetColor(propertyId), x => target.SetColor(propertyId, x), endValue, duration); |
||||
|
tweener.SetOptions(false).SetTarget(target); |
||||
|
return tweener; |
||||
|
} |
||||
|
|
||||
|
public static TweenerCore<Vector4, Vector4, VectorOptions> DOVector(this SerializedPass target, int propertyId, Vector4 endValue, float duration) |
||||
|
{ |
||||
|
var tweener = DOTween.To(() => target.GetVector(propertyId), x => target.SetVector(propertyId, x), endValue, duration); |
||||
|
tweener.SetOptions(false).SetTarget(target); |
||||
|
return tweener; |
||||
|
} |
||||
|
|
||||
|
public static int DOKill(this Outlinable.OutlineProperties target, bool complete = false) |
||||
|
{ |
||||
|
return DOTween.Kill(target, complete); |
||||
|
} |
||||
|
|
||||
|
public static int DOKill(this Outliner target, bool complete = false) |
||||
|
{ |
||||
|
return DOTween.Kill(target, complete); |
||||
|
} |
||||
|
|
||||
|
public static TweenerCore<Color, Color, ColorOptions> DOFade(this Outlinable.OutlineProperties target, float endValue, float duration) |
||||
|
{ |
||||
|
var tweener = DOTween.ToAlpha(() => target.Color, x => target.Color = x, endValue, duration); |
||||
|
tweener.SetOptions(true).SetTarget(target); |
||||
|
return tweener; |
||||
|
} |
||||
|
|
||||
|
public static TweenerCore<Color, Color, ColorOptions> DOColor(this Outlinable.OutlineProperties target, Color endValue, float duration) |
||||
|
{ |
||||
|
var tweener = DOTween.To(() => target.Color, x => target.Color = x, endValue, duration); |
||||
|
tweener.SetOptions(false).SetTarget(target); |
||||
|
return tweener; |
||||
|
} |
||||
|
|
||||
|
public static TweenerCore<float, float, FloatOptions> DODilateShift(this Outlinable.OutlineProperties target, float endValue, float duration, bool snapping = false) |
||||
|
{ |
||||
|
var tweener = DOTween.To(() => target.DilateShift, x => target.DilateShift = x, endValue, duration); |
||||
|
tweener.SetOptions(snapping).SetTarget(target); |
||||
|
return tweener; |
||||
|
} |
||||
|
|
||||
|
public static TweenerCore<float, float, FloatOptions> DOBlurShift(this Outlinable.OutlineProperties target, float endValue, float duration, bool snapping = false) |
||||
|
{ |
||||
|
var tweener = DOTween.To(() => target.BlurShift, x => target.BlurShift = x, endValue, duration); |
||||
|
tweener.SetOptions(snapping).SetTarget(target); |
||||
|
return tweener; |
||||
|
} |
||||
|
|
||||
|
public static TweenerCore<float, float, FloatOptions> DOBlurShift(this Outliner target, float endValue, float duration, bool snapping = false) |
||||
|
{ |
||||
|
var tweener = DOTween.To(() => target.BlurShift, x => target.BlurShift = x, endValue, duration); |
||||
|
tweener.SetOptions(snapping).SetTarget(target); |
||||
|
return tweener; |
||||
|
} |
||||
|
|
||||
|
public static TweenerCore<float, float, FloatOptions> DODilateShift(this Outliner target, float endValue, float duration, bool snapping = false) |
||||
|
{ |
||||
|
var tweener = DOTween.To(() => target.DilateShift, x => target.DilateShift = x, endValue, duration); |
||||
|
tweener.SetOptions(snapping).SetTarget(target); |
||||
|
return tweener; |
||||
|
} |
||||
|
|
||||
|
public static TweenerCore<float, float, FloatOptions> DOInfoRendererScale(this Outliner target, float endValue, float duration, bool snapping = false) |
||||
|
{ |
||||
|
var tweener = DOTween.To(() => target.InfoRendererScale, x => target.InfoRendererScale = x, endValue, duration); |
||||
|
tweener.SetOptions(snapping).SetTarget(target); |
||||
|
return tweener; |
||||
|
} |
||||
|
|
||||
|
public static TweenerCore<float, float, FloatOptions> DOPrimaryRendererScale(this Outliner target, float endValue, float duration, bool snapping = false) |
||||
|
{ |
||||
|
var tweener = DOTween.To(() => target.PrimaryRendererScale, x => target.PrimaryRendererScale = x, endValue, duration); |
||||
|
tweener.SetOptions(snapping).SetTarget(target); |
||||
|
return tweener; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
#endif
|
||||
@ -0,0 +1,11 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: 3eef98a58de254648b3a7f535fa7ec7d |
||||
|
MonoImporter: |
||||
|
externalObjects: {} |
||||
|
serializedVersion: 2 |
||||
|
defaultReferences: [] |
||||
|
executionOrder: 0 |
||||
|
icon: {instanceID: 0} |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
@ -0,0 +1,216 @@ |
|||||
|
// Author: Daniele Giardini - http://www.demigiant.com
|
||||
|
// Created: 2018/07/13
|
||||
|
|
||||
|
#if true // MODULE_MARKER
|
||||
|
using System; |
||||
|
using DG.Tweening.Core; |
||||
|
using DG.Tweening.Core.Enums; |
||||
|
using DG.Tweening.Plugins; |
||||
|
using DG.Tweening.Plugins.Core.PathCore; |
||||
|
using DG.Tweening.Plugins.Options; |
||||
|
using UnityEngine; |
||||
|
|
||||
|
#pragma warning disable 1591
|
||||
|
namespace DG.Tweening |
||||
|
{ |
||||
|
public static class DOTweenModulePhysics |
||||
|
{ |
||||
|
#region Shortcuts
|
||||
|
|
||||
|
#region Rigidbody
|
||||
|
|
||||
|
/// <summary>Tweens a Rigidbody's position to the given value.
|
||||
|
/// Also stores the rigidbody as the tween's target so it can be used for filtered operations</summary>
|
||||
|
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
|
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
|
public static TweenerCore<Vector3, Vector3, VectorOptions> DOMove(this Rigidbody target, Vector3 endValue, float duration, bool snapping = false) |
||||
|
{ |
||||
|
TweenerCore<Vector3, Vector3, VectorOptions> t = DOTween.To(() => target.position, target.MovePosition, endValue, duration); |
||||
|
t.SetOptions(snapping).SetTarget(target); |
||||
|
return t; |
||||
|
} |
||||
|
|
||||
|
/// <summary>Tweens a Rigidbody's X position to the given value.
|
||||
|
/// Also stores the rigidbody as the tween's target so it can be used for filtered operations</summary>
|
||||
|
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
|
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
|
public static TweenerCore<Vector3, Vector3, VectorOptions> DOMoveX(this Rigidbody target, float endValue, float duration, bool snapping = false) |
||||
|
{ |
||||
|
TweenerCore<Vector3, Vector3, VectorOptions> t = DOTween.To(() => target.position, target.MovePosition, new Vector3(endValue, 0, 0), duration); |
||||
|
t.SetOptions(AxisConstraint.X, snapping).SetTarget(target); |
||||
|
return t; |
||||
|
} |
||||
|
|
||||
|
/// <summary>Tweens a Rigidbody's Y position to the given value.
|
||||
|
/// Also stores the rigidbody as the tween's target so it can be used for filtered operations</summary>
|
||||
|
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
|
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
|
public static TweenerCore<Vector3, Vector3, VectorOptions> DOMoveY(this Rigidbody target, float endValue, float duration, bool snapping = false) |
||||
|
{ |
||||
|
TweenerCore<Vector3, Vector3, VectorOptions> t = DOTween.To(() => target.position, target.MovePosition, new Vector3(0, endValue, 0), duration); |
||||
|
t.SetOptions(AxisConstraint.Y, snapping).SetTarget(target); |
||||
|
return t; |
||||
|
} |
||||
|
|
||||
|
/// <summary>Tweens a Rigidbody's Z position to the given value.
|
||||
|
/// Also stores the rigidbody as the tween's target so it can be used for filtered operations</summary>
|
||||
|
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
|
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
|
public static TweenerCore<Vector3, Vector3, VectorOptions> DOMoveZ(this Rigidbody target, float endValue, float duration, bool snapping = false) |
||||
|
{ |
||||
|
TweenerCore<Vector3, Vector3, VectorOptions> t = DOTween.To(() => target.position, target.MovePosition, new Vector3(0, 0, endValue), duration); |
||||
|
t.SetOptions(AxisConstraint.Z, snapping).SetTarget(target); |
||||
|
return t; |
||||
|
} |
||||
|
|
||||
|
/// <summary>Tweens a Rigidbody's rotation to the given value.
|
||||
|
/// Also stores the rigidbody as the tween's target so it can be used for filtered operations</summary>
|
||||
|
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
|
/// <param name="mode">Rotation mode</param>
|
||||
|
public static TweenerCore<Quaternion, Vector3, QuaternionOptions> DORotate(this Rigidbody target, Vector3 endValue, float duration, RotateMode mode = RotateMode.Fast) |
||||
|
{ |
||||
|
TweenerCore<Quaternion, Vector3, QuaternionOptions> t = DOTween.To(() => target.rotation, target.MoveRotation, endValue, duration); |
||||
|
t.SetTarget(target); |
||||
|
t.plugOptions.rotateMode = mode; |
||||
|
return t; |
||||
|
} |
||||
|
|
||||
|
/// <summary>Tweens a Rigidbody's rotation so that it will look towards the given position.
|
||||
|
/// Also stores the rigidbody as the tween's target so it can be used for filtered operations</summary>
|
||||
|
/// <param name="towards">The position to look at</param><param name="duration">The duration of the tween</param>
|
||||
|
/// <param name="axisConstraint">Eventual axis constraint for the rotation</param>
|
||||
|
/// <param name="up">The vector that defines in which direction up is (default: Vector3.up)</param>
|
||||
|
public static TweenerCore<Quaternion, Vector3, QuaternionOptions> DOLookAt(this Rigidbody target, Vector3 towards, float duration, AxisConstraint axisConstraint = AxisConstraint.None, Vector3? up = null) |
||||
|
{ |
||||
|
TweenerCore<Quaternion, Vector3, QuaternionOptions> t = DOTween.To(() => target.rotation, target.MoveRotation, towards, duration) |
||||
|
.SetTarget(target).SetSpecialStartupMode(SpecialStartupMode.SetLookAt); |
||||
|
t.plugOptions.axisConstraint = axisConstraint; |
||||
|
t.plugOptions.up = (up == null) ? Vector3.up : (Vector3)up; |
||||
|
return t; |
||||
|
} |
||||
|
|
||||
|
#region Special
|
||||
|
|
||||
|
/// <summary>Tweens a Rigidbody's position to the given value, while also applying a jump effect along the Y axis.
|
||||
|
/// Returns a Sequence instead of a Tweener.
|
||||
|
/// Also stores the Rigidbody as the tween's target so it can be used for filtered operations</summary>
|
||||
|
/// <param name="endValue">The end value to reach</param>
|
||||
|
/// <param name="jumpPower">Power of the jump (the max height of the jump is represented by this plus the final Y offset)</param>
|
||||
|
/// <param name="numJumps">Total number of jumps</param>
|
||||
|
/// <param name="duration">The duration of the tween</param>
|
||||
|
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
|
public static Sequence DOJump(this Rigidbody target, Vector3 endValue, float jumpPower, int numJumps, float duration, bool snapping = false) |
||||
|
{ |
||||
|
if (numJumps < 1) numJumps = 1; |
||||
|
float startPosY = 0; |
||||
|
float offsetY = -1; |
||||
|
bool offsetYSet = false; |
||||
|
Sequence s = DOTween.Sequence(); |
||||
|
Tween yTween = DOTween.To(() => target.position, target.MovePosition, new Vector3(0, jumpPower, 0), duration / (numJumps * 2)) |
||||
|
.SetOptions(AxisConstraint.Y, snapping).SetEase(Ease.OutQuad).SetRelative() |
||||
|
.SetLoops(numJumps * 2, LoopType.Yoyo) |
||||
|
.OnStart(() => startPosY = target.position.y); |
||||
|
s.Append(DOTween.To(() => target.position, target.MovePosition, new Vector3(endValue.x, 0, 0), duration) |
||||
|
.SetOptions(AxisConstraint.X, snapping).SetEase(Ease.Linear) |
||||
|
).Join(DOTween.To(() => target.position, target.MovePosition, new Vector3(0, 0, endValue.z), duration) |
||||
|
.SetOptions(AxisConstraint.Z, snapping).SetEase(Ease.Linear) |
||||
|
).Join(yTween) |
||||
|
.SetTarget(target).SetEase(DOTween.defaultEaseType); |
||||
|
yTween.OnUpdate(() => { |
||||
|
if (!offsetYSet) { |
||||
|
offsetYSet = true; |
||||
|
offsetY = s.isRelative ? endValue.y : endValue.y - startPosY; |
||||
|
} |
||||
|
Vector3 pos = target.position; |
||||
|
pos.y += DOVirtual.EasedValue(0, offsetY, yTween.ElapsedPercentage(), Ease.OutQuad); |
||||
|
target.MovePosition(pos); |
||||
|
}); |
||||
|
return s; |
||||
|
} |
||||
|
|
||||
|
/// <summary>Tweens a Rigidbody's position through the given path waypoints, using the chosen path algorithm.
|
||||
|
/// Also stores the Rigidbody as the tween's target so it can be used for filtered operations.
|
||||
|
/// <para>NOTE: to tween a rigidbody correctly it should be set to kinematic at least while being tweened.</para>
|
||||
|
/// <para>BEWARE: doesn't work on Windows Phone store (waiting for Unity to fix their own bug).
|
||||
|
/// If you plan to publish there you should use a regular transform.DOPath.</para></summary>
|
||||
|
/// <param name="path">The waypoints to go through</param>
|
||||
|
/// <param name="duration">The duration of the tween</param>
|
||||
|
/// <param name="pathType">The type of path: Linear (straight path), CatmullRom (curved CatmullRom path) or CubicBezier (curved with control points)</param>
|
||||
|
/// <param name="pathMode">The path mode: 3D, side-scroller 2D, top-down 2D</param>
|
||||
|
/// <param name="resolution">The resolution of the path (useless in case of Linear paths): higher resolutions make for more detailed curved paths but are more expensive.
|
||||
|
/// Defaults to 10, but a value of 5 is usually enough if you don't have dramatic long curves between waypoints</param>
|
||||
|
/// <param name="gizmoColor">The color of the path (shown when gizmos are active in the Play panel and the tween is running)</param>
|
||||
|
public static TweenerCore<Vector3, Path, PathOptions> DOPath( |
||||
|
this Rigidbody target, Vector3[] path, float duration, PathType pathType = PathType.Linear, |
||||
|
PathMode pathMode = PathMode.Full3D, int resolution = 10, Color? gizmoColor = null |
||||
|
) |
||||
|
{ |
||||
|
if (resolution < 1) resolution = 1; |
||||
|
TweenerCore<Vector3, Path, PathOptions> t = DOTween.To(PathPlugin.Get(), () => target.position, target.MovePosition, new Path(pathType, path, resolution, gizmoColor), duration) |
||||
|
.SetTarget(target).SetUpdate(UpdateType.Fixed); |
||||
|
|
||||
|
t.plugOptions.isRigidbody = true; |
||||
|
t.plugOptions.mode = pathMode; |
||||
|
return t; |
||||
|
} |
||||
|
/// <summary>Tweens a Rigidbody's localPosition through the given path waypoints, using the chosen path algorithm.
|
||||
|
/// Also stores the Rigidbody as the tween's target so it can be used for filtered operations
|
||||
|
/// <para>NOTE: to tween a rigidbody correctly it should be set to kinematic at least while being tweened.</para>
|
||||
|
/// <para>BEWARE: doesn't work on Windows Phone store (waiting for Unity to fix their own bug).
|
||||
|
/// If you plan to publish there you should use a regular transform.DOLocalPath.</para></summary>
|
||||
|
/// <param name="path">The waypoint to go through</param>
|
||||
|
/// <param name="duration">The duration of the tween</param>
|
||||
|
/// <param name="pathType">The type of path: Linear (straight path), CatmullRom (curved CatmullRom path) or CubicBezier (curved with control points)</param>
|
||||
|
/// <param name="pathMode">The path mode: 3D, side-scroller 2D, top-down 2D</param>
|
||||
|
/// <param name="resolution">The resolution of the path: higher resolutions make for more detailed curved paths but are more expensive.
|
||||
|
/// Defaults to 10, but a value of 5 is usually enough if you don't have dramatic long curves between waypoints</param>
|
||||
|
/// <param name="gizmoColor">The color of the path (shown when gizmos are active in the Play panel and the tween is running)</param>
|
||||
|
public static TweenerCore<Vector3, Path, PathOptions> DOLocalPath( |
||||
|
this Rigidbody target, Vector3[] path, float duration, PathType pathType = PathType.Linear, |
||||
|
PathMode pathMode = PathMode.Full3D, int resolution = 10, Color? gizmoColor = null |
||||
|
) |
||||
|
{ |
||||
|
if (resolution < 1) resolution = 1; |
||||
|
Transform trans = target.transform; |
||||
|
TweenerCore<Vector3, Path, PathOptions> t = DOTween.To(PathPlugin.Get(), () => trans.localPosition, x => target.MovePosition(trans.parent == null ? x : trans.parent.TransformPoint(x)), new Path(pathType, path, resolution, gizmoColor), duration) |
||||
|
.SetTarget(target).SetUpdate(UpdateType.Fixed); |
||||
|
|
||||
|
t.plugOptions.isRigidbody = true; |
||||
|
t.plugOptions.mode = pathMode; |
||||
|
t.plugOptions.useLocalPosition = true; |
||||
|
return t; |
||||
|
} |
||||
|
// Used by path editor when creating the actual tween, so it can pass a pre-compiled path
|
||||
|
internal static TweenerCore<Vector3, Path, PathOptions> DOPath( |
||||
|
this Rigidbody target, Path path, float duration, PathMode pathMode = PathMode.Full3D |
||||
|
) |
||||
|
{ |
||||
|
TweenerCore<Vector3, Path, PathOptions> t = DOTween.To(PathPlugin.Get(), () => target.position, target.MovePosition, path, duration) |
||||
|
.SetTarget(target); |
||||
|
|
||||
|
t.plugOptions.isRigidbody = true; |
||||
|
t.plugOptions.mode = pathMode; |
||||
|
return t; |
||||
|
} |
||||
|
internal static TweenerCore<Vector3, Path, PathOptions> DOLocalPath( |
||||
|
this Rigidbody target, Path path, float duration, PathMode pathMode = PathMode.Full3D |
||||
|
) |
||||
|
{ |
||||
|
Transform trans = target.transform; |
||||
|
TweenerCore<Vector3, Path, PathOptions> t = DOTween.To(PathPlugin.Get(), () => trans.localPosition, x => target.MovePosition(trans.parent == null ? x : trans.parent.TransformPoint(x)), path, duration) |
||||
|
.SetTarget(target); |
||||
|
|
||||
|
t.plugOptions.isRigidbody = true; |
||||
|
t.plugOptions.mode = pathMode; |
||||
|
t.plugOptions.useLocalPosition = true; |
||||
|
return t; |
||||
|
} |
||||
|
|
||||
|
#endregion
|
||||
|
|
||||
|
#endregion
|
||||
|
|
||||
|
#endregion
|
||||
|
} |
||||
|
} |
||||
|
#endif
|
||||
@ -0,0 +1,11 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: 2e3555b24a552a84aaf58c90aa003b5b |
||||
|
MonoImporter: |
||||
|
externalObjects: {} |
||||
|
serializedVersion: 2 |
||||
|
defaultReferences: [] |
||||
|
executionOrder: 0 |
||||
|
icon: {instanceID: 0} |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
@ -0,0 +1,193 @@ |
|||||
|
// Author: Daniele Giardini - http://www.demigiant.com
|
||||
|
// Created: 2018/07/13
|
||||
|
|
||||
|
#if true && (UNITY_4_3 || UNITY_4_4 || UNITY_4_5 || UNITY_4_6 || UNITY_5 || UNITY_2017_1_OR_NEWER) // MODULE_MARKER
|
||||
|
using System; |
||||
|
using DG.Tweening.Core; |
||||
|
using DG.Tweening.Plugins; |
||||
|
using DG.Tweening.Plugins.Core.PathCore; |
||||
|
using DG.Tweening.Plugins.Options; |
||||
|
using UnityEngine; |
||||
|
|
||||
|
#pragma warning disable 1591
|
||||
|
namespace DG.Tweening |
||||
|
{ |
||||
|
public static class DOTweenModulePhysics2D |
||||
|
{ |
||||
|
#region Shortcuts
|
||||
|
|
||||
|
#region Rigidbody2D Shortcuts
|
||||
|
|
||||
|
/// <summary>Tweens a Rigidbody2D's position to the given value.
|
||||
|
/// Also stores the Rigidbody2D as the tween's target so it can be used for filtered operations</summary>
|
||||
|
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
|
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
|
public static TweenerCore<Vector2, Vector2, VectorOptions> DOMove(this Rigidbody2D target, Vector2 endValue, float duration, bool snapping = false) |
||||
|
{ |
||||
|
TweenerCore<Vector2, Vector2, VectorOptions> t = DOTween.To(() => target.position, target.MovePosition, endValue, duration); |
||||
|
t.SetOptions(snapping).SetTarget(target); |
||||
|
return t; |
||||
|
} |
||||
|
|
||||
|
/// <summary>Tweens a Rigidbody2D's X position to the given value.
|
||||
|
/// Also stores the Rigidbody2D as the tween's target so it can be used for filtered operations</summary>
|
||||
|
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
|
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
|
public static TweenerCore<Vector2, Vector2, VectorOptions> DOMoveX(this Rigidbody2D target, float endValue, float duration, bool snapping = false) |
||||
|
{ |
||||
|
TweenerCore<Vector2, Vector2, VectorOptions> t = DOTween.To(() => target.position, target.MovePosition, new Vector2(endValue, 0), duration); |
||||
|
t.SetOptions(AxisConstraint.X, snapping).SetTarget(target); |
||||
|
return t; |
||||
|
} |
||||
|
|
||||
|
/// <summary>Tweens a Rigidbody2D's Y position to the given value.
|
||||
|
/// Also stores the Rigidbody2D as the tween's target so it can be used for filtered operations</summary>
|
||||
|
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
|
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
|
public static TweenerCore<Vector2, Vector2, VectorOptions> DOMoveY(this Rigidbody2D target, float endValue, float duration, bool snapping = false) |
||||
|
{ |
||||
|
TweenerCore<Vector2, Vector2, VectorOptions> t = DOTween.To(() => target.position, target.MovePosition, new Vector2(0, endValue), duration); |
||||
|
t.SetOptions(AxisConstraint.Y, snapping).SetTarget(target); |
||||
|
return t; |
||||
|
} |
||||
|
|
||||
|
/// <summary>Tweens a Rigidbody2D's rotation to the given value.
|
||||
|
/// Also stores the Rigidbody2D as the tween's target so it can be used for filtered operations</summary>
|
||||
|
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
|
public static TweenerCore<float, float, FloatOptions> DORotate(this Rigidbody2D target, float endValue, float duration) |
||||
|
{ |
||||
|
TweenerCore<float, float, FloatOptions> t = DOTween.To(() => target.rotation, target.MoveRotation, endValue, duration); |
||||
|
t.SetTarget(target); |
||||
|
return t; |
||||
|
} |
||||
|
|
||||
|
#region Special
|
||||
|
|
||||
|
/// <summary>Tweens a Rigidbody2D's position to the given value, while also applying a jump effect along the Y axis.
|
||||
|
/// Returns a Sequence instead of a Tweener.
|
||||
|
/// Also stores the Rigidbody2D as the tween's target so it can be used for filtered operations.
|
||||
|
/// <para>IMPORTANT: a rigidbody2D can't be animated in a jump arc using MovePosition, so the tween will directly set the position</para></summary>
|
||||
|
/// <param name="endValue">The end value to reach</param>
|
||||
|
/// <param name="jumpPower">Power of the jump (the max height of the jump is represented by this plus the final Y offset)</param>
|
||||
|
/// <param name="numJumps">Total number of jumps</param>
|
||||
|
/// <param name="duration">The duration of the tween</param>
|
||||
|
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
|
public static Sequence DOJump(this Rigidbody2D target, Vector2 endValue, float jumpPower, int numJumps, float duration, bool snapping = false) |
||||
|
{ |
||||
|
if (numJumps < 1) numJumps = 1; |
||||
|
float startPosY = 0; |
||||
|
float offsetY = -1; |
||||
|
bool offsetYSet = false; |
||||
|
Sequence s = DOTween.Sequence(); |
||||
|
Tween yTween = DOTween.To(() => target.position, x => target.position = x, new Vector2(0, jumpPower), duration / (numJumps * 2)) |
||||
|
.SetOptions(AxisConstraint.Y, snapping).SetEase(Ease.OutQuad).SetRelative() |
||||
|
.SetLoops(numJumps * 2, LoopType.Yoyo) |
||||
|
.OnStart(() => startPosY = target.position.y); |
||||
|
s.Append(DOTween.To(() => target.position, x => target.position = x, new Vector2(endValue.x, 0), duration) |
||||
|
.SetOptions(AxisConstraint.X, snapping).SetEase(Ease.Linear) |
||||
|
).Join(yTween) |
||||
|
.SetTarget(target).SetEase(DOTween.defaultEaseType); |
||||
|
yTween.OnUpdate(() => { |
||||
|
if (!offsetYSet) { |
||||
|
offsetYSet = true; |
||||
|
offsetY = s.isRelative ? endValue.y : endValue.y - startPosY; |
||||
|
} |
||||
|
Vector3 pos = target.position; |
||||
|
pos.y += DOVirtual.EasedValue(0, offsetY, yTween.ElapsedPercentage(), Ease.OutQuad); |
||||
|
target.MovePosition(pos); |
||||
|
}); |
||||
|
return s; |
||||
|
} |
||||
|
|
||||
|
/// <summary>Tweens a Rigidbody2D's position through the given path waypoints, using the chosen path algorithm.
|
||||
|
/// Also stores the Rigidbody2D as the tween's target so it can be used for filtered operations.
|
||||
|
/// <para>NOTE: to tween a Rigidbody2D correctly it should be set to kinematic at least while being tweened.</para>
|
||||
|
/// <para>BEWARE: doesn't work on Windows Phone store (waiting for Unity to fix their own bug).
|
||||
|
/// If you plan to publish there you should use a regular transform.DOPath.</para></summary>
|
||||
|
/// <param name="path">The waypoints to go through</param>
|
||||
|
/// <param name="duration">The duration of the tween</param>
|
||||
|
/// <param name="pathType">The type of path: Linear (straight path), CatmullRom (curved CatmullRom path) or CubicBezier (curved with control points)</param>
|
||||
|
/// <param name="pathMode">The path mode: 3D, side-scroller 2D, top-down 2D</param>
|
||||
|
/// <param name="resolution">The resolution of the path (useless in case of Linear paths): higher resolutions make for more detailed curved paths but are more expensive.
|
||||
|
/// Defaults to 10, but a value of 5 is usually enough if you don't have dramatic long curves between waypoints</param>
|
||||
|
/// <param name="gizmoColor">The color of the path (shown when gizmos are active in the Play panel and the tween is running)</param>
|
||||
|
public static TweenerCore<Vector3, Path, PathOptions> DOPath( |
||||
|
this Rigidbody2D target, Vector2[] path, float duration, PathType pathType = PathType.Linear, |
||||
|
PathMode pathMode = PathMode.Full3D, int resolution = 10, Color? gizmoColor = null |
||||
|
) |
||||
|
{ |
||||
|
if (resolution < 1) resolution = 1; |
||||
|
int len = path.Length; |
||||
|
Vector3[] path3D = new Vector3[len]; |
||||
|
for (int i = 0; i < len; ++i) path3D[i] = path[i]; |
||||
|
TweenerCore<Vector3, Path, PathOptions> t = DOTween.To(PathPlugin.Get(), () => target.position, x => target.MovePosition(x), new Path(pathType, path3D, resolution, gizmoColor), duration) |
||||
|
.SetTarget(target).SetUpdate(UpdateType.Fixed); |
||||
|
|
||||
|
t.plugOptions.isRigidbody2D = true; |
||||
|
t.plugOptions.mode = pathMode; |
||||
|
return t; |
||||
|
} |
||||
|
/// <summary>Tweens a Rigidbody2D's localPosition through the given path waypoints, using the chosen path algorithm.
|
||||
|
/// Also stores the Rigidbody2D as the tween's target so it can be used for filtered operations
|
||||
|
/// <para>NOTE: to tween a Rigidbody2D correctly it should be set to kinematic at least while being tweened.</para>
|
||||
|
/// <para>BEWARE: doesn't work on Windows Phone store (waiting for Unity to fix their own bug).
|
||||
|
/// If you plan to publish there you should use a regular transform.DOLocalPath.</para></summary>
|
||||
|
/// <param name="path">The waypoint to go through</param>
|
||||
|
/// <param name="duration">The duration of the tween</param>
|
||||
|
/// <param name="pathType">The type of path: Linear (straight path), CatmullRom (curved CatmullRom path) or CubicBezier (curved with control points)</param>
|
||||
|
/// <param name="pathMode">The path mode: 3D, side-scroller 2D, top-down 2D</param>
|
||||
|
/// <param name="resolution">The resolution of the path: higher resolutions make for more detailed curved paths but are more expensive.
|
||||
|
/// Defaults to 10, but a value of 5 is usually enough if you don't have dramatic long curves between waypoints</param>
|
||||
|
/// <param name="gizmoColor">The color of the path (shown when gizmos are active in the Play panel and the tween is running)</param>
|
||||
|
public static TweenerCore<Vector3, Path, PathOptions> DOLocalPath( |
||||
|
this Rigidbody2D target, Vector2[] path, float duration, PathType pathType = PathType.Linear, |
||||
|
PathMode pathMode = PathMode.Full3D, int resolution = 10, Color? gizmoColor = null |
||||
|
) |
||||
|
{ |
||||
|
if (resolution < 1) resolution = 1; |
||||
|
int len = path.Length; |
||||
|
Vector3[] path3D = new Vector3[len]; |
||||
|
for (int i = 0; i < len; ++i) path3D[i] = path[i]; |
||||
|
Transform trans = target.transform; |
||||
|
TweenerCore<Vector3, Path, PathOptions> t = DOTween.To(PathPlugin.Get(), () => trans.localPosition, x => target.MovePosition(trans.parent == null ? x : trans.parent.TransformPoint(x)), new Path(pathType, path3D, resolution, gizmoColor), duration) |
||||
|
.SetTarget(target).SetUpdate(UpdateType.Fixed); |
||||
|
|
||||
|
t.plugOptions.isRigidbody2D = true; |
||||
|
t.plugOptions.mode = pathMode; |
||||
|
t.plugOptions.useLocalPosition = true; |
||||
|
return t; |
||||
|
} |
||||
|
// Used by path editor when creating the actual tween, so it can pass a pre-compiled path
|
||||
|
internal static TweenerCore<Vector3, Path, PathOptions> DOPath( |
||||
|
this Rigidbody2D target, Path path, float duration, PathMode pathMode = PathMode.Full3D |
||||
|
) |
||||
|
{ |
||||
|
TweenerCore<Vector3, Path, PathOptions> t = DOTween.To(PathPlugin.Get(), () => target.position, x => target.MovePosition(x), path, duration) |
||||
|
.SetTarget(target); |
||||
|
|
||||
|
t.plugOptions.isRigidbody2D = true; |
||||
|
t.plugOptions.mode = pathMode; |
||||
|
return t; |
||||
|
} |
||||
|
internal static TweenerCore<Vector3, Path, PathOptions> DOLocalPath( |
||||
|
this Rigidbody2D target, Path path, float duration, PathMode pathMode = PathMode.Full3D |
||||
|
) |
||||
|
{ |
||||
|
Transform trans = target.transform; |
||||
|
TweenerCore<Vector3, Path, PathOptions> t = DOTween.To(PathPlugin.Get(), () => trans.localPosition, x => target.MovePosition(trans.parent == null ? x : trans.parent.TransformPoint(x)), path, duration) |
||||
|
.SetTarget(target); |
||||
|
|
||||
|
t.plugOptions.isRigidbody2D = true; |
||||
|
t.plugOptions.mode = pathMode; |
||||
|
t.plugOptions.useLocalPosition = true; |
||||
|
return t; |
||||
|
} |
||||
|
|
||||
|
#endregion
|
||||
|
|
||||
|
#endregion
|
||||
|
|
||||
|
#endregion
|
||||
|
} |
||||
|
} |
||||
|
#endif
|
||||
@ -0,0 +1,11 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: 251409b8d360b5a4983fec10ca6b5d66 |
||||
|
MonoImporter: |
||||
|
externalObjects: {} |
||||
|
serializedVersion: 2 |
||||
|
defaultReferences: [] |
||||
|
executionOrder: 0 |
||||
|
icon: {instanceID: 0} |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
@ -0,0 +1,93 @@ |
|||||
|
// Author: Daniele Giardini - http://www.demigiant.com
|
||||
|
// Created: 2018/07/13
|
||||
|
|
||||
|
#if true && (UNITY_4_3 || UNITY_4_4 || UNITY_4_5 || UNITY_4_6 || UNITY_5 || UNITY_2017_1_OR_NEWER) // MODULE_MARKER
|
||||
|
using System; |
||||
|
using UnityEngine; |
||||
|
using DG.Tweening.Core; |
||||
|
using DG.Tweening.Plugins.Options; |
||||
|
|
||||
|
#pragma warning disable 1591
|
||||
|
namespace DG.Tweening |
||||
|
{ |
||||
|
public static class DOTweenModuleSprite |
||||
|
{ |
||||
|
#region Shortcuts
|
||||
|
|
||||
|
#region SpriteRenderer
|
||||
|
|
||||
|
/// <summary>Tweens a SpriteRenderer's color to the given value.
|
||||
|
/// Also stores the spriteRenderer as the tween's target so it can be used for filtered operations</summary>
|
||||
|
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
|
public static TweenerCore<Color, Color, ColorOptions> DOColor(this SpriteRenderer target, Color endValue, float duration) |
||||
|
{ |
||||
|
TweenerCore<Color, Color, ColorOptions> t = DOTween.To(() => target.color, x => target.color = x, endValue, duration); |
||||
|
t.SetTarget(target); |
||||
|
return t; |
||||
|
} |
||||
|
|
||||
|
/// <summary>Tweens a Material's alpha color to the given value.
|
||||
|
/// Also stores the spriteRenderer as the tween's target so it can be used for filtered operations</summary>
|
||||
|
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
|
public static TweenerCore<Color, Color, ColorOptions> DOFade(this SpriteRenderer target, float endValue, float duration) |
||||
|
{ |
||||
|
TweenerCore<Color, Color, ColorOptions> t = DOTween.ToAlpha(() => target.color, x => target.color = x, endValue, duration); |
||||
|
t.SetTarget(target); |
||||
|
return t; |
||||
|
} |
||||
|
|
||||
|
/// <summary>Tweens a SpriteRenderer's color using the given gradient
|
||||
|
/// (NOTE 1: only uses the colors of the gradient, not the alphas - NOTE 2: creates a Sequence, not a Tweener).
|
||||
|
/// Also stores the image as the tween's target so it can be used for filtered operations</summary>
|
||||
|
/// <param name="gradient">The gradient to use</param><param name="duration">The duration of the tween</param>
|
||||
|
public static Sequence DOGradientColor(this SpriteRenderer target, Gradient gradient, float duration) |
||||
|
{ |
||||
|
Sequence s = DOTween.Sequence(); |
||||
|
GradientColorKey[] colors = gradient.colorKeys; |
||||
|
int len = colors.Length; |
||||
|
for (int i = 0; i < len; ++i) { |
||||
|
GradientColorKey c = colors[i]; |
||||
|
if (i == 0 && c.time <= 0) { |
||||
|
target.color = c.color; |
||||
|
continue; |
||||
|
} |
||||
|
float colorDuration = i == len - 1 |
||||
|
? duration - s.Duration(false) // Verifies that total duration is correct
|
||||
|
: duration * (i == 0 ? c.time : c.time - colors[i - 1].time); |
||||
|
s.Append(target.DOColor(c.color, colorDuration).SetEase(Ease.Linear)); |
||||
|
} |
||||
|
s.SetTarget(target); |
||||
|
return s; |
||||
|
} |
||||
|
|
||||
|
#endregion
|
||||
|
|
||||
|
#region Blendables
|
||||
|
|
||||
|
#region SpriteRenderer
|
||||
|
|
||||
|
/// <summary>Tweens a SpriteRenderer's color to the given value,
|
||||
|
/// in a way that allows other DOBlendableColor tweens to work together on the same target,
|
||||
|
/// instead than fight each other as multiple DOColor would do.
|
||||
|
/// Also stores the SpriteRenderer as the tween's target so it can be used for filtered operations</summary>
|
||||
|
/// <param name="endValue">The value to tween to</param><param name="duration">The duration of the tween</param>
|
||||
|
public static Tweener DOBlendableColor(this SpriteRenderer target, Color endValue, float duration) |
||||
|
{ |
||||
|
endValue = endValue - target.color; |
||||
|
Color to = new Color(0, 0, 0, 0); |
||||
|
return DOTween.To(() => to, x => { |
||||
|
Color diff = x - to; |
||||
|
to = x; |
||||
|
target.color += diff; |
||||
|
}, endValue, duration) |
||||
|
.Blendable().SetTarget(target); |
||||
|
} |
||||
|
|
||||
|
#endregion
|
||||
|
|
||||
|
#endregion
|
||||
|
|
||||
|
#endregion
|
||||
|
} |
||||
|
} |
||||
|
#endif
|
||||
@ -0,0 +1,11 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: a6b86d85a3f11214c83609d1209c5fd0 |
||||
|
MonoImporter: |
||||
|
externalObjects: {} |
||||
|
serializedVersion: 2 |
||||
|
defaultReferences: [] |
||||
|
executionOrder: 0 |
||||
|
icon: {instanceID: 0} |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
@ -0,0 +1,660 @@ |
|||||
|
// Author: Daniele Giardini - http://www.demigiant.com
|
||||
|
// Created: 2018/07/13
|
||||
|
|
||||
|
#if true && (UNITY_4_6 || UNITY_5 || UNITY_2017_1_OR_NEWER) // MODULE_MARKER
|
||||
|
|
||||
|
using System; |
||||
|
using System.Globalization; |
||||
|
using UnityEngine; |
||||
|
using UnityEngine.UI; |
||||
|
using DG.Tweening.Core; |
||||
|
using DG.Tweening.Core.Enums; |
||||
|
using DG.Tweening.Plugins; |
||||
|
using DG.Tweening.Plugins.Options; |
||||
|
using Outline = UnityEngine.UI.Outline; |
||||
|
using Text = UnityEngine.UI.Text; |
||||
|
|
||||
|
#pragma warning disable 1591
|
||||
|
namespace DG.Tweening |
||||
|
{ |
||||
|
public static class DOTweenModuleUI |
||||
|
{ |
||||
|
#region Shortcuts
|
||||
|
|
||||
|
#region CanvasGroup
|
||||
|
|
||||
|
/// <summary>Tweens a CanvasGroup's alpha color to the given value.
|
||||
|
/// Also stores the canvasGroup as the tween's target so it can be used for filtered operations</summary>
|
||||
|
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
|
public static TweenerCore<float, float, FloatOptions> DOFade(this CanvasGroup target, float endValue, float duration) |
||||
|
{ |
||||
|
TweenerCore<float, float, FloatOptions> t = DOTween.To(() => target.alpha, x => target.alpha = x, endValue, duration); |
||||
|
t.SetTarget(target); |
||||
|
return t; |
||||
|
} |
||||
|
|
||||
|
#endregion
|
||||
|
|
||||
|
#region Graphic
|
||||
|
|
||||
|
/// <summary>Tweens an Graphic's color to the given value.
|
||||
|
/// Also stores the image as the tween's target so it can be used for filtered operations</summary>
|
||||
|
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
|
public static TweenerCore<Color, Color, ColorOptions> DOColor(this Graphic target, Color endValue, float duration) |
||||
|
{ |
||||
|
TweenerCore<Color, Color, ColorOptions> t = DOTween.To(() => target.color, x => target.color = x, endValue, duration); |
||||
|
t.SetTarget(target); |
||||
|
return t; |
||||
|
} |
||||
|
|
||||
|
/// <summary>Tweens an Graphic's alpha color to the given value.
|
||||
|
/// Also stores the image as the tween's target so it can be used for filtered operations</summary>
|
||||
|
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
|
public static TweenerCore<Color, Color, ColorOptions> DOFade(this Graphic target, float endValue, float duration) |
||||
|
{ |
||||
|
TweenerCore<Color, Color, ColorOptions> t = DOTween.ToAlpha(() => target.color, x => target.color = x, endValue, duration); |
||||
|
t.SetTarget(target); |
||||
|
return t; |
||||
|
} |
||||
|
|
||||
|
#endregion
|
||||
|
|
||||
|
#region Image
|
||||
|
|
||||
|
/// <summary>Tweens an Image's color to the given value.
|
||||
|
/// Also stores the image as the tween's target so it can be used for filtered operations</summary>
|
||||
|
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
|
public static TweenerCore<Color, Color, ColorOptions> DOColor(this Image target, Color endValue, float duration) |
||||
|
{ |
||||
|
TweenerCore<Color, Color, ColorOptions> t = DOTween.To(() => target.color, x => target.color = x, endValue, duration); |
||||
|
t.SetTarget(target); |
||||
|
return t; |
||||
|
} |
||||
|
|
||||
|
/// <summary>Tweens an Image's alpha color to the given value.
|
||||
|
/// Also stores the image as the tween's target so it can be used for filtered operations</summary>
|
||||
|
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
|
public static TweenerCore<Color, Color, ColorOptions> DOFade(this Image target, float endValue, float duration) |
||||
|
{ |
||||
|
TweenerCore<Color, Color, ColorOptions> t = DOTween.ToAlpha(() => target.color, x => target.color = x, endValue, duration); |
||||
|
t.SetTarget(target); |
||||
|
return t; |
||||
|
} |
||||
|
|
||||
|
/// <summary>Tweens an Image's fillAmount to the given value.
|
||||
|
/// Also stores the image as the tween's target so it can be used for filtered operations</summary>
|
||||
|
/// <param name="endValue">The end value to reach (0 to 1)</param><param name="duration">The duration of the tween</param>
|
||||
|
public static TweenerCore<float, float, FloatOptions> DOFillAmount(this Image target, float endValue, float duration) |
||||
|
{ |
||||
|
if (endValue > 1) endValue = 1; |
||||
|
else if (endValue < 0) endValue = 0; |
||||
|
TweenerCore<float, float, FloatOptions> t = DOTween.To(() => target.fillAmount, x => target.fillAmount = x, endValue, duration); |
||||
|
t.SetTarget(target); |
||||
|
return t; |
||||
|
} |
||||
|
|
||||
|
/// <summary>Tweens an Image's colors using the given gradient
|
||||
|
/// (NOTE 1: only uses the colors of the gradient, not the alphas - NOTE 2: creates a Sequence, not a Tweener).
|
||||
|
/// Also stores the image as the tween's target so it can be used for filtered operations</summary>
|
||||
|
/// <param name="gradient">The gradient to use</param><param name="duration">The duration of the tween</param>
|
||||
|
public static Sequence DOGradientColor(this Image target, Gradient gradient, float duration) |
||||
|
{ |
||||
|
Sequence s = DOTween.Sequence(); |
||||
|
GradientColorKey[] colors = gradient.colorKeys; |
||||
|
int len = colors.Length; |
||||
|
for (int i = 0; i < len; ++i) { |
||||
|
GradientColorKey c = colors[i]; |
||||
|
if (i == 0 && c.time <= 0) { |
||||
|
target.color = c.color; |
||||
|
continue; |
||||
|
} |
||||
|
float colorDuration = i == len - 1 |
||||
|
? duration - s.Duration(false) // Verifies that total duration is correct
|
||||
|
: duration * (i == 0 ? c.time : c.time - colors[i - 1].time); |
||||
|
s.Append(target.DOColor(c.color, colorDuration).SetEase(Ease.Linear)); |
||||
|
} |
||||
|
s.SetTarget(target); |
||||
|
return s; |
||||
|
} |
||||
|
|
||||
|
#endregion
|
||||
|
|
||||
|
#region LayoutElement
|
||||
|
|
||||
|
/// <summary>Tweens an LayoutElement's flexibleWidth/Height to the given value.
|
||||
|
/// Also stores the LayoutElement as the tween's target so it can be used for filtered operations</summary>
|
||||
|
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
|
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
|
public static TweenerCore<Vector2, Vector2, VectorOptions> DOFlexibleSize(this LayoutElement target, Vector2 endValue, float duration, bool snapping = false) |
||||
|
{ |
||||
|
TweenerCore<Vector2, Vector2, VectorOptions> t = DOTween.To(() => new Vector2(target.flexibleWidth, target.flexibleHeight), x => { |
||||
|
target.flexibleWidth = x.x; |
||||
|
target.flexibleHeight = x.y; |
||||
|
}, endValue, duration); |
||||
|
t.SetOptions(snapping).SetTarget(target); |
||||
|
return t; |
||||
|
} |
||||
|
|
||||
|
/// <summary>Tweens an LayoutElement's minWidth/Height to the given value.
|
||||
|
/// Also stores the LayoutElement as the tween's target so it can be used for filtered operations</summary>
|
||||
|
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
|
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
|
public static TweenerCore<Vector2, Vector2, VectorOptions> DOMinSize(this LayoutElement target, Vector2 endValue, float duration, bool snapping = false) |
||||
|
{ |
||||
|
TweenerCore<Vector2, Vector2, VectorOptions> t = DOTween.To(() => new Vector2(target.minWidth, target.minHeight), x => { |
||||
|
target.minWidth = x.x; |
||||
|
target.minHeight = x.y; |
||||
|
}, endValue, duration); |
||||
|
t.SetOptions(snapping).SetTarget(target); |
||||
|
return t; |
||||
|
} |
||||
|
|
||||
|
/// <summary>Tweens an LayoutElement's preferredWidth/Height to the given value.
|
||||
|
/// Also stores the LayoutElement as the tween's target so it can be used for filtered operations</summary>
|
||||
|
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
|
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
|
public static TweenerCore<Vector2, Vector2, VectorOptions> DOPreferredSize(this LayoutElement target, Vector2 endValue, float duration, bool snapping = false) |
||||
|
{ |
||||
|
TweenerCore<Vector2, Vector2, VectorOptions> t = DOTween.To(() => new Vector2(target.preferredWidth, target.preferredHeight), x => { |
||||
|
target.preferredWidth = x.x; |
||||
|
target.preferredHeight = x.y; |
||||
|
}, endValue, duration); |
||||
|
t.SetOptions(snapping).SetTarget(target); |
||||
|
return t; |
||||
|
} |
||||
|
|
||||
|
#endregion
|
||||
|
|
||||
|
#region Outline
|
||||
|
|
||||
|
/// <summary>Tweens a Outline's effectColor to the given value.
|
||||
|
/// Also stores the Outline as the tween's target so it can be used for filtered operations</summary>
|
||||
|
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
|
public static TweenerCore<Color, Color, ColorOptions> DOColor(this Outline target, Color endValue, float duration) |
||||
|
{ |
||||
|
TweenerCore<Color, Color, ColorOptions> t = DOTween.To(() => target.effectColor, x => target.effectColor = x, endValue, duration); |
||||
|
t.SetTarget(target); |
||||
|
return t; |
||||
|
} |
||||
|
|
||||
|
/// <summary>Tweens a Outline's effectColor alpha to the given value.
|
||||
|
/// Also stores the Outline as the tween's target so it can be used for filtered operations</summary>
|
||||
|
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
|
public static TweenerCore<Color, Color, ColorOptions> DOFade(this Outline target, float endValue, float duration) |
||||
|
{ |
||||
|
TweenerCore<Color, Color, ColorOptions> t = DOTween.ToAlpha(() => target.effectColor, x => target.effectColor = x, endValue, duration); |
||||
|
t.SetTarget(target); |
||||
|
return t; |
||||
|
} |
||||
|
|
||||
|
/// <summary>Tweens a Outline's effectDistance to the given value.
|
||||
|
/// Also stores the Outline as the tween's target so it can be used for filtered operations</summary>
|
||||
|
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
|
public static TweenerCore<Vector2, Vector2, VectorOptions> DOScale(this Outline target, Vector2 endValue, float duration) |
||||
|
{ |
||||
|
TweenerCore<Vector2, Vector2, VectorOptions> t = DOTween.To(() => target.effectDistance, x => target.effectDistance = x, endValue, duration); |
||||
|
t.SetTarget(target); |
||||
|
return t; |
||||
|
} |
||||
|
|
||||
|
#endregion
|
||||
|
|
||||
|
#region RectTransform
|
||||
|
|
||||
|
/// <summary>Tweens a RectTransform's anchoredPosition to the given value.
|
||||
|
/// Also stores the RectTransform as the tween's target so it can be used for filtered operations</summary>
|
||||
|
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
|
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
|
public static TweenerCore<Vector2, Vector2, VectorOptions> DOAnchorPos(this RectTransform target, Vector2 endValue, float duration, bool snapping = false) |
||||
|
{ |
||||
|
TweenerCore<Vector2, Vector2, VectorOptions> t = DOTween.To(() => target.anchoredPosition, x => target.anchoredPosition = x, endValue, duration); |
||||
|
t.SetOptions(snapping).SetTarget(target); |
||||
|
return t; |
||||
|
} |
||||
|
/// <summary>Tweens a RectTransform's anchoredPosition X to the given value.
|
||||
|
/// Also stores the RectTransform as the tween's target so it can be used for filtered operations</summary>
|
||||
|
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
|
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
|
public static TweenerCore<Vector2, Vector2, VectorOptions> DOAnchorPosX(this RectTransform target, float endValue, float duration, bool snapping = false) |
||||
|
{ |
||||
|
TweenerCore<Vector2, Vector2, VectorOptions> t = DOTween.To(() => target.anchoredPosition, x => target.anchoredPosition = x, new Vector2(endValue, 0), duration); |
||||
|
t.SetOptions(AxisConstraint.X, snapping).SetTarget(target); |
||||
|
return t; |
||||
|
} |
||||
|
/// <summary>Tweens a RectTransform's anchoredPosition Y to the given value.
|
||||
|
/// Also stores the RectTransform as the tween's target so it can be used for filtered operations</summary>
|
||||
|
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
|
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
|
public static TweenerCore<Vector2, Vector2, VectorOptions> DOAnchorPosY(this RectTransform target, float endValue, float duration, bool snapping = false) |
||||
|
{ |
||||
|
TweenerCore<Vector2, Vector2, VectorOptions> t = DOTween.To(() => target.anchoredPosition, x => target.anchoredPosition = x, new Vector2(0, endValue), duration); |
||||
|
t.SetOptions(AxisConstraint.Y, snapping).SetTarget(target); |
||||
|
return t; |
||||
|
} |
||||
|
|
||||
|
/// <summary>Tweens a RectTransform's anchoredPosition3D to the given value.
|
||||
|
/// Also stores the RectTransform as the tween's target so it can be used for filtered operations</summary>
|
||||
|
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
|
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
|
public static TweenerCore<Vector3, Vector3, VectorOptions> DOAnchorPos3D(this RectTransform target, Vector3 endValue, float duration, bool snapping = false) |
||||
|
{ |
||||
|
TweenerCore<Vector3, Vector3, VectorOptions> t = DOTween.To(() => target.anchoredPosition3D, x => target.anchoredPosition3D = x, endValue, duration); |
||||
|
t.SetOptions(snapping).SetTarget(target); |
||||
|
return t; |
||||
|
} |
||||
|
/// <summary>Tweens a RectTransform's anchoredPosition3D X to the given value.
|
||||
|
/// Also stores the RectTransform as the tween's target so it can be used for filtered operations</summary>
|
||||
|
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
|
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
|
public static TweenerCore<Vector3, Vector3, VectorOptions> DOAnchorPos3DX(this RectTransform target, float endValue, float duration, bool snapping = false) |
||||
|
{ |
||||
|
TweenerCore<Vector3, Vector3, VectorOptions> t = DOTween.To(() => target.anchoredPosition3D, x => target.anchoredPosition3D = x, new Vector3(endValue, 0, 0), duration); |
||||
|
t.SetOptions(AxisConstraint.X, snapping).SetTarget(target); |
||||
|
return t; |
||||
|
} |
||||
|
/// <summary>Tweens a RectTransform's anchoredPosition3D Y to the given value.
|
||||
|
/// Also stores the RectTransform as the tween's target so it can be used for filtered operations</summary>
|
||||
|
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
|
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
|
public static TweenerCore<Vector3, Vector3, VectorOptions> DOAnchorPos3DY(this RectTransform target, float endValue, float duration, bool snapping = false) |
||||
|
{ |
||||
|
TweenerCore<Vector3, Vector3, VectorOptions> t = DOTween.To(() => target.anchoredPosition3D, x => target.anchoredPosition3D = x, new Vector3(0, endValue, 0), duration); |
||||
|
t.SetOptions(AxisConstraint.Y, snapping).SetTarget(target); |
||||
|
return t; |
||||
|
} |
||||
|
/// <summary>Tweens a RectTransform's anchoredPosition3D Z to the given value.
|
||||
|
/// Also stores the RectTransform as the tween's target so it can be used for filtered operations</summary>
|
||||
|
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
|
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
|
public static TweenerCore<Vector3, Vector3, VectorOptions> DOAnchorPos3DZ(this RectTransform target, float endValue, float duration, bool snapping = false) |
||||
|
{ |
||||
|
TweenerCore<Vector3, Vector3, VectorOptions> t = DOTween.To(() => target.anchoredPosition3D, x => target.anchoredPosition3D = x, new Vector3(0, 0, endValue), duration); |
||||
|
t.SetOptions(AxisConstraint.Z, snapping).SetTarget(target); |
||||
|
return t; |
||||
|
} |
||||
|
|
||||
|
/// <summary>Tweens a RectTransform's anchorMax to the given value.
|
||||
|
/// Also stores the RectTransform as the tween's target so it can be used for filtered operations</summary>
|
||||
|
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
|
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
|
public static TweenerCore<Vector2, Vector2, VectorOptions> DOAnchorMax(this RectTransform target, Vector2 endValue, float duration, bool snapping = false) |
||||
|
{ |
||||
|
TweenerCore<Vector2, Vector2, VectorOptions> t = DOTween.To(() => target.anchorMax, x => target.anchorMax = x, endValue, duration); |
||||
|
t.SetOptions(snapping).SetTarget(target); |
||||
|
return t; |
||||
|
} |
||||
|
|
||||
|
/// <summary>Tweens a RectTransform's anchorMin to the given value.
|
||||
|
/// Also stores the RectTransform as the tween's target so it can be used for filtered operations</summary>
|
||||
|
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
|
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
|
public static TweenerCore<Vector2, Vector2, VectorOptions> DOAnchorMin(this RectTransform target, Vector2 endValue, float duration, bool snapping = false) |
||||
|
{ |
||||
|
TweenerCore<Vector2, Vector2, VectorOptions> t = DOTween.To(() => target.anchorMin, x => target.anchorMin = x, endValue, duration); |
||||
|
t.SetOptions(snapping).SetTarget(target); |
||||
|
return t; |
||||
|
} |
||||
|
|
||||
|
/// <summary>Tweens a RectTransform's pivot to the given value.
|
||||
|
/// Also stores the RectTransform as the tween's target so it can be used for filtered operations</summary>
|
||||
|
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
|
public static TweenerCore<Vector2, Vector2, VectorOptions> DOPivot(this RectTransform target, Vector2 endValue, float duration) |
||||
|
{ |
||||
|
TweenerCore<Vector2, Vector2, VectorOptions> t = DOTween.To(() => target.pivot, x => target.pivot = x, endValue, duration); |
||||
|
t.SetTarget(target); |
||||
|
return t; |
||||
|
} |
||||
|
/// <summary>Tweens a RectTransform's pivot X to the given value.
|
||||
|
/// Also stores the RectTransform as the tween's target so it can be used for filtered operations</summary>
|
||||
|
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
|
public static TweenerCore<Vector2, Vector2, VectorOptions> DOPivotX(this RectTransform target, float endValue, float duration) |
||||
|
{ |
||||
|
TweenerCore<Vector2, Vector2, VectorOptions> t = DOTween.To(() => target.pivot, x => target.pivot = x, new Vector2(endValue, 0), duration); |
||||
|
t.SetOptions(AxisConstraint.X).SetTarget(target); |
||||
|
return t; |
||||
|
} |
||||
|
/// <summary>Tweens a RectTransform's pivot Y to the given value.
|
||||
|
/// Also stores the RectTransform as the tween's target so it can be used for filtered operations</summary>
|
||||
|
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
|
public static TweenerCore<Vector2, Vector2, VectorOptions> DOPivotY(this RectTransform target, float endValue, float duration) |
||||
|
{ |
||||
|
TweenerCore<Vector2, Vector2, VectorOptions> t = DOTween.To(() => target.pivot, x => target.pivot = x, new Vector2(0, endValue), duration); |
||||
|
t.SetOptions(AxisConstraint.Y).SetTarget(target); |
||||
|
return t; |
||||
|
} |
||||
|
|
||||
|
/// <summary>Tweens a RectTransform's sizeDelta to the given value.
|
||||
|
/// Also stores the RectTransform as the tween's target so it can be used for filtered operations</summary>
|
||||
|
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
|
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
|
public static TweenerCore<Vector2, Vector2, VectorOptions> DOSizeDelta(this RectTransform target, Vector2 endValue, float duration, bool snapping = false) |
||||
|
{ |
||||
|
TweenerCore<Vector2, Vector2, VectorOptions> t = DOTween.To(() => target.sizeDelta, x => target.sizeDelta = x, endValue, duration); |
||||
|
t.SetOptions(snapping).SetTarget(target); |
||||
|
return t; |
||||
|
} |
||||
|
|
||||
|
/// <summary>Punches a RectTransform's anchoredPosition towards the given direction and then back to the starting one
|
||||
|
/// as if it was connected to the starting position via an elastic.
|
||||
|
/// Also stores the RectTransform as the tween's target so it can be used for filtered operations</summary>
|
||||
|
/// <param name="punch">The direction and strength of the punch (added to the RectTransform's current position)</param>
|
||||
|
/// <param name="duration">The duration of the tween</param>
|
||||
|
/// <param name="vibrato">Indicates how much will the punch vibrate</param>
|
||||
|
/// <param name="elasticity">Represents how much (0 to 1) the vector will go beyond the starting position when bouncing backwards.
|
||||
|
/// 1 creates a full oscillation between the punch direction and the opposite direction,
|
||||
|
/// while 0 oscillates only between the punch and the start position</param>
|
||||
|
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
|
public static Tweener DOPunchAnchorPos(this RectTransform target, Vector2 punch, float duration, int vibrato = 10, float elasticity = 1, bool snapping = false) |
||||
|
{ |
||||
|
return DOTween.Punch(() => target.anchoredPosition, x => target.anchoredPosition = x, punch, duration, vibrato, elasticity) |
||||
|
.SetTarget(target).SetOptions(snapping); |
||||
|
} |
||||
|
|
||||
|
/// <summary>Shakes a RectTransform's anchoredPosition with the given values.
|
||||
|
/// Also stores the RectTransform as the tween's target so it can be used for filtered operations</summary>
|
||||
|
/// <param name="duration">The duration of the tween</param>
|
||||
|
/// <param name="strength">The shake strength</param>
|
||||
|
/// <param name="vibrato">Indicates how much will the shake vibrate</param>
|
||||
|
/// <param name="randomness">Indicates how much the shake will be random (0 to 180 - values higher than 90 kind of suck, so beware).
|
||||
|
/// Setting it to 0 will shake along a single direction.</param>
|
||||
|
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
|
/// <param name="fadeOut">If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not</param>
|
||||
|
public static Tweener DOShakeAnchorPos(this RectTransform target, float duration, float strength = 100, int vibrato = 10, float randomness = 90, bool snapping = false, bool fadeOut = true) |
||||
|
{ |
||||
|
return DOTween.Shake(() => target.anchoredPosition, x => target.anchoredPosition = x, duration, strength, vibrato, randomness, true, fadeOut) |
||||
|
.SetTarget(target).SetSpecialStartupMode(SpecialStartupMode.SetShake).SetOptions(snapping); |
||||
|
} |
||||
|
/// <summary>Shakes a RectTransform's anchoredPosition with the given values.
|
||||
|
/// Also stores the RectTransform as the tween's target so it can be used for filtered operations</summary>
|
||||
|
/// <param name="duration">The duration of the tween</param>
|
||||
|
/// <param name="strength">The shake strength on each axis</param>
|
||||
|
/// <param name="vibrato">Indicates how much will the shake vibrate</param>
|
||||
|
/// <param name="randomness">Indicates how much the shake will be random (0 to 180 - values higher than 90 kind of suck, so beware).
|
||||
|
/// Setting it to 0 will shake along a single direction.</param>
|
||||
|
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
|
/// <param name="fadeOut">If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not</param>
|
||||
|
public static Tweener DOShakeAnchorPos(this RectTransform target, float duration, Vector2 strength, int vibrato = 10, float randomness = 90, bool snapping = false, bool fadeOut = true) |
||||
|
{ |
||||
|
return DOTween.Shake(() => target.anchoredPosition, x => target.anchoredPosition = x, duration, strength, vibrato, randomness, fadeOut) |
||||
|
.SetTarget(target).SetSpecialStartupMode(SpecialStartupMode.SetShake).SetOptions(snapping); |
||||
|
} |
||||
|
|
||||
|
#region Special
|
||||
|
|
||||
|
/// <summary>Tweens a RectTransform's anchoredPosition to the given value, while also applying a jump effect along the Y axis.
|
||||
|
/// Returns a Sequence instead of a Tweener.
|
||||
|
/// Also stores the RectTransform as the tween's target so it can be used for filtered operations</summary>
|
||||
|
/// <param name="endValue">The end value to reach</param>
|
||||
|
/// <param name="jumpPower">Power of the jump (the max height of the jump is represented by this plus the final Y offset)</param>
|
||||
|
/// <param name="numJumps">Total number of jumps</param>
|
||||
|
/// <param name="duration">The duration of the tween</param>
|
||||
|
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
|
public static Sequence DOJumpAnchorPos(this RectTransform target, Vector2 endValue, float jumpPower, int numJumps, float duration, bool snapping = false) |
||||
|
{ |
||||
|
if (numJumps < 1) numJumps = 1; |
||||
|
float startPosY = 0; |
||||
|
float offsetY = -1; |
||||
|
bool offsetYSet = false; |
||||
|
|
||||
|
// Separate Y Tween so we can elaborate elapsedPercentage on that insted of on the Sequence
|
||||
|
// (in case users add a delay or other elements to the Sequence)
|
||||
|
Sequence s = DOTween.Sequence(); |
||||
|
Tween yTween = DOTween.To(() => target.anchoredPosition, x => target.anchoredPosition = x, new Vector2(0, jumpPower), duration / (numJumps * 2)) |
||||
|
.SetOptions(AxisConstraint.Y, snapping).SetEase(Ease.OutQuad).SetRelative() |
||||
|
.SetLoops(numJumps * 2, LoopType.Yoyo) |
||||
|
.OnStart(()=> startPosY = target.anchoredPosition.y); |
||||
|
s.Append(DOTween.To(() => target.anchoredPosition, x => target.anchoredPosition = x, new Vector2(endValue.x, 0), duration) |
||||
|
.SetOptions(AxisConstraint.X, snapping).SetEase(Ease.Linear) |
||||
|
).Join(yTween) |
||||
|
.SetTarget(target).SetEase(DOTween.defaultEaseType); |
||||
|
s.OnUpdate(() => { |
||||
|
if (!offsetYSet) { |
||||
|
offsetYSet = true; |
||||
|
offsetY = s.isRelative ? endValue.y : endValue.y - startPosY; |
||||
|
} |
||||
|
Vector2 pos = target.anchoredPosition; |
||||
|
pos.y += DOVirtual.EasedValue(0, offsetY, s.ElapsedDirectionalPercentage(), Ease.OutQuad); |
||||
|
target.anchoredPosition = pos; |
||||
|
}); |
||||
|
return s; |
||||
|
} |
||||
|
|
||||
|
#endregion
|
||||
|
|
||||
|
#endregion
|
||||
|
|
||||
|
#region ScrollRect
|
||||
|
|
||||
|
/// <summary>Tweens a ScrollRect's horizontal/verticalNormalizedPosition to the given value.
|
||||
|
/// Also stores the ScrollRect as the tween's target so it can be used for filtered operations</summary>
|
||||
|
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
|
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
|
public static Tweener DONormalizedPos(this ScrollRect target, Vector2 endValue, float duration, bool snapping = false) |
||||
|
{ |
||||
|
return DOTween.To(() => new Vector2(target.horizontalNormalizedPosition, target.verticalNormalizedPosition), |
||||
|
x => { |
||||
|
target.horizontalNormalizedPosition = x.x; |
||||
|
target.verticalNormalizedPosition = x.y; |
||||
|
}, endValue, duration) |
||||
|
.SetOptions(snapping).SetTarget(target); |
||||
|
} |
||||
|
/// <summary>Tweens a ScrollRect's horizontalNormalizedPosition to the given value.
|
||||
|
/// Also stores the ScrollRect as the tween's target so it can be used for filtered operations</summary>
|
||||
|
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
|
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
|
public static Tweener DOHorizontalNormalizedPos(this ScrollRect target, float endValue, float duration, bool snapping = false) |
||||
|
{ |
||||
|
return DOTween.To(() => target.horizontalNormalizedPosition, x => target.horizontalNormalizedPosition = x, endValue, duration) |
||||
|
.SetOptions(snapping).SetTarget(target); |
||||
|
} |
||||
|
/// <summary>Tweens a ScrollRect's verticalNormalizedPosition to the given value.
|
||||
|
/// Also stores the ScrollRect as the tween's target so it can be used for filtered operations</summary>
|
||||
|
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
|
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
|
public static Tweener DOVerticalNormalizedPos(this ScrollRect target, float endValue, float duration, bool snapping = false) |
||||
|
{ |
||||
|
return DOTween.To(() => target.verticalNormalizedPosition, x => target.verticalNormalizedPosition = x, endValue, duration) |
||||
|
.SetOptions(snapping).SetTarget(target); |
||||
|
} |
||||
|
|
||||
|
#endregion
|
||||
|
|
||||
|
#region Slider
|
||||
|
|
||||
|
/// <summary>Tweens a Slider's value to the given value.
|
||||
|
/// Also stores the Slider as the tween's target so it can be used for filtered operations</summary>
|
||||
|
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
|
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
|
public static TweenerCore<float, float, FloatOptions> DOValue(this Slider target, float endValue, float duration, bool snapping = false) |
||||
|
{ |
||||
|
TweenerCore<float, float, FloatOptions> t = DOTween.To(() => target.value, x => target.value = x, endValue, duration); |
||||
|
t.SetOptions(snapping).SetTarget(target); |
||||
|
return t; |
||||
|
} |
||||
|
|
||||
|
#endregion
|
||||
|
|
||||
|
#region Text
|
||||
|
|
||||
|
/// <summary>Tweens a Text's color to the given value.
|
||||
|
/// Also stores the Text as the tween's target so it can be used for filtered operations</summary>
|
||||
|
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
|
public static TweenerCore<Color, Color, ColorOptions> DOColor(this Text target, Color endValue, float duration) |
||||
|
{ |
||||
|
TweenerCore<Color, Color, ColorOptions> t = DOTween.To(() => target.color, x => target.color = x, endValue, duration); |
||||
|
t.SetTarget(target); |
||||
|
return t; |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Tweens a Text's text from one integer to another, with options for thousands separators
|
||||
|
/// </summary>
|
||||
|
/// <param name="fromValue">The value to start from</param>
|
||||
|
/// <param name="endValue">The end value to reach</param>
|
||||
|
/// <param name="duration">The duration of the tween</param>
|
||||
|
/// <param name="addThousandsSeparator">If TRUE (default) also adds thousands separators</param>
|
||||
|
/// <param name="culture">The <see cref="CultureInfo"/> to use (InvariantCulture if NULL)</param>
|
||||
|
public static TweenerCore<int, int, NoOptions> DOCounter( |
||||
|
this Text target, int fromValue, int endValue, float duration, bool addThousandsSeparator = true, CultureInfo culture = null |
||||
|
){ |
||||
|
int v = fromValue; |
||||
|
CultureInfo cInfo = !addThousandsSeparator ? null : culture ?? CultureInfo.InvariantCulture; |
||||
|
TweenerCore<int, int, NoOptions> t = DOTween.To(() => v, x => { |
||||
|
v = x; |
||||
|
target.text = addThousandsSeparator |
||||
|
? v.ToString("N0", cInfo) |
||||
|
: v.ToString(); |
||||
|
}, endValue, duration); |
||||
|
t.SetTarget(target); |
||||
|
return t; |
||||
|
} |
||||
|
|
||||
|
/// <summary>Tweens a Text's alpha color to the given value.
|
||||
|
/// Also stores the Text as the tween's target so it can be used for filtered operations</summary>
|
||||
|
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
|
public static TweenerCore<Color, Color, ColorOptions> DOFade(this Text target, float endValue, float duration) |
||||
|
{ |
||||
|
TweenerCore<Color, Color, ColorOptions> t = DOTween.ToAlpha(() => target.color, x => target.color = x, endValue, duration); |
||||
|
t.SetTarget(target); |
||||
|
return t; |
||||
|
} |
||||
|
|
||||
|
/// <summary>Tweens a Text's text to the given value.
|
||||
|
/// Also stores the Text as the tween's target so it can be used for filtered operations</summary>
|
||||
|
/// <param name="endValue">The end string to tween to</param><param name="duration">The duration of the tween</param>
|
||||
|
/// <param name="richTextEnabled">If TRUE (default), rich text will be interpreted correctly while animated,
|
||||
|
/// otherwise all tags will be considered as normal text</param>
|
||||
|
/// <param name="scrambleMode">The type of scramble mode to use, if any</param>
|
||||
|
/// <param name="scrambleChars">A string containing the characters to use for scrambling.
|
||||
|
/// Use as many characters as possible (minimum 10) because DOTween uses a fast scramble mode which gives better results with more characters.
|
||||
|
/// Leave it to NULL (default) to use default ones</param>
|
||||
|
public static TweenerCore<string, string, StringOptions> DOText(this Text target, string endValue, float duration, bool richTextEnabled = true, ScrambleMode scrambleMode = ScrambleMode.None, string scrambleChars = null) |
||||
|
{ |
||||
|
if (endValue == null) { |
||||
|
if (Debugger.logPriority > 0) Debugger.LogWarning("You can't pass a NULL string to DOText: an empty string will be used instead to avoid errors"); |
||||
|
endValue = ""; |
||||
|
} |
||||
|
TweenerCore<string, string, StringOptions> t = DOTween.To(() => target.text, x => target.text = x, endValue, duration); |
||||
|
t.SetOptions(richTextEnabled, scrambleMode, scrambleChars) |
||||
|
.SetTarget(target); |
||||
|
return t; |
||||
|
} |
||||
|
|
||||
|
#endregion
|
||||
|
|
||||
|
#region Blendables
|
||||
|
|
||||
|
#region Graphic
|
||||
|
|
||||
|
/// <summary>Tweens a Graphic's color to the given value,
|
||||
|
/// in a way that allows other DOBlendableColor tweens to work together on the same target,
|
||||
|
/// instead than fight each other as multiple DOColor would do.
|
||||
|
/// Also stores the Graphic as the tween's target so it can be used for filtered operations</summary>
|
||||
|
/// <param name="endValue">The value to tween to</param><param name="duration">The duration of the tween</param>
|
||||
|
public static Tweener DOBlendableColor(this Graphic target, Color endValue, float duration) |
||||
|
{ |
||||
|
endValue = endValue - target.color; |
||||
|
Color to = new Color(0, 0, 0, 0); |
||||
|
return DOTween.To(() => to, x => { |
||||
|
Color diff = x - to; |
||||
|
to = x; |
||||
|
target.color += diff; |
||||
|
}, endValue, duration) |
||||
|
.Blendable().SetTarget(target); |
||||
|
} |
||||
|
|
||||
|
#endregion
|
||||
|
|
||||
|
#region Image
|
||||
|
|
||||
|
/// <summary>Tweens a Image's color to the given value,
|
||||
|
/// in a way that allows other DOBlendableColor tweens to work together on the same target,
|
||||
|
/// instead than fight each other as multiple DOColor would do.
|
||||
|
/// Also stores the Image as the tween's target so it can be used for filtered operations</summary>
|
||||
|
/// <param name="endValue">The value to tween to</param><param name="duration">The duration of the tween</param>
|
||||
|
public static Tweener DOBlendableColor(this Image target, Color endValue, float duration) |
||||
|
{ |
||||
|
endValue = endValue - target.color; |
||||
|
Color to = new Color(0, 0, 0, 0); |
||||
|
return DOTween.To(() => to, x => { |
||||
|
Color diff = x - to; |
||||
|
to = x; |
||||
|
target.color += diff; |
||||
|
}, endValue, duration) |
||||
|
.Blendable().SetTarget(target); |
||||
|
} |
||||
|
|
||||
|
#endregion
|
||||
|
|
||||
|
#region Text
|
||||
|
|
||||
|
/// <summary>Tweens a Text's color BY the given value,
|
||||
|
/// in a way that allows other DOBlendableColor tweens to work together on the same target,
|
||||
|
/// instead than fight each other as multiple DOColor would do.
|
||||
|
/// Also stores the Text as the tween's target so it can be used for filtered operations</summary>
|
||||
|
/// <param name="endValue">The value to tween to</param><param name="duration">The duration of the tween</param>
|
||||
|
public static Tweener DOBlendableColor(this Text target, Color endValue, float duration) |
||||
|
{ |
||||
|
endValue = endValue - target.color; |
||||
|
Color to = new Color(0, 0, 0, 0); |
||||
|
return DOTween.To(() => to, x => { |
||||
|
Color diff = x - to; |
||||
|
to = x; |
||||
|
target.color += diff; |
||||
|
}, endValue, duration) |
||||
|
.Blendable().SetTarget(target); |
||||
|
} |
||||
|
|
||||
|
#endregion
|
||||
|
|
||||
|
#endregion
|
||||
|
|
||||
|
#region Shapes
|
||||
|
|
||||
|
/// <summary>Tweens a RectTransform's anchoredPosition so that it draws a circle around the given center.
|
||||
|
/// Also stores the RectTransform as the tween's target so it can be used for filtered operations.<para/>
|
||||
|
/// IMPORTANT: SetFrom(value) requires a <see cref="Vector2"/> instead of a float, where the X property represents the "from degrees value"</summary>
|
||||
|
/// <param name="center">Circle-center/pivot around which to rotate (in UI anchoredPosition coordinates)</param>
|
||||
|
/// <param name="endValueDegrees">The end value degrees to reach (to rotate counter-clockwise pass a negative value)</param>
|
||||
|
/// <param name="duration">The duration of the tween</param>
|
||||
|
/// <param name="relativeCenter">If TRUE the <see cref="center"/> coordinates will be considered as relative to the target's current anchoredPosition</param>
|
||||
|
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
|
public static TweenerCore<Vector2, Vector2, CircleOptions> DOShapeCircle( |
||||
|
this RectTransform target, Vector2 center, float endValueDegrees, float duration, bool relativeCenter = false, bool snapping = false |
||||
|
) |
||||
|
{ |
||||
|
TweenerCore<Vector2, Vector2, CircleOptions> t = DOTween.To( |
||||
|
CirclePlugin.Get(), () => target.anchoredPosition, x => target.anchoredPosition = x, center, duration |
||||
|
); |
||||
|
t.SetOptions(endValueDegrees, relativeCenter, snapping).SetTarget(target); |
||||
|
return t; |
||||
|
} |
||||
|
|
||||
|
#endregion
|
||||
|
|
||||
|
#endregion
|
||||
|
|
||||
|
// █████████████████████████████████████████████████████████████████████████████████████████████████████████████████████
|
||||
|
// ███ INTERNAL CLASSES ████████████████████████████████████████████████████████████████████████████████████████████████
|
||||
|
// █████████████████████████████████████████████████████████████████████████████████████████████████████████████████████
|
||||
|
|
||||
|
public static class Utils |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// Converts the anchoredPosition of the first RectTransform to the second RectTransform,
|
||||
|
/// taking into consideration offset, anchors and pivot, and returns the new anchoredPosition
|
||||
|
/// </summary>
|
||||
|
public static Vector2 SwitchToRectTransform(RectTransform from, RectTransform to) |
||||
|
{ |
||||
|
Vector2 localPoint; |
||||
|
Vector2 fromPivotDerivedOffset = new Vector2(from.rect.width * 0.5f + from.rect.xMin, from.rect.height * 0.5f + from.rect.yMin); |
||||
|
Vector2 screenP = RectTransformUtility.WorldToScreenPoint(null, from.position); |
||||
|
screenP += fromPivotDerivedOffset; |
||||
|
RectTransformUtility.ScreenPointToLocalPointInRectangle(to, screenP, null, out localPoint); |
||||
|
Vector2 pivotDerivedOffset = new Vector2(to.rect.width * 0.5f + to.rect.xMin, to.rect.height * 0.5f + to.rect.yMin); |
||||
|
return to.anchoredPosition + localPoint - pivotDerivedOffset; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
#endif
|
||||
@ -0,0 +1,11 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: 0df9b1d63d1dc634097c165dd5f7fc4e |
||||
|
MonoImporter: |
||||
|
externalObjects: {} |
||||
|
serializedVersion: 2 |
||||
|
defaultReferences: [] |
||||
|
executionOrder: 0 |
||||
|
icon: {instanceID: 0} |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
@ -0,0 +1,403 @@ |
|||||
|
// Author: Daniele Giardini - http://www.demigiant.com
|
||||
|
// Created: 2018/07/13
|
||||
|
|
||||
|
using System; |
||||
|
using UnityEngine; |
||||
|
using DG.Tweening.Core; |
||||
|
using DG.Tweening.Plugins.Options; |
||||
|
//#if UNITY_2018_1_OR_NEWER && (NET_4_6 || NET_STANDARD_2_0)
|
||||
|
//using Task = System.Threading.Tasks.Task;
|
||||
|
//#endif
|
||||
|
|
||||
|
#pragma warning disable 1591
|
||||
|
namespace DG.Tweening |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// Shortcuts/functions that are not strictly related to specific Modules
|
||||
|
/// but are available only on some Unity versions
|
||||
|
/// </summary>
|
||||
|
public static class DOTweenModuleUnityVersion |
||||
|
{ |
||||
|
#if UNITY_4_3 || UNITY_4_4 || UNITY_4_5 || UNITY_4_6 || UNITY_5 || UNITY_2017_1_OR_NEWER
|
||||
|
#region Unity 4.3 or Newer
|
||||
|
|
||||
|
#region Material
|
||||
|
|
||||
|
/// <summary>Tweens a Material's color using the given gradient
|
||||
|
/// (NOTE 1: only uses the colors of the gradient, not the alphas - NOTE 2: creates a Sequence, not a Tweener).
|
||||
|
/// Also stores the image as the tween's target so it can be used for filtered operations</summary>
|
||||
|
/// <param name="gradient">The gradient to use</param><param name="duration">The duration of the tween</param>
|
||||
|
public static Sequence DOGradientColor(this Material target, Gradient gradient, float duration) |
||||
|
{ |
||||
|
Sequence s = DOTween.Sequence(); |
||||
|
GradientColorKey[] colors = gradient.colorKeys; |
||||
|
int len = colors.Length; |
||||
|
for (int i = 0; i < len; ++i) { |
||||
|
GradientColorKey c = colors[i]; |
||||
|
if (i == 0 && c.time <= 0) { |
||||
|
target.color = c.color; |
||||
|
continue; |
||||
|
} |
||||
|
float colorDuration = i == len - 1 |
||||
|
? duration - s.Duration(false) // Verifies that total duration is correct
|
||||
|
: duration * (i == 0 ? c.time : c.time - colors[i - 1].time); |
||||
|
s.Append(target.DOColor(c.color, colorDuration).SetEase(Ease.Linear)); |
||||
|
} |
||||
|
s.SetTarget(target); |
||||
|
return s; |
||||
|
} |
||||
|
/// <summary>Tweens a Material's named color property using the given gradient
|
||||
|
/// (NOTE 1: only uses the colors of the gradient, not the alphas - NOTE 2: creates a Sequence, not a Tweener).
|
||||
|
/// Also stores the image as the tween's target so it can be used for filtered operations</summary>
|
||||
|
/// <param name="gradient">The gradient to use</param>
|
||||
|
/// <param name="property">The name of the material property to tween (like _Tint or _SpecColor)</param>
|
||||
|
/// <param name="duration">The duration of the tween</param>
|
||||
|
public static Sequence DOGradientColor(this Material target, Gradient gradient, string property, float duration) |
||||
|
{ |
||||
|
Sequence s = DOTween.Sequence(); |
||||
|
GradientColorKey[] colors = gradient.colorKeys; |
||||
|
int len = colors.Length; |
||||
|
for (int i = 0; i < len; ++i) { |
||||
|
GradientColorKey c = colors[i]; |
||||
|
if (i == 0 && c.time <= 0) { |
||||
|
target.SetColor(property, c.color); |
||||
|
continue; |
||||
|
} |
||||
|
float colorDuration = i == len - 1 |
||||
|
? duration - s.Duration(false) // Verifies that total duration is correct
|
||||
|
: duration * (i == 0 ? c.time : c.time - colors[i - 1].time); |
||||
|
s.Append(target.DOColor(c.color, property, colorDuration).SetEase(Ease.Linear)); |
||||
|
} |
||||
|
s.SetTarget(target); |
||||
|
return s; |
||||
|
} |
||||
|
|
||||
|
#endregion
|
||||
|
|
||||
|
#endregion
|
||||
|
#endif
|
||||
|
|
||||
|
#if UNITY_5_3_OR_NEWER || UNITY_2017_1_OR_NEWER
|
||||
|
#region Unity 5.3 or Newer
|
||||
|
|
||||
|
#region CustomYieldInstructions
|
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Returns a <see cref="CustomYieldInstruction"/> that waits until the tween is killed or complete.
|
||||
|
/// It can be used inside a coroutine as a yield.
|
||||
|
/// <para>Example usage:</para><code>yield return myTween.WaitForCompletion(true);</code>
|
||||
|
/// </summary>
|
||||
|
public static CustomYieldInstruction WaitForCompletion(this Tween t, bool returnCustomYieldInstruction) |
||||
|
{ |
||||
|
if (!t.active) { |
||||
|
if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t); |
||||
|
return null; |
||||
|
} |
||||
|
return new DOTweenCYInstruction.WaitForCompletion(t); |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Returns a <see cref="CustomYieldInstruction"/> that waits until the tween is killed or rewinded.
|
||||
|
/// It can be used inside a coroutine as a yield.
|
||||
|
/// <para>Example usage:</para><code>yield return myTween.WaitForRewind();</code>
|
||||
|
/// </summary>
|
||||
|
public static CustomYieldInstruction WaitForRewind(this Tween t, bool returnCustomYieldInstruction) |
||||
|
{ |
||||
|
if (!t.active) { |
||||
|
if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t); |
||||
|
return null; |
||||
|
} |
||||
|
return new DOTweenCYInstruction.WaitForRewind(t); |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Returns a <see cref="CustomYieldInstruction"/> that waits until the tween is killed.
|
||||
|
/// It can be used inside a coroutine as a yield.
|
||||
|
/// <para>Example usage:</para><code>yield return myTween.WaitForKill();</code>
|
||||
|
/// </summary>
|
||||
|
public static CustomYieldInstruction WaitForKill(this Tween t, bool returnCustomYieldInstruction) |
||||
|
{ |
||||
|
if (!t.active) { |
||||
|
if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t); |
||||
|
return null; |
||||
|
} |
||||
|
return new DOTweenCYInstruction.WaitForKill(t); |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Returns a <see cref="CustomYieldInstruction"/> that waits until the tween is killed or has gone through the given amount of loops.
|
||||
|
/// It can be used inside a coroutine as a yield.
|
||||
|
/// <para>Example usage:</para><code>yield return myTween.WaitForElapsedLoops(2);</code>
|
||||
|
/// </summary>
|
||||
|
/// <param name="elapsedLoops">Elapsed loops to wait for</param>
|
||||
|
public static CustomYieldInstruction WaitForElapsedLoops(this Tween t, int elapsedLoops, bool returnCustomYieldInstruction) |
||||
|
{ |
||||
|
if (!t.active) { |
||||
|
if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t); |
||||
|
return null; |
||||
|
} |
||||
|
return new DOTweenCYInstruction.WaitForElapsedLoops(t, elapsedLoops); |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Returns a <see cref="CustomYieldInstruction"/> that waits until the tween is killed
|
||||
|
/// or has reached the given time position (loops included, delays excluded).
|
||||
|
/// It can be used inside a coroutine as a yield.
|
||||
|
/// <para>Example usage:</para><code>yield return myTween.WaitForPosition(2.5f);</code>
|
||||
|
/// </summary>
|
||||
|
/// <param name="position">Position (loops included, delays excluded) to wait for</param>
|
||||
|
public static CustomYieldInstruction WaitForPosition(this Tween t, float position, bool returnCustomYieldInstruction) |
||||
|
{ |
||||
|
if (!t.active) { |
||||
|
if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t); |
||||
|
return null; |
||||
|
} |
||||
|
return new DOTweenCYInstruction.WaitForPosition(t, position); |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Returns a <see cref="CustomYieldInstruction"/> that waits until the tween is killed or started
|
||||
|
/// (meaning when the tween is set in a playing state the first time, after any eventual delay).
|
||||
|
/// It can be used inside a coroutine as a yield.
|
||||
|
/// <para>Example usage:</para><code>yield return myTween.WaitForStart();</code>
|
||||
|
/// </summary>
|
||||
|
public static CustomYieldInstruction WaitForStart(this Tween t, bool returnCustomYieldInstruction) |
||||
|
{ |
||||
|
if (!t.active) { |
||||
|
if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t); |
||||
|
return null; |
||||
|
} |
||||
|
return new DOTweenCYInstruction.WaitForStart(t); |
||||
|
} |
||||
|
|
||||
|
#endregion
|
||||
|
|
||||
|
#endregion
|
||||
|
#endif
|
||||
|
|
||||
|
#if UNITY_2018_1_OR_NEWER
|
||||
|
#region Unity 2018.1 or Newer
|
||||
|
|
||||
|
#region Material
|
||||
|
|
||||
|
/// <summary>Tweens a Material's named texture offset property with the given ID to the given value.
|
||||
|
/// Also stores the material as the tween's target so it can be used for filtered operations</summary>
|
||||
|
/// <param name="endValue">The end value to reach</param>
|
||||
|
/// <param name="propertyID">The ID of the material property to tween (also called nameID in Unity's manual)</param>
|
||||
|
/// <param name="duration">The duration of the tween</param>
|
||||
|
public static TweenerCore<Vector2, Vector2, VectorOptions> DOOffset(this Material target, Vector2 endValue, int propertyID, float duration) |
||||
|
{ |
||||
|
if (!target.HasProperty(propertyID)) { |
||||
|
if (Debugger.logPriority > 0) Debugger.LogMissingMaterialProperty(propertyID); |
||||
|
return null; |
||||
|
} |
||||
|
TweenerCore<Vector2, Vector2, VectorOptions> t = DOTween.To(() => target.GetTextureOffset(propertyID), x => target.SetTextureOffset(propertyID, x), endValue, duration); |
||||
|
t.SetTarget(target); |
||||
|
return t; |
||||
|
} |
||||
|
|
||||
|
/// <summary>Tweens a Material's named texture scale property with the given ID to the given value.
|
||||
|
/// Also stores the material as the tween's target so it can be used for filtered operations</summary>
|
||||
|
/// <param name="endValue">The end value to reach</param>
|
||||
|
/// <param name="propertyID">The ID of the material property to tween (also called nameID in Unity's manual)</param>
|
||||
|
/// <param name="duration">The duration of the tween</param>
|
||||
|
public static TweenerCore<Vector2, Vector2, VectorOptions> DOTiling(this Material target, Vector2 endValue, int propertyID, float duration) |
||||
|
{ |
||||
|
if (!target.HasProperty(propertyID)) { |
||||
|
if (Debugger.logPriority > 0) Debugger.LogMissingMaterialProperty(propertyID); |
||||
|
return null; |
||||
|
} |
||||
|
TweenerCore<Vector2, Vector2, VectorOptions> t = DOTween.To(() => target.GetTextureScale(propertyID), x => target.SetTextureScale(propertyID, x), endValue, duration); |
||||
|
t.SetTarget(target); |
||||
|
return t; |
||||
|
} |
||||
|
|
||||
|
#endregion
|
||||
|
|
||||
|
#region .NET 4.6 or Newer
|
||||
|
|
||||
|
#if UNITY_2018_1_OR_NEWER && (NET_4_6 || NET_STANDARD_2_0)
|
||||
|
|
||||
|
#region Async Instructions
|
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Returns an async <see cref="System.Threading.Tasks.Task"/> that waits until the tween is killed or complete.
|
||||
|
/// It can be used inside an async operation.
|
||||
|
/// <para>Example usage:</para><code>await myTween.WaitForCompletion();</code>
|
||||
|
/// </summary>
|
||||
|
public static async System.Threading.Tasks.Task AsyncWaitForCompletion(this Tween t) |
||||
|
{ |
||||
|
if (!t.active) { |
||||
|
if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t); |
||||
|
return; |
||||
|
} |
||||
|
while (t.active && !t.IsComplete()) await System.Threading.Tasks.Task.Yield(); |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Returns an async <see cref="System.Threading.Tasks.Task"/> that waits until the tween is killed or rewinded.
|
||||
|
/// It can be used inside an async operation.
|
||||
|
/// <para>Example usage:</para><code>await myTween.AsyncWaitForRewind();</code>
|
||||
|
/// </summary>
|
||||
|
public static async System.Threading.Tasks.Task AsyncWaitForRewind(this Tween t) |
||||
|
{ |
||||
|
if (!t.active) { |
||||
|
if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t); |
||||
|
return; |
||||
|
} |
||||
|
while (t.active && (!t.playedOnce || t.position * (t.CompletedLoops() + 1) > 0)) await System.Threading.Tasks.Task.Yield(); |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Returns an async <see cref="System.Threading.Tasks.Task"/> that waits until the tween is killed.
|
||||
|
/// It can be used inside an async operation.
|
||||
|
/// <para>Example usage:</para><code>await myTween.AsyncWaitForKill();</code>
|
||||
|
/// </summary>
|
||||
|
public static async System.Threading.Tasks.Task AsyncWaitForKill(this Tween t) |
||||
|
{ |
||||
|
if (!t.active) { |
||||
|
if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t); |
||||
|
return; |
||||
|
} |
||||
|
while (t.active) await System.Threading.Tasks.Task.Yield(); |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Returns an async <see cref="System.Threading.Tasks.Task"/> that waits until the tween is killed or has gone through the given amount of loops.
|
||||
|
/// It can be used inside an async operation.
|
||||
|
/// <para>Example usage:</para><code>await myTween.AsyncWaitForElapsedLoops();</code>
|
||||
|
/// </summary>
|
||||
|
/// <param name="elapsedLoops">Elapsed loops to wait for</param>
|
||||
|
public static async System.Threading.Tasks.Task AsyncWaitForElapsedLoops(this Tween t, int elapsedLoops) |
||||
|
{ |
||||
|
if (!t.active) { |
||||
|
if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t); |
||||
|
return; |
||||
|
} |
||||
|
while (t.active && t.CompletedLoops() < elapsedLoops) await System.Threading.Tasks.Task.Yield(); |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Returns an async <see cref="System.Threading.Tasks.Task"/> that waits until the tween is killed or started
|
||||
|
/// (meaning when the tween is set in a playing state the first time, after any eventual delay).
|
||||
|
/// It can be used inside an async operation.
|
||||
|
/// <para>Example usage:</para><code>await myTween.AsyncWaitForPosition();</code>
|
||||
|
/// </summary>
|
||||
|
/// <param name="position">Position (loops included, delays excluded) to wait for</param>
|
||||
|
public static async System.Threading.Tasks.Task AsyncWaitForPosition(this Tween t, float position) |
||||
|
{ |
||||
|
if (!t.active) { |
||||
|
if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t); |
||||
|
return; |
||||
|
} |
||||
|
while (t.active && t.position * (t.CompletedLoops() + 1) < position) await System.Threading.Tasks.Task.Yield(); |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Returns an async <see cref="System.Threading.Tasks.Task"/> that waits until the tween is killed.
|
||||
|
/// It can be used inside an async operation.
|
||||
|
/// <para>Example usage:</para><code>await myTween.AsyncWaitForKill();</code>
|
||||
|
/// </summary>
|
||||
|
public static async System.Threading.Tasks.Task AsyncWaitForStart(this Tween t) |
||||
|
{ |
||||
|
if (!t.active) { |
||||
|
if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t); |
||||
|
return; |
||||
|
} |
||||
|
while (t.active && !t.playedOnce) await System.Threading.Tasks.Task.Yield(); |
||||
|
} |
||||
|
|
||||
|
#endregion
|
||||
|
#endif
|
||||
|
|
||||
|
#endregion
|
||||
|
|
||||
|
#endregion
|
||||
|
#endif
|
||||
|
} |
||||
|
|
||||
|
// █████████████████████████████████████████████████████████████████████████████████████████████████████████████████████
|
||||
|
// ███ CLASSES █████████████████████████████████████████████████████████████████████████████████████████████████████████
|
||||
|
// █████████████████████████████████████████████████████████████████████████████████████████████████████████████████████
|
||||
|
|
||||
|
#if UNITY_5_3_OR_NEWER || UNITY_2017_1_OR_NEWER
|
||||
|
public static class DOTweenCYInstruction |
||||
|
{ |
||||
|
public class WaitForCompletion : CustomYieldInstruction |
||||
|
{ |
||||
|
public override bool keepWaiting { get { |
||||
|
return t.active && !t.IsComplete(); |
||||
|
}} |
||||
|
readonly Tween t; |
||||
|
public WaitForCompletion(Tween tween) |
||||
|
{ |
||||
|
t = tween; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public class WaitForRewind : CustomYieldInstruction |
||||
|
{ |
||||
|
public override bool keepWaiting { get { |
||||
|
return t.active && (!t.playedOnce || t.position * (t.CompletedLoops() + 1) > 0); |
||||
|
}} |
||||
|
readonly Tween t; |
||||
|
public WaitForRewind(Tween tween) |
||||
|
{ |
||||
|
t = tween; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public class WaitForKill : CustomYieldInstruction |
||||
|
{ |
||||
|
public override bool keepWaiting { get { |
||||
|
return t.active; |
||||
|
}} |
||||
|
readonly Tween t; |
||||
|
public WaitForKill(Tween tween) |
||||
|
{ |
||||
|
t = tween; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public class WaitForElapsedLoops : CustomYieldInstruction |
||||
|
{ |
||||
|
public override bool keepWaiting { get { |
||||
|
return t.active && t.CompletedLoops() < elapsedLoops; |
||||
|
}} |
||||
|
readonly Tween t; |
||||
|
readonly int elapsedLoops; |
||||
|
public WaitForElapsedLoops(Tween tween, int elapsedLoops) |
||||
|
{ |
||||
|
t = tween; |
||||
|
this.elapsedLoops = elapsedLoops; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public class WaitForPosition : CustomYieldInstruction |
||||
|
{ |
||||
|
public override bool keepWaiting { get { |
||||
|
return t.active && t.position * (t.CompletedLoops() + 1) < position; |
||||
|
}} |
||||
|
readonly Tween t; |
||||
|
readonly float position; |
||||
|
public WaitForPosition(Tween tween, float position) |
||||
|
{ |
||||
|
t = tween; |
||||
|
this.position = position; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public class WaitForStart : CustomYieldInstruction |
||||
|
{ |
||||
|
public override bool keepWaiting { get { |
||||
|
return t.active && !t.playedOnce; |
||||
|
}} |
||||
|
readonly Tween t; |
||||
|
public WaitForStart(Tween tween) |
||||
|
{ |
||||
|
t = tween; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
#endif
|
||||
|
} |
||||
@ -0,0 +1,11 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: adbda3be362e8d049a9965dbab75fe42 |
||||
|
MonoImporter: |
||||
|
externalObjects: {} |
||||
|
serializedVersion: 2 |
||||
|
defaultReferences: [] |
||||
|
executionOrder: 0 |
||||
|
icon: {instanceID: 0} |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
@ -0,0 +1,167 @@ |
|||||
|
// Author: Daniele Giardini - http://www.demigiant.com
|
||||
|
// Created: 2018/07/13
|
||||
|
|
||||
|
using System; |
||||
|
using System.Reflection; |
||||
|
using UnityEngine; |
||||
|
using DG.Tweening.Core; |
||||
|
using DG.Tweening.Plugins.Core.PathCore; |
||||
|
using DG.Tweening.Plugins.Options; |
||||
|
|
||||
|
#pragma warning disable 1591
|
||||
|
namespace DG.Tweening |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// Utility functions that deal with available Modules.
|
||||
|
/// Modules defines:
|
||||
|
/// - DOTAUDIO
|
||||
|
/// - DOTPHYSICS
|
||||
|
/// - DOTPHYSICS2D
|
||||
|
/// - DOTSPRITE
|
||||
|
/// - DOTUI
|
||||
|
/// Extra defines set and used for implementation of external assets:
|
||||
|
/// - DOTWEEN_TMP ► TextMesh Pro
|
||||
|
/// - DOTWEEN_TK2D ► 2D Toolkit
|
||||
|
/// </summary>
|
||||
|
public static class DOTweenModuleUtils |
||||
|
{ |
||||
|
static bool _initialized; |
||||
|
|
||||
|
#region Reflection
|
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Called via Reflection by DOTweenComponent on Awake
|
||||
|
/// </summary>
|
||||
|
#if UNITY_2018_1_OR_NEWER
|
||||
|
[UnityEngine.Scripting.Preserve] |
||||
|
#endif
|
||||
|
public static void Init() |
||||
|
{ |
||||
|
if (_initialized) return; |
||||
|
|
||||
|
_initialized = true; |
||||
|
DOTweenExternalCommand.SetOrientationOnPath += Physics.SetOrientationOnPath; |
||||
|
|
||||
|
#if UNITY_EDITOR
|
||||
|
#if UNITY_4_3 || UNITY_4_4 || UNITY_4_5 || UNITY_4_6 || UNITY_5 || UNITY_2017_1
|
||||
|
UnityEditor.EditorApplication.playmodeStateChanged += PlaymodeStateChanged; |
||||
|
#else
|
||||
|
UnityEditor.EditorApplication.playModeStateChanged += PlaymodeStateChanged; |
||||
|
#endif
|
||||
|
#endif
|
||||
|
} |
||||
|
|
||||
|
#if UNITY_2018_1_OR_NEWER
|
||||
|
#pragma warning disable
|
||||
|
[UnityEngine.Scripting.Preserve] |
||||
|
// Just used to preserve methods when building, never called
|
||||
|
static void Preserver() |
||||
|
{ |
||||
|
Assembly[] loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies(); |
||||
|
MethodInfo mi = typeof(MonoBehaviour).GetMethod("Stub"); |
||||
|
} |
||||
|
#pragma warning restore
|
||||
|
#endif
|
||||
|
|
||||
|
#endregion
|
||||
|
|
||||
|
#if UNITY_EDITOR
|
||||
|
// Fires OnApplicationPause in DOTweenComponent even when Editor is paused (otherwise it's only fired at runtime)
|
||||
|
#if UNITY_4_3 || UNITY_4_4 || UNITY_4_5 || UNITY_4_6 || UNITY_5 || UNITY_2017_1
|
||||
|
static void PlaymodeStateChanged() |
||||
|
#else
|
||||
|
static void PlaymodeStateChanged(UnityEditor.PlayModeStateChange state) |
||||
|
#endif
|
||||
|
{ |
||||
|
if (DOTween.instance == null) return; |
||||
|
DOTween.instance.OnApplicationPause(UnityEditor.EditorApplication.isPaused); |
||||
|
} |
||||
|
#endif
|
||||
|
|
||||
|
// █████████████████████████████████████████████████████████████████████████████████████████████████████████████████████
|
||||
|
// ███ INTERNAL CLASSES ████████████████████████████████████████████████████████████████████████████████████████████████
|
||||
|
// █████████████████████████████████████████████████████████████████████████████████████████████████████████████████████
|
||||
|
|
||||
|
public static class Physics |
||||
|
{ |
||||
|
// Called via DOTweenExternalCommand callback
|
||||
|
public static void SetOrientationOnPath(PathOptions options, Tween t, Quaternion newRot, Transform trans) |
||||
|
{ |
||||
|
#if true // PHYSICS_MARKER
|
||||
|
if (options.isRigidbody) ((Rigidbody)t.target).rotation = newRot; |
||||
|
else trans.rotation = newRot; |
||||
|
#else
|
||||
|
trans.rotation = newRot; |
||||
|
#endif
|
||||
|
} |
||||
|
|
||||
|
// Returns FALSE if the DOTween's Physics2D Module is disabled, or if there's no Rigidbody2D attached
|
||||
|
public static bool HasRigidbody2D(Component target) |
||||
|
{ |
||||
|
#if true // PHYSICS2D_MARKER
|
||||
|
return target.GetComponent<Rigidbody2D>() != null; |
||||
|
#else
|
||||
|
return false; |
||||
|
#endif
|
||||
|
} |
||||
|
|
||||
|
#region Called via Reflection
|
||||
|
|
||||
|
|
||||
|
// Called via Reflection by DOTweenPathInspector
|
||||
|
// Returns FALSE if the DOTween's Physics Module is disabled, or if there's no rigidbody attached
|
||||
|
#if UNITY_2018_1_OR_NEWER
|
||||
|
[UnityEngine.Scripting.Preserve] |
||||
|
#endif
|
||||
|
public static bool HasRigidbody(Component target) |
||||
|
{ |
||||
|
#if true // PHYSICS_MARKER
|
||||
|
return target.GetComponent<Rigidbody>() != null; |
||||
|
#else
|
||||
|
return false; |
||||
|
#endif
|
||||
|
} |
||||
|
|
||||
|
// Called via Reflection by DOTweenPath
|
||||
|
#if UNITY_2018_1_OR_NEWER
|
||||
|
[UnityEngine.Scripting.Preserve] |
||||
|
#endif
|
||||
|
public static TweenerCore<Vector3, Path, PathOptions> CreateDOTweenPathTween( |
||||
|
MonoBehaviour target, bool tweenRigidbody, bool isLocal, Path path, float duration, PathMode pathMode |
||||
|
){ |
||||
|
TweenerCore<Vector3, Path, PathOptions> t = null; |
||||
|
bool rBodyFoundAndTweened = false; |
||||
|
#if true // PHYSICS_MARKER
|
||||
|
if (tweenRigidbody) { |
||||
|
Rigidbody rBody = target.GetComponent<Rigidbody>(); |
||||
|
if (rBody != null) { |
||||
|
rBodyFoundAndTweened = true; |
||||
|
t = isLocal |
||||
|
? rBody.DOLocalPath(path, duration, pathMode) |
||||
|
: rBody.DOPath(path, duration, pathMode); |
||||
|
} |
||||
|
} |
||||
|
#endif
|
||||
|
#if true // PHYSICS2D_MARKER
|
||||
|
if (!rBodyFoundAndTweened && tweenRigidbody) { |
||||
|
Rigidbody2D rBody2D = target.GetComponent<Rigidbody2D>(); |
||||
|
if (rBody2D != null) { |
||||
|
rBodyFoundAndTweened = true; |
||||
|
t = isLocal |
||||
|
? rBody2D.DOLocalPath(path, duration, pathMode) |
||||
|
: rBody2D.DOPath(path, duration, pathMode); |
||||
|
} |
||||
|
} |
||||
|
#endif
|
||||
|
if (!rBodyFoundAndTweened) { |
||||
|
t = isLocal |
||||
|
? target.transform.DOLocalPath(path, duration, pathMode) |
||||
|
: target.transform.DOPath(path, duration, pathMode); |
||||
|
} |
||||
|
return t; |
||||
|
} |
||||
|
|
||||
|
#endregion
|
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,11 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: 2325d32037324cc4e8c9f089170d2bd5 |
||||
|
MonoImporter: |
||||
|
externalObjects: {} |
||||
|
serializedVersion: 2 |
||||
|
defaultReferences: [] |
||||
|
executionOrder: 0 |
||||
|
icon: {instanceID: 0} |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
@ -0,0 +1,8 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: 12a36eb9e23d1194d87e0def9da18bc4 |
||||
|
folderAsset: yes |
||||
|
DefaultImporter: |
||||
|
externalObjects: {} |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
@ -0,0 +1,53 @@ |
|||||
|
%YAML 1.1 |
||||
|
%TAG !u! tag:unity3d.com,2011: |
||||
|
--- !u!114 &11400000 |
||||
|
MonoBehaviour: |
||||
|
m_ObjectHideFlags: 0 |
||||
|
m_CorrespondingSourceObject: {fileID: 0} |
||||
|
m_PrefabInstance: {fileID: 0} |
||||
|
m_PrefabAsset: {fileID: 0} |
||||
|
m_GameObject: {fileID: 0} |
||||
|
m_Enabled: 1 |
||||
|
m_EditorHideFlags: 0 |
||||
|
m_Script: {fileID: 16995157, guid: 9c22424d9115fe748a5bb58354c968b7, type: 3} |
||||
|
m_Name: DOTweenSettings |
||||
|
m_EditorClassIdentifier: |
||||
|
useSafeMode: 1 |
||||
|
safeModeOptions: |
||||
|
logBehaviour: 2 |
||||
|
nestedTweenFailureBehaviour: 0 |
||||
|
timeScale: 1 |
||||
|
useSmoothDeltaTime: 0 |
||||
|
maxSmoothUnscaledTime: 0.15 |
||||
|
rewindCallbackMode: 0 |
||||
|
showUnityEditorReport: 0 |
||||
|
logBehaviour: 0 |
||||
|
drawGizmos: 1 |
||||
|
defaultRecyclable: 0 |
||||
|
defaultAutoPlay: 3 |
||||
|
defaultUpdateType: 0 |
||||
|
defaultTimeScaleIndependent: 0 |
||||
|
defaultEaseType: 6 |
||||
|
defaultEaseOvershootOrAmplitude: 1.70158 |
||||
|
defaultEasePeriod: 0 |
||||
|
defaultAutoKill: 1 |
||||
|
defaultLoopType: 0 |
||||
|
debugMode: 0 |
||||
|
debugStoreTargetId: 1 |
||||
|
showPreviewPanel: 1 |
||||
|
storeSettingsLocation: 0 |
||||
|
modules: |
||||
|
showPanel: 0 |
||||
|
audioEnabled: 1 |
||||
|
physicsEnabled: 1 |
||||
|
physics2DEnabled: 1 |
||||
|
spriteEnabled: 1 |
||||
|
uiEnabled: 1 |
||||
|
textMeshProEnabled: 0 |
||||
|
tk2DEnabled: 0 |
||||
|
deAudioEnabled: 0 |
||||
|
deUnityExtendedEnabled: 0 |
||||
|
epoOutlineEnabled: 0 |
||||
|
createASMDEF: 0 |
||||
|
showPlayingTweens: 0 |
||||
|
showPausedTweens: 0 |
||||
@ -0,0 +1,8 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: 7d1111c4bfb61b44899f9a155eb2af49 |
||||
|
NativeFormatImporter: |
||||
|
externalObjects: {} |
||||
|
mainObjectFileID: 11400000 |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
@ -0,0 +1,29 @@ |
|||||
|
DOTween and DOTween Pro are copyright (c) 2014-2018 Daniele Giardini - Demigiant |
||||
|
|
||||
|
// IMPORTANT!!! ///////////////////////////////////////////// |
||||
|
// Upgrading DOTween from versions older than 1.2.000 /////// |
||||
|
// (or DOTween Pro older than 1.0.000) ////////////////////// |
||||
|
------------------------------------------------------------- |
||||
|
If you're upgrading your project from a version of DOTween older than 1.2.000 (or DOTween Pro older than 1.0.000) please follow these instructions carefully. |
||||
|
1) Import the new version in the same folder as the previous one, overwriting old files. A lot of errors will appear but don't worry |
||||
|
2) Close and reopen Unity (and your project). This is fundamental: skipping this step will cause a bloodbath |
||||
|
3) Open DOTween's Utility Panel (Tools > Demigiant > DOTween Utility Panel) if it doesn't open automatically, then press "Setup DOTween...": this will run the upgrade setup |
||||
|
4) From the Add/Remove Modules panel that opens, activate/deactivate Modules for Unity systems and for external assets (Pro version only) |
||||
|
|
||||
|
// GET STARTED ////////////////////////////////////////////// |
||||
|
|
||||
|
- After importing a new DOTween update, select DOTween's Utility Panel from the "Tools/Demigiant" menu (if it doesn't open automatically) and press the "Setup DOTween..." button to activate/deactivate Modules. You can also access a Preferences Tab from there to choose default settings for DOTween. |
||||
|
- In your code, add "using DG.Tweening" to each class where you want to use DOTween. |
||||
|
- You're ready to tween. Check out the links below for full documentation and license info. |
||||
|
|
||||
|
|
||||
|
// LINKS /////////////////////////////////////////////////////// |
||||
|
|
||||
|
DOTween website (documentation, examples, etc): http://dotween.demigiant.com |
||||
|
DOTween license: http://dotween.demigiant.com/license.php |
||||
|
DOTween repository (Google Code): https://code.google.com/p/dotween/ |
||||
|
Demigiant website (documentation, examples, etc): http://www.demigiant.com |
||||
|
|
||||
|
// NOTES ////////////////////////////////////////////////////// |
||||
|
|
||||
|
- DOTween's Utility Panel can be found under "Tools > Demigiant > DOTween Utility Panel" and also contains other useful options, plus a tab to set DOTween's preferences |
||||
@ -0,0 +1,7 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: 3d252228111bd274e94c4ca7b0c9f853 |
||||
|
TextScriptImporter: |
||||
|
externalObjects: {} |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
@ -0,0 +1,8 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: 2ce0389fb6944dd4e8fff1da0917b2a5 |
||||
|
folderAsset: yes |
||||
|
DefaultImporter: |
||||
|
externalObjects: {} |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
@ -0,0 +1,35 @@ |
|||||
|
using System.Collections; |
||||
|
using System.Collections.Generic; |
||||
|
using UnityEngine; |
||||
|
|
||||
|
namespace Core.IAP |
||||
|
{ |
||||
|
public class DisableObjectWhenPurchase : MonoBehaviour |
||||
|
{ |
||||
|
[SerializeField] private Products[] _products = null; |
||||
|
|
||||
|
private void Awake() |
||||
|
{ |
||||
|
PurchaseManager.OnPurchaseSuccess += PurchaseManager_OnPurchaseSuccess; |
||||
|
CheckState(); |
||||
|
} |
||||
|
|
||||
|
private void OnDestroy()=> |
||||
|
PurchaseManager.OnPurchaseSuccess -= PurchaseManager_OnPurchaseSuccess; |
||||
|
|
||||
|
private void PurchaseManager_OnPurchaseSuccess(Products obj) => |
||||
|
CheckState(); |
||||
|
|
||||
|
private void CheckState() |
||||
|
{ |
||||
|
for (int i = 0; i < _products.Length; i++) |
||||
|
{ |
||||
|
if (PurchaseManager.IsProductPurchased(_products[i])) |
||||
|
{ |
||||
|
gameObject.SetActive(false); |
||||
|
return; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,11 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: 41a8aa83b2c2c7243a56b02d49940de9 |
||||
|
MonoImporter: |
||||
|
externalObjects: {} |
||||
|
serializedVersion: 2 |
||||
|
defaultReferences: [] |
||||
|
executionOrder: 0 |
||||
|
icon: {instanceID: 0} |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
@ -0,0 +1,195 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Linq; |
||||
|
using UnityEngine; |
||||
|
using UnityEngine.Purchasing; |
||||
|
|
||||
|
namespace Core.IAP |
||||
|
{ |
||||
|
public class PurchaseManager : IStoreListener |
||||
|
{ |
||||
|
private static PurchaseManager instance = null; |
||||
|
|
||||
|
public static void StaticInit() |
||||
|
{ |
||||
|
instance = new PurchaseManager(); |
||||
|
|
||||
|
instance.InitializePurchasing(); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
public static event Action<Products> OnPurchaseSuccess; |
||||
|
public static event Action<UnityEngine.Purchasing.Product, PurchaseFailureReason> OnPurchaseFaile; |
||||
|
|
||||
|
|
||||
|
private static IStoreController _storeController; |
||||
|
private static IExtensionProvider _storeExtensionProvider; |
||||
|
|
||||
|
|
||||
|
#region Static metods
|
||||
|
|
||||
|
public static bool IsProductPurchased(Products args) |
||||
|
{ |
||||
|
string id = instance.GetIdByProduct(args); |
||||
|
|
||||
|
return PlayerPrefs.GetString(id.ToString() + "_purchased", "false") == "true"; |
||||
|
} |
||||
|
|
||||
|
public static void Buy(Products args) |
||||
|
{ |
||||
|
string id = instance.GetIdByProduct(args); |
||||
|
|
||||
|
#if UNITY_EDITOR
|
||||
|
|
||||
|
if (OnPurchaseSuccess != null) |
||||
|
OnPurchaseSuccess(args); |
||||
|
|
||||
|
Debug.Log(id + " Buyed!"); |
||||
|
|
||||
|
return; |
||||
|
#endif
|
||||
|
|
||||
|
instance.BuyProduct(id); |
||||
|
} |
||||
|
|
||||
|
public static string GetLocalizedPrice(Products args) |
||||
|
{ |
||||
|
#if UNITY_EDITOR
|
||||
|
return "0.99$"; |
||||
|
#endif
|
||||
|
|
||||
|
string id = instance.GetIdByProduct(args); |
||||
|
|
||||
|
if (instance.IsInitialized()) |
||||
|
{ |
||||
|
string price = _storeController.products.WithID(id).metadata.localizedPriceString; |
||||
|
|
||||
|
PlayerPrefs.SetString(id + "_last_price", price); |
||||
|
|
||||
|
return price; |
||||
|
} |
||||
|
else |
||||
|
return PlayerPrefs.GetString(id + "_last_price", "0.99$"); |
||||
|
} |
||||
|
|
||||
|
#endregion
|
||||
|
|
||||
|
#region Object
|
||||
|
|
||||
|
private void InitializePurchasing() |
||||
|
{ |
||||
|
var builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance()); |
||||
|
|
||||
|
foreach (string s in ProductsList.ConsumableProducts.Values) |
||||
|
builder.AddProduct(s, ProductType.Consumable); |
||||
|
|
||||
|
foreach (string s in ProductsList.NonConsumableProducts.Values) |
||||
|
builder.AddProduct(s, ProductType.NonConsumable); |
||||
|
|
||||
|
UnityPurchasing.Initialize(this, builder); |
||||
|
} |
||||
|
|
||||
|
private bool IsInitialized() |
||||
|
{ |
||||
|
return _storeController != null && _storeExtensionProvider != null; |
||||
|
} |
||||
|
|
||||
|
private string GetIdByProduct(Products product) |
||||
|
{ |
||||
|
string id = ""; |
||||
|
|
||||
|
if (ProductsList.ConsumableProducts.ContainsKey(product)) |
||||
|
id = ProductsList.ConsumableProducts[product]; |
||||
|
|
||||
|
if (ProductsList.NonConsumableProducts.ContainsKey(product)) |
||||
|
id = ProductsList.NonConsumableProducts[product]; |
||||
|
|
||||
|
return id; |
||||
|
} |
||||
|
|
||||
|
private Products GetProductById(string id) |
||||
|
{ |
||||
|
Products product = Products.NULL; |
||||
|
|
||||
|
if (ProductsList.ConsumableProducts.ContainsValue(id)) |
||||
|
product = ProductsList.ConsumableProducts.FirstOrDefault(x => x.Value == id).Key; |
||||
|
|
||||
|
if (ProductsList.NonConsumableProducts.ContainsValue(id)) |
||||
|
product = ProductsList.NonConsumableProducts.FirstOrDefault(x => x.Value == id).Key; |
||||
|
|
||||
|
return product; |
||||
|
} |
||||
|
|
||||
|
public void BuyProduct(string productId) |
||||
|
{ |
||||
|
if (IsInitialized()) |
||||
|
{ |
||||
|
Product product = _storeController.products.WithID(productId); |
||||
|
|
||||
|
if (product != null && product.availableToPurchase) |
||||
|
{ |
||||
|
Debug.Log(string.Format("Purchasing product asychronously: '{0}'", product.definition.id)); |
||||
|
_storeController.InitiatePurchase(product); |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
Debug.Log("BuyProductID: FAIL. Not purchasing product, either is not found or is not available for purchase"); |
||||
|
OnPurchaseFailed(product, PurchaseFailureReason.ProductUnavailable); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public void OnInitialized(IStoreController controller, IExtensionProvider extensions) |
||||
|
{ |
||||
|
Debug.Log("OnInitialized: PASS"); |
||||
|
|
||||
|
_storeController = controller; |
||||
|
_storeExtensionProvider = extensions; |
||||
|
|
||||
|
foreach (string s in ProductsList.ConsumableProducts.Values) |
||||
|
GetLocalizedPrice(GetProductById(s)); |
||||
|
|
||||
|
foreach (string s in ProductsList.NonConsumableProducts.Values) |
||||
|
GetLocalizedPrice(GetProductById(s)); |
||||
|
} |
||||
|
|
||||
|
public void OnInitializeFailed(InitializationFailureReason error) |
||||
|
{ |
||||
|
Debug.Log("OnInitializeFailed InitializationFailureReason:" + error); |
||||
|
} |
||||
|
|
||||
|
public PurchaseProcessingResult ProcessPurchase(PurchaseEventArgs args) |
||||
|
{ |
||||
|
Products product = Products.NULL; |
||||
|
|
||||
|
if (ProductsList.ConsumableProducts.ContainsValue(args.purchasedProduct.definition.id)) |
||||
|
{ |
||||
|
product = ProductsList.ConsumableProducts.FirstOrDefault(x => x.Value == args.purchasedProduct.definition.id).Key; |
||||
|
} |
||||
|
|
||||
|
if (ProductsList.NonConsumableProducts.ContainsValue(args.purchasedProduct.definition.id)) |
||||
|
{ |
||||
|
product = ProductsList.NonConsumableProducts.FirstOrDefault(x => x.Value == args.purchasedProduct.definition.id).Key; |
||||
|
|
||||
|
PlayerPrefs.SetString(args.purchasedProduct.definition.id.ToString() + "_purchased", "true"); |
||||
|
} |
||||
|
|
||||
|
if (OnPurchaseSuccess != null) |
||||
|
OnPurchaseSuccess(product); |
||||
|
|
||||
|
Debug.Log(args.purchasedProduct.definition.id + " Buyed!"); |
||||
|
|
||||
|
return PurchaseProcessingResult.Complete; |
||||
|
} |
||||
|
|
||||
|
public void OnPurchaseFailed(Product product, PurchaseFailureReason failureReason) |
||||
|
{ |
||||
|
if (OnPurchaseFaile != null) |
||||
|
OnPurchaseFaile(product, failureReason); |
||||
|
|
||||
|
Debug.Log(string.Format("OnPurchaseFailed: FAIL. Product: '{0}', PurchaseFailureReason: {1}", product.definition.storeSpecificId, failureReason)); |
||||
|
} |
||||
|
|
||||
|
#endregion
|
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,11 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: 88e4de0f8e3959948b3ce8c560944b8a |
||||
|
MonoImporter: |
||||
|
externalObjects: {} |
||||
|
serializedVersion: 2 |
||||
|
defaultReferences: [] |
||||
|
executionOrder: 0 |
||||
|
icon: {instanceID: 0} |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
@ -0,0 +1,8 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: 9a58b7f8e5b3fd24eb48324b5a768067 |
||||
|
folderAsset: yes |
||||
|
DefaultImporter: |
||||
|
externalObjects: {} |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
@ -0,0 +1,92 @@ |
|||||
|
using System; |
||||
|
using System.Collections; |
||||
|
using System.Collections.Generic; |
||||
|
using UnityEngine; |
||||
|
using Core.Settings; |
||||
|
using Localization.Utils; |
||||
|
|
||||
|
namespace Localization |
||||
|
{ |
||||
|
public static class LocalizationManager |
||||
|
{ |
||||
|
public static void Init() |
||||
|
{ |
||||
|
if (CoreSettings.data.localizationTable != null) |
||||
|
{ |
||||
|
CSVDataTable table = new CSVDataTable(); |
||||
|
table.ReadFromTextAsset(CoreSettings.data.localizationTable); |
||||
|
|
||||
|
List<string> languages = table.Header; |
||||
|
|
||||
|
for (int i = 1; i < languages.Count; i++) |
||||
|
{ |
||||
|
_dictionary.Add((SystemLanguage)Enum.Parse(typeof(SystemLanguage), languages[i]), new List<string>()); |
||||
|
} |
||||
|
|
||||
|
for (int i = 0; i < table.RowCount; i++) |
||||
|
{ |
||||
|
List<string> senteces = table.GetRow(i); |
||||
|
|
||||
|
_keys.Add(senteces[0]); |
||||
|
|
||||
|
for (int j = 1; j < senteces.Count; j++) |
||||
|
{ |
||||
|
_dictionary[(SystemLanguage)Enum.Parse(typeof(SystemLanguage), languages[j])].Add(senteces[j]); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public static Action<SystemLanguage> OnLocalizationChanged = null; |
||||
|
|
||||
|
private static List<string> _keys = new List<string>(); |
||||
|
private static Dictionary<SystemLanguage, List<string>> _dictionary = new Dictionary<SystemLanguage, List<string>>(); |
||||
|
|
||||
|
public static SystemLanguage CurrentLanguage |
||||
|
{ |
||||
|
get => ConvertToAvailableLanguage((SystemLanguage)PlayerPrefs.GetInt("CurrentLanguage", (int)Application.systemLanguage)); |
||||
|
set |
||||
|
{ |
||||
|
SystemLanguage language = ConvertToAvailableLanguage(value); |
||||
|
PlayerPrefs.SetInt("CurrentLanguage", (int)language); |
||||
|
OnLocalizationChanged?.Invoke(language); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public static string GetLocalizedString(string key) |
||||
|
{ |
||||
|
string text = "localization_error"; |
||||
|
|
||||
|
if (_keys.Contains(key)) |
||||
|
{ |
||||
|
if (_dictionary.ContainsKey(CurrentLanguage)) |
||||
|
text = _dictionary[CurrentLanguage][_keys.IndexOf(key)]; |
||||
|
else |
||||
|
Debug.LogError($"LocalizationManager: language \"{CurrentLanguage.ToString()}\" not found"); |
||||
|
} |
||||
|
else |
||||
|
Debug.LogError($"LocalizationManager: key \"{key}\" not found"); |
||||
|
|
||||
|
return text; |
||||
|
} |
||||
|
|
||||
|
private static SystemLanguage ConvertToAvailableLanguage(SystemLanguage language) |
||||
|
{ |
||||
|
SystemLanguage availableLanguage = SystemLanguage.English; |
||||
|
|
||||
|
if (CoreSettings.data.availableLanguages.Contains(language)) |
||||
|
{ |
||||
|
availableLanguage = language; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
if ((language == SystemLanguage.Ukrainian || language == SystemLanguage.Belarusian) && CoreSettings.data.availableLanguages.Contains(SystemLanguage.Russian)) |
||||
|
{ |
||||
|
availableLanguage = SystemLanguage.Russian; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return availableLanguage; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,11 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: ab702ba2f88a1a44b95047f1b765d780 |
||||
|
MonoImporter: |
||||
|
externalObjects: {} |
||||
|
serializedVersion: 2 |
||||
|
defaultReferences: [] |
||||
|
executionOrder: 0 |
||||
|
icon: {instanceID: 0} |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
@ -0,0 +1,8 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: ea75ecc49606a3f4cbf619aa84b48353 |
||||
|
folderAsset: yes |
||||
|
DefaultImporter: |
||||
|
externalObjects: {} |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
@ -0,0 +1,99 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using UnityEngine; |
||||
|
using System.IO; |
||||
|
using System.Linq; |
||||
|
|
||||
|
namespace Localization.Utils |
||||
|
{ |
||||
|
|
||||
|
public class CSVDataTable |
||||
|
{ |
||||
|
List<List<string>> _allText; |
||||
|
|
||||
|
List<string> _header; |
||||
|
public List<string> Header |
||||
|
{ |
||||
|
get |
||||
|
{ |
||||
|
return _header; |
||||
|
} |
||||
|
} |
||||
|
int _rowCount; |
||||
|
public int RowCount |
||||
|
{ |
||||
|
get |
||||
|
{ |
||||
|
return _rowCount; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public CSVDataTable() |
||||
|
{ |
||||
|
_allText = new List<List<string>> (); |
||||
|
_header = new List<string> (); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
public List<string> GetRow (int index) |
||||
|
{ |
||||
|
|
||||
|
if (_rowCount > index && index >= 0) |
||||
|
{ |
||||
|
return _allText.ElementAt (index); |
||||
|
} else |
||||
|
{ |
||||
|
throw(new ArgumentOutOfRangeException ()); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
} |
||||
|
|
||||
|
|
||||
|
public void ReadFromStream(Stream stream) |
||||
|
{ |
||||
|
try |
||||
|
{ |
||||
|
using (var reader = new CsvFileReader (stream, EmptyLineBehavior.IGNORE)) |
||||
|
{ |
||||
|
var dataGrid = new List<List<string>> (); |
||||
|
|
||||
|
if (reader.ReadAll (dataGrid)) |
||||
|
{ |
||||
|
_header = dataGrid[0]; |
||||
|
dataGrid.RemoveAt (0); |
||||
|
_allText = dataGrid; |
||||
|
_rowCount = _allText.Count; |
||||
|
for (int i = 0; i < _allText.Count; ++i) |
||||
|
{ |
||||
|
var it = _allText[i]; |
||||
|
if (it.Count != _header.Count) |
||||
|
{ |
||||
|
// +2 - in all spreadsheets rows start from 1 and first line is a header
|
||||
|
throw new Exception(string.Format("Row on line {0} contains different amount of collumns than header ({1} vs {2}", i + 2, it.Count, _header.Count)); |
||||
|
} |
||||
|
} |
||||
|
} else |
||||
|
{ |
||||
|
throw(new Exception("CSV table read failed")); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
catch(IOException e) |
||||
|
{ |
||||
|
throw new Exception(string.Format("IO error: {0}", e)); |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
|
|
||||
|
public void ReadFromTextAsset(TextAsset textAsset) |
||||
|
{ |
||||
|
using (var stream = new MemoryStream (textAsset.bytes)) |
||||
|
{ |
||||
|
ReadFromStream (stream); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
||||
@ -0,0 +1,11 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: 12322ee7e3606b149a76b042f9659b4c |
||||
|
MonoImporter: |
||||
|
externalObjects: {} |
||||
|
serializedVersion: 2 |
||||
|
defaultReferences: [] |
||||
|
executionOrder: 0 |
||||
|
icon: {instanceID: 0} |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
@ -0,0 +1,37 @@ |
|||||
|
namespace Localization.Utils |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// Common base class for CSV reader and writer classes.
|
||||
|
/// </summary>
|
||||
|
public abstract class CsvFileCommon |
||||
|
{ |
||||
|
// Indexes into SpecialChars for characters with specific meaning
|
||||
|
private const int DELIMITER_INDEX = 0; |
||||
|
|
||||
|
private const int QUOTE_INDEX = 1; |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Gets/sets the character used for column delimiters.
|
||||
|
/// </summary>
|
||||
|
public char Delimiter |
||||
|
{ |
||||
|
get { return SpecialChars[DELIMITER_INDEX]; } |
||||
|
set { SpecialChars[DELIMITER_INDEX] = value; } |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Gets/sets the character used for column quotes.
|
||||
|
/// </summary>
|
||||
|
public char Quote |
||||
|
{ |
||||
|
get { return SpecialChars[QUOTE_INDEX]; } |
||||
|
set { SpecialChars[QUOTE_INDEX] = value; } |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// These are special characters in CSV files. If a column contains any
|
||||
|
/// of these characters, the entire column is wrapped in double quotes.
|
||||
|
/// </summary>
|
||||
|
protected char[] SpecialChars = {',', '"', '\r', '\n'}; |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,11 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: ee7bae9f19111b14285eaedc50cb8243 |
||||
|
MonoImporter: |
||||
|
externalObjects: {} |
||||
|
serializedVersion: 2 |
||||
|
defaultReferences: [] |
||||
|
executionOrder: 0 |
||||
|
icon: {instanceID: 0} |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
@ -0,0 +1,258 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Diagnostics; |
||||
|
using System.IO; |
||||
|
using System.Text; |
||||
|
|
||||
|
namespace Localization.Utils |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// Class for reading from comma-separated-value (CSV) files
|
||||
|
/// </summary>
|
||||
|
public class CsvFileReader : CsvFileCommon, IDisposable |
||||
|
{ |
||||
|
private string _currLine; |
||||
|
private int _currPos; |
||||
|
|
||||
|
private readonly EmptyLineBehavior _emptyLineBehavior; |
||||
|
|
||||
|
// Private members
|
||||
|
private readonly StreamReader _reader; |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Initializes a new instance of the CsvFileReader class for the
|
||||
|
/// specified stream.
|
||||
|
/// </summary>
|
||||
|
/// <param name="stream">The stream to read from</param>
|
||||
|
/// <param name="emptyLineBehavior">Determines how empty lines are handled</param>
|
||||
|
public CsvFileReader (StreamReader reader, |
||||
|
EmptyLineBehavior emptyLineBehavior = EmptyLineBehavior.NO_COLUMNS) |
||||
|
{ |
||||
|
_reader = reader; |
||||
|
_emptyLineBehavior = emptyLineBehavior; |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Initializes a new instance of the CsvFileReader class for the
|
||||
|
/// specified stream.
|
||||
|
/// </summary>
|
||||
|
/// <param name="stream">The stream to read from</param>
|
||||
|
/// <param name="emptyLineBehavior">Determines how empty lines are handled</param>
|
||||
|
public CsvFileReader(Stream stream, |
||||
|
EmptyLineBehavior emptyLineBehavior = EmptyLineBehavior.NO_COLUMNS) |
||||
|
{ |
||||
|
_reader = new StreamReader(stream); |
||||
|
_emptyLineBehavior = emptyLineBehavior; |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Initializes a new instance of the CsvFileReader class for the
|
||||
|
/// specified file path.
|
||||
|
/// </summary>
|
||||
|
/// <param name="path">The name of the CSV file to read from</param>
|
||||
|
/// <param name="emptyLineBehavior">Determines how empty lines are handled</param>
|
||||
|
public CsvFileReader(string path, |
||||
|
EmptyLineBehavior emptyLineBehavior = EmptyLineBehavior.NO_COLUMNS) |
||||
|
{ |
||||
|
_reader = new StreamReader(path); |
||||
|
_emptyLineBehavior = emptyLineBehavior; |
||||
|
} |
||||
|
|
||||
|
// Propagate Dispose to StreamReader
|
||||
|
public void Dispose() |
||||
|
{ |
||||
|
_reader.Dispose(); |
||||
|
} |
||||
|
|
||||
|
public static List<List<string>> ReadAll(string path, Encoding encoding) |
||||
|
{ |
||||
|
using (var sr = new StreamReader(path, encoding)) |
||||
|
{ |
||||
|
var cfr = new CsvFileReader(sr); |
||||
|
var dataGrid = new List<List<string>>(); |
||||
|
if (cfr.ReadAll(dataGrid)) |
||||
|
{ |
||||
|
return dataGrid; |
||||
|
} |
||||
|
} |
||||
|
return null; |
||||
|
} |
||||
|
|
||||
|
public bool ReadAll(List<List<string>> dataGrid) |
||||
|
{ |
||||
|
// Verify required argument
|
||||
|
if (dataGrid == null) |
||||
|
{ |
||||
|
throw new ArgumentNullException("dataGrid"); |
||||
|
} |
||||
|
|
||||
|
var row = new List<string>(); |
||||
|
while (ReadRow(row)) |
||||
|
{ |
||||
|
dataGrid.Add(new List<string>(row)); |
||||
|
} |
||||
|
|
||||
|
return true; |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Reads a row of columns from the current CSV file. Returns false if no
|
||||
|
/// more data could be read because the end of the file was reached.
|
||||
|
/// </summary>
|
||||
|
/// <param name="columns">Collection to hold the columns read</param>
|
||||
|
public bool ReadRow(List<string> columns) |
||||
|
{ |
||||
|
// Verify required argument
|
||||
|
if (columns == null) |
||||
|
{ |
||||
|
throw new ArgumentNullException("columns"); |
||||
|
} |
||||
|
|
||||
|
ReadNextLine: |
||||
|
// Read next line from the file
|
||||
|
_currLine = _reader.ReadLine(); |
||||
|
_currPos = 0; |
||||
|
// Test for end of file
|
||||
|
if (_currLine == null) |
||||
|
{ |
||||
|
return false; |
||||
|
} |
||||
|
// Test for empty line
|
||||
|
if (_currLine.Length == 0) |
||||
|
{ |
||||
|
switch (_emptyLineBehavior) |
||||
|
{ |
||||
|
case EmptyLineBehavior.NO_COLUMNS: |
||||
|
columns.Clear(); |
||||
|
return true; |
||||
|
case EmptyLineBehavior.IGNORE: |
||||
|
goto ReadNextLine; |
||||
|
case EmptyLineBehavior.END_OF_FILE: |
||||
|
return false; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// Parse line
|
||||
|
string column; |
||||
|
var numColumns = 0; |
||||
|
while (true) |
||||
|
{ |
||||
|
// Read next column
|
||||
|
if (_currPos < _currLine.Length && _currLine[_currPos] == Quote) |
||||
|
{ |
||||
|
column = ReadQuotedColumn(); |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
column = ReadUnquotedColumn(); |
||||
|
} |
||||
|
// Add column to list
|
||||
|
if (numColumns < columns.Count) |
||||
|
{ |
||||
|
columns[numColumns] = column; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
columns.Add(column); |
||||
|
} |
||||
|
numColumns++; |
||||
|
// Break if we reached the end of the line
|
||||
|
if (_currLine == null || _currPos == _currLine.Length) |
||||
|
{ |
||||
|
break; |
||||
|
} |
||||
|
// Otherwise skip delimiter
|
||||
|
Debug.Assert(_currLine[_currPos] == Delimiter); |
||||
|
_currPos++; |
||||
|
} |
||||
|
// Remove any unused columns from collection
|
||||
|
if (numColumns < columns.Count) |
||||
|
{ |
||||
|
columns.RemoveRange(numColumns, columns.Count - numColumns); |
||||
|
} |
||||
|
// Indicate success
|
||||
|
return true; |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Reads a quoted column by reading from the current line until a
|
||||
|
/// closing quote is found or the end of the file is reached. On return,
|
||||
|
/// the current position points to the delimiter or the end of the last
|
||||
|
/// line in the file. Note: CurrLine may be set to null on return.
|
||||
|
/// </summary>
|
||||
|
private string ReadQuotedColumn() |
||||
|
{ |
||||
|
// Skip opening quote character
|
||||
|
Debug.Assert(_currPos < _currLine.Length && _currLine[_currPos] == Quote); |
||||
|
_currPos++; |
||||
|
|
||||
|
// Parse column
|
||||
|
var builder = new StringBuilder(); |
||||
|
while (true) |
||||
|
{ |
||||
|
while (_currPos == _currLine.Length) |
||||
|
{ |
||||
|
// End of line so attempt to read the next line
|
||||
|
_currLine = _reader.ReadLine(); |
||||
|
_currPos = 0; |
||||
|
// Done if we reached the end of the file
|
||||
|
if (_currLine == null) |
||||
|
{ |
||||
|
return builder.ToString(); |
||||
|
} |
||||
|
// Otherwise, treat as a multi-line field
|
||||
|
builder.Append(Environment.NewLine); |
||||
|
} |
||||
|
|
||||
|
// Test for quote character
|
||||
|
if (_currLine[_currPos] == Quote) |
||||
|
{ |
||||
|
// If two quotes, skip first and treat second as literal
|
||||
|
var nextPos = _currPos + 1; |
||||
|
if (nextPos < _currLine.Length && _currLine[nextPos] == Quote) |
||||
|
{ |
||||
|
_currPos++; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
break; // Single quote ends quoted sequence
|
||||
|
} |
||||
|
} |
||||
|
// Add current character to the column
|
||||
|
builder.Append(_currLine[_currPos++]); |
||||
|
} |
||||
|
|
||||
|
if (_currPos < _currLine.Length) |
||||
|
{ |
||||
|
// Consume closing quote
|
||||
|
Debug.Assert(_currLine[_currPos] == Quote); |
||||
|
_currPos++; |
||||
|
// Append any additional characters appearing before next delimiter
|
||||
|
builder.Append(ReadUnquotedColumn()); |
||||
|
} |
||||
|
// Return column value
|
||||
|
return builder.ToString(); |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Reads an unquoted column by reading from the current line until a
|
||||
|
/// delimiter is found or the end of the line is reached. On return, the
|
||||
|
/// current position points to the delimiter or the end of the current
|
||||
|
/// line.
|
||||
|
/// </summary>
|
||||
|
private string ReadUnquotedColumn() |
||||
|
{ |
||||
|
var startPos = _currPos; |
||||
|
_currPos = _currLine.IndexOf(Delimiter, _currPos); |
||||
|
if (_currPos == -1) |
||||
|
{ |
||||
|
_currPos = _currLine.Length; |
||||
|
} |
||||
|
if (_currPos > startPos) |
||||
|
{ |
||||
|
return _currLine.Substring(startPos, _currPos - startPos); |
||||
|
} |
||||
|
return string.Empty; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,11 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: 89aa50a883f45354fa8a354bd40d01ec |
||||
|
MonoImporter: |
||||
|
externalObjects: {} |
||||
|
serializedVersion: 2 |
||||
|
defaultReferences: [] |
||||
|
executionOrder: 0 |
||||
|
icon: {instanceID: 0} |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
@ -0,0 +1,118 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.IO; |
||||
|
using System.Text; |
||||
|
|
||||
|
namespace Localization.Utils |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// Class for writing to comma-separated-value (CSV) files.
|
||||
|
/// </summary>
|
||||
|
public class CsvFileWriter : CsvFileCommon, IDisposable |
||||
|
{ |
||||
|
private string _oneQuote; |
||||
|
private string _quotedFormat; |
||||
|
|
||||
|
private string _twoQuotes; |
||||
|
|
||||
|
// Private members
|
||||
|
private readonly StreamWriter _writer; |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Initializes a new instance of the CsvFileWriter class for the
|
||||
|
/// specified stream.
|
||||
|
/// </summary>
|
||||
|
/// <param name="stream">The stream to write to</param>
|
||||
|
public CsvFileWriter(StreamWriter writer) |
||||
|
{ |
||||
|
_writer = writer; |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Initializes a new instance of the CsvFileWriter class for the
|
||||
|
/// specified stream.
|
||||
|
/// </summary>
|
||||
|
/// <param name="stream">The stream to write to</param>
|
||||
|
public CsvFileWriter(Stream stream) |
||||
|
{ |
||||
|
_writer = new StreamWriter(stream); |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Initializes a new instance of the CsvFileWriter class for the
|
||||
|
/// specified file path.
|
||||
|
/// </summary>
|
||||
|
/// <param name="path">The name of the CSV file to write to</param>
|
||||
|
public CsvFileWriter(string path) |
||||
|
{ |
||||
|
_writer = new StreamWriter(path); |
||||
|
} |
||||
|
|
||||
|
// Propagate Dispose to StreamWriter
|
||||
|
public void Dispose() |
||||
|
{ |
||||
|
_writer.Dispose(); |
||||
|
} |
||||
|
|
||||
|
public static void WriteAll(List<List<string>> dataGrid, string path, Encoding encoding) |
||||
|
{ |
||||
|
using (var sw = new StreamWriter(path, false, encoding)) |
||||
|
{ |
||||
|
var cfw = new CsvFileWriter(sw); |
||||
|
foreach (var row in dataGrid) |
||||
|
{ |
||||
|
cfw.WriteRow(row); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public void WriteAll(List<List<string>> dataGrid) |
||||
|
{ |
||||
|
foreach (var row in dataGrid) |
||||
|
{ |
||||
|
WriteRow(row); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Writes a row of columns to the current CSV file.
|
||||
|
/// </summary>
|
||||
|
/// <param name="columns">The list of columns to write</param>
|
||||
|
public void WriteRow(List<string> columns) |
||||
|
{ |
||||
|
// Verify required argument
|
||||
|
if (columns == null) |
||||
|
{ |
||||
|
throw new ArgumentNullException("columns"); |
||||
|
} |
||||
|
|
||||
|
// Ensure we're using current quote character
|
||||
|
if (_oneQuote == null || _oneQuote[0] != Quote) |
||||
|
{ |
||||
|
_oneQuote = string.Format("{0}", Quote); |
||||
|
_twoQuotes = string.Format("{0}{0}", Quote); |
||||
|
_quotedFormat = string.Format("{0}{{0}}{0}", Quote); |
||||
|
} |
||||
|
|
||||
|
// Write each column
|
||||
|
for (var i = 0; i < columns.Count; i++) |
||||
|
{ |
||||
|
// Add delimiter if this isn't the first column
|
||||
|
if (i > 0) |
||||
|
{ |
||||
|
_writer.Write(Delimiter); |
||||
|
} |
||||
|
// Write this column
|
||||
|
if (columns[i].IndexOfAny(SpecialChars) == -1) |
||||
|
{ |
||||
|
_writer.Write(columns[i]); |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
_writer.Write(_quotedFormat, columns[i].Replace(_oneQuote, _twoQuotes)); |
||||
|
} |
||||
|
} |
||||
|
_writer.Write("\r\n"); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,11 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: 0a3fbb53c14f3c84ba441294895cf3dc |
||||
|
MonoImporter: |
||||
|
externalObjects: {} |
||||
|
serializedVersion: 2 |
||||
|
defaultReferences: [] |
||||
|
executionOrder: 0 |
||||
|
icon: {instanceID: 0} |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
@ -0,0 +1,30 @@ |
|||||
|
namespace Localization.Utils |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// Determines how empty lines are interpreted when reading CSV files.
|
||||
|
/// These values do not affect empty lines that occur within quoted fields
|
||||
|
/// or empty lines that appear at the end of the input file.
|
||||
|
/// </summary>
|
||||
|
public enum EmptyLineBehavior |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// Empty lines are interpreted as a line with zero columns.
|
||||
|
/// </summary>
|
||||
|
NO_COLUMNS, |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Empty lines are interpreted as a line with a single empty column.
|
||||
|
/// </summary>
|
||||
|
EMPTY_COLUMN, |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Empty lines are skipped over as though they did not exist.
|
||||
|
/// </summary>
|
||||
|
IGNORE, |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// An empty line is interpreted as the end of the input file.
|
||||
|
/// </summary>
|
||||
|
END_OF_FILE |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,11 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: e2bfcdfe1b7a42b43b885314324e4262 |
||||
|
MonoImporter: |
||||
|
externalObjects: {} |
||||
|
serializedVersion: 2 |
||||
|
defaultReferences: [] |
||||
|
executionOrder: 0 |
||||
|
icon: {instanceID: 0} |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
@ -0,0 +1,8 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: bbf61a7b3acb5df42b727b467f660b78 |
||||
|
folderAsset: yes |
||||
|
DefaultImporter: |
||||
|
externalObjects: {} |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
@ -0,0 +1,16 @@ |
|||||
|
using System.Collections; |
||||
|
using System.Collections.Generic; |
||||
|
using UnityEngine; |
||||
|
using UnityEngine.UI; |
||||
|
|
||||
|
namespace Core.SceneManagement |
||||
|
{ |
||||
|
[RequireComponent(typeof(Button))] |
||||
|
public class LoadSceneButton : MonoBehaviour |
||||
|
{ |
||||
|
[SerializeField] private Scenes _scene = Scenes.None; |
||||
|
|
||||
|
private void Awake() => |
||||
|
GetComponent<Button>().onClick.AddListener(() => SceneLoader.LoadScene(_scene)); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,11 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: a3d788ed48556cc4e89bf819a08da493 |
||||
|
MonoImporter: |
||||
|
externalObjects: {} |
||||
|
serializedVersion: 2 |
||||
|
defaultReferences: [] |
||||
|
executionOrder: 0 |
||||
|
icon: {instanceID: 0} |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
@ -0,0 +1,12 @@ |
|||||
|
using System.Collections; |
||||
|
using System.Collections.Generic; |
||||
|
using UnityEngine; |
||||
|
|
||||
|
namespace Core.SceneManagement |
||||
|
{ |
||||
|
public class LoadingScreen : MonoBehaviour |
||||
|
{ |
||||
|
public CanvasGroup fade = null; |
||||
|
public GameObject mainPanel = null; |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,11 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: d874de286c559e5448db4bb4513e8783 |
||||
|
MonoImporter: |
||||
|
externalObjects: {} |
||||
|
serializedVersion: 2 |
||||
|
defaultReferences: [] |
||||
|
executionOrder: 0 |
||||
|
icon: {instanceID: 0} |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
@ -0,0 +1,148 @@ |
|||||
|
using System; |
||||
|
using System.Collections; |
||||
|
using UnityEngine; |
||||
|
using UnityEngine.SceneManagement; |
||||
|
using Core.Ads; |
||||
|
using Core.Settings; |
||||
|
using System.Linq; |
||||
|
|
||||
|
namespace Core.SceneManagement |
||||
|
{ |
||||
|
public class SceneLoader : MonoBehaviour |
||||
|
{ |
||||
|
private static SceneLoader _instance = null; |
||||
|
|
||||
|
public static void Init() |
||||
|
{ |
||||
|
GameObject gameObject = new GameObject("[SceneLoader]"); |
||||
|
_instance = gameObject.AddComponent<SceneLoader>(); |
||||
|
|
||||
|
DontDestroyOnLoad(_instance); |
||||
|
|
||||
|
if (SceneManager.GetActiveScene().name == Scenes.Init.ToString()) |
||||
|
{ |
||||
|
_currentLoadingScreen = Instantiate(CoreSettings.data.mainLoadingScreen, _instance.transform); |
||||
|
_currentLoadingScreen.fade.alpha = 0f; |
||||
|
_currentLoadingScreen.mainPanel.SetActive(false); |
||||
|
|
||||
|
LoadScene(CoreSettings.data.firstScene); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public static event Action<Scenes> OnLoadedStart; |
||||
|
public static event Action<Scenes, Scenes> OnLoadedComplete; |
||||
|
public static event Action<bool> OnFadeScreenVisibleChanged = null; |
||||
|
|
||||
|
private static Scenes _currentScene = Scenes.Init; |
||||
|
public static Scenes CurrentScene => _currentScene; |
||||
|
|
||||
|
private static LoadingScreen _currentLoadingScreen = null; |
||||
|
|
||||
|
private static bool _isSceneLoading = false; |
||||
|
|
||||
|
public static void LoadScene(Scenes scene) |
||||
|
{ |
||||
|
if (_isSceneLoading) |
||||
|
{ |
||||
|
Debug.LogError("SceneLoader: The scene is already loading"); |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
OnLoadedStart?.Invoke(scene); |
||||
|
|
||||
|
_instance.StartCoroutine(StartLoad(scene)); |
||||
|
} |
||||
|
|
||||
|
private static IEnumerator StartLoad(Scenes scene) |
||||
|
{ |
||||
|
_isSceneLoading = true; |
||||
|
|
||||
|
if (CoreSettings.data.needBanner) |
||||
|
AdsManager.HideBanner(); |
||||
|
|
||||
|
if (_currentLoadingScreen == null) |
||||
|
{ |
||||
|
if (CoreSettings.data.loadingScreenForRandom.Count != 0) |
||||
|
_currentLoadingScreen = Instantiate(CoreSettings.data.loadingScreenForRandom[UnityEngine.Random.Range(0, CoreSettings.data.loadingScreenForRandom.Count)], _instance.transform); |
||||
|
else |
||||
|
_currentLoadingScreen = Instantiate(CoreSettings.data.mainLoadingScreen, _instance.transform); |
||||
|
|
||||
|
_currentLoadingScreen.fade.alpha = 0f; |
||||
|
_currentLoadingScreen.mainPanel.SetActive(false); |
||||
|
} |
||||
|
|
||||
|
yield return _instance.StartCoroutine(FadeLoadingScreen(1, CoreSettings.data.fadeDuration)); |
||||
|
|
||||
|
_currentLoadingScreen.mainPanel.SetActive(true); |
||||
|
|
||||
|
yield return _instance.StartCoroutine(FadeLoadingScreen(0, CoreSettings.data.fadeDuration)); |
||||
|
|
||||
|
OnFadeScreenVisibleChanged?.Invoke(true); |
||||
|
|
||||
|
Scenes fromScene = _currentScene; |
||||
|
|
||||
|
AsyncOperation operation = SceneManager.LoadSceneAsync(scene.ToString()); |
||||
|
|
||||
|
operation.allowSceneActivation = false; |
||||
|
|
||||
|
yield return new WaitForSeconds(CoreSettings.data.minimumLoadingScreenLifetime); |
||||
|
|
||||
|
_currentScene = scene; |
||||
|
|
||||
|
operation.allowSceneActivation = true; |
||||
|
|
||||
|
while (!operation.isDone) |
||||
|
{ |
||||
|
yield return null; |
||||
|
} |
||||
|
|
||||
|
yield return _instance.StartCoroutine(FadeLoadingScreen(1, CoreSettings.data.fadeDuration)); |
||||
|
|
||||
|
_currentLoadingScreen.mainPanel.SetActive(false); |
||||
|
|
||||
|
if (CoreSettings.data.needInterstitial) |
||||
|
{ |
||||
|
if (AdsManager.IsInterstitialReady() && CoreSettings.data.interstitialSettings.Contains(fromScene)) |
||||
|
{ |
||||
|
AdsManager.ShowInterstitial(); |
||||
|
|
||||
|
while (AdsManager.IsInterstitialVisible()) |
||||
|
{ |
||||
|
yield return null; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
yield return _instance.StartCoroutine(FadeLoadingScreen(0, CoreSettings.data.fadeDuration)); |
||||
|
|
||||
|
OnFadeScreenVisibleChanged?.Invoke(false); |
||||
|
|
||||
|
OnLoadedComplete?.Invoke(fromScene, scene); |
||||
|
|
||||
|
Destroy(_currentLoadingScreen.gameObject); |
||||
|
|
||||
|
if (CoreSettings.data.needBanner) |
||||
|
{ |
||||
|
if (CoreSettings.data.bannerSettings.Where(s => s.scene == CurrentScene).Count() > 0) |
||||
|
AdsManager.ShowBanner(CoreSettings.data.bannerSettings.Where(s => s.scene == CurrentScene).FirstOrDefault().positions); |
||||
|
} |
||||
|
|
||||
|
_isSceneLoading = false; |
||||
|
} |
||||
|
|
||||
|
private static IEnumerator FadeLoadingScreen(float targetValue, float duration) |
||||
|
{ |
||||
|
float startValue = _currentLoadingScreen.fade.alpha; |
||||
|
float time = 0; |
||||
|
|
||||
|
while (time < duration) |
||||
|
{ |
||||
|
_currentLoadingScreen.fade.alpha = Mathf.Lerp(startValue, targetValue, time / duration); |
||||
|
time += Time.deltaTime; |
||||
|
yield return null; |
||||
|
} |
||||
|
|
||||
|
_currentLoadingScreen.fade.alpha = targetValue; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,11 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: bef826d6ddf15604b8c1cbac0affaa28 |
||||
|
MonoImporter: |
||||
|
externalObjects: {} |
||||
|
serializedVersion: 2 |
||||
|
defaultReferences: [] |
||||
|
executionOrder: 0 |
||||
|
icon: {instanceID: 0} |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
Some files were not shown because too many files changed in this diff
Loading…
Reference in new issue