From 9e6a25044cfa138717adb01e17d1225e4b236247 Mon Sep 17 00:00:00 2001 From: kimura Date: Fri, 16 Jul 2021 14:06:57 +0900 Subject: [PATCH] =?UTF-8?q?=E3=82=B3=E3=82=A4=E3=83=B3=E3=83=9E=E3=83=8D?= =?UTF-8?q?=E3=83=BC=E3=82=B8=E3=83=A3=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- popcorn/Assets/MyGame/Scripts/CoinManager.cs | 82 +++++++++++++++++++ .../Assets/MyGame/Scripts/CoinManager.cs.meta | 3 + 2 files changed, 85 insertions(+) create mode 100644 popcorn/Assets/MyGame/Scripts/CoinManager.cs create mode 100644 popcorn/Assets/MyGame/Scripts/CoinManager.cs.meta diff --git a/popcorn/Assets/MyGame/Scripts/CoinManager.cs b/popcorn/Assets/MyGame/Scripts/CoinManager.cs new file mode 100644 index 00000000..32583ad3 --- /dev/null +++ b/popcorn/Assets/MyGame/Scripts/CoinManager.cs @@ -0,0 +1,82 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.UI; + +public class CoinManager : SingletonMonoBehaviour +{ + // CoinView + [SerializeField] private RectTransform coinIconTransform; + [SerializeField] private TextWithCountUpInt coinCountText; + [SerializeField] private Animator coinAnimator; + + [SerializeField] private RectTransform coinPrefab; + + // Animation + [SerializeField] private float duration = 0.5f; + + [SerializeField] private RectTransform rootTransform; + private int ownCoin; + public int OwnCoin => ownCoin; + private string coinTextFormat = "{0}"; + + void Awake(){ + if(CheckInstance()) return ; + } + + public void ChangeCoin(int count) + { + ownCoin = count; + coinCountText.ChangeValue(coinTextFormat, ownCoin); + } + + public void AddCoin(int count) + { + ownCoin += count; + coinCountText.CountUpAnimation(coinTextFormat, ownCoin, duration); + } + + public void AddCoinWithEffect(int count, Action callback) + { + ownCoin += count; + // 生成枚数決定 + var spawnCount = Mathf.Min(count, 7); + // 生成ポジション決め、生成 + InstantiateEffeect(coinPrefab, spawnCount, Vector3.zero, coinIconTransform.position, () => + { + coinCountText.CountUpAnimation(coinTextFormat, ownCoin, duration + spawnCount * 0.1f); + callback.Invoke(); + }); + } + + private void InstantiateEffeect(RectTransform prefab, int count, Vector3 from, Vector3 to, Action callback) + { + var baseAngle = UnityEngine.Random.value * 360.0f; + var angle = -360.0f / count; + //コインアニメーション + for(int i = 0; i < count; ++i){ + var index = i; + // 円状にバラけてた位置を生成 + var tempPosition = from + (Vector3)Vector2.up.RotateDeg(baseAngle + i * angle + angle * UnityEngine.Random.value * 0.5f) * (0.2f + UnityEngine.Random.value * 0.8f); + // 0.1秒ごとにコインを生成 + this.CallWaitForSeconds(index * 0.1f, () => { + var effect = Instantiate(prefab, tempPosition, Quaternion.identity, rootTransform); + // 表示から1秒経ったら0.2秒かけてコイン表示部分に飛んでいく + this.CallWaitForSeconds(1.0f, () => { + this.CallLerp(0.2f, t => { + effect.position = Vector3.Lerp(tempPosition, to, t * t); + }, () => { + // コインが到着したらSEとバイブ再生。コインはずみアニメーションを再生 + VibrationManager.Instance.PlayVibrationOnceWeak(); + coinAnimator.SetTrigger("Add"); + SoundManager.Instance.PlaySE("se_coin_count"); + // コインは削除 + Destroy(effect.gameObject); + }); + }); + }); + } + this.CallWaitForSeconds(1.0f + 0.2f, callback); + } +} diff --git a/popcorn/Assets/MyGame/Scripts/CoinManager.cs.meta b/popcorn/Assets/MyGame/Scripts/CoinManager.cs.meta new file mode 100644 index 00000000..1a778313 --- /dev/null +++ b/popcorn/Assets/MyGame/Scripts/CoinManager.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 60b7ac089a534e549c0e25a89b113261 +timeCreated: 1626411752 \ No newline at end of file