質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

860閲覧

UnityにてActiveにしたボタンのDOTweenが機能しない

Great

総合スコア22

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2023/04/16 12:13

発生している問題

シーン開始時、非アクティブにしているボタンをスクリプトからアクティブにした際、そのボタンに対するDOTweenが機能しなくなる
最初からアクティブにしていた場合は意図通り機能する

ソースコード

ゲームを始めるボタンのスクリプト
親クラスのため記載

C#

1using DG.Tweening; 2using UnityEngine; 3using UnityEngine.EventSystems; 4using UnityEngine.SceneManagement; 5 6public class ButtonVsCom : MonoBehaviour, IPointerClickHandler, IPointerDownHandler, IPointerUpHandler 7{ 8 public System.Action onClickCallback; 9 10 [SerializeField] private CanvasGroup _canvasGroup; 11 12 public void OnPointerClick(PointerEventData eventData) 13 { 14 onClickCallback?.Invoke(); 15 ChangeScene(); 16 } 17 18 public void OnPointerDown(PointerEventData eventData) 19 { 20 transform.DOScale(0.95f, 0.24f).SetEase(Ease.OutCubic).SetLink(gameObject); 21 _canvasGroup.DOFade(0.8f, 0.24f).SetEase(Ease.OutCubic).SetLink(gameObject); 22 } 23 24 public void OnPointerUp(PointerEventData eventData) 25 { 26 if(gameObject != null) 27 { 28 transform.DOScale(1f, 0.24f).SetEase(Ease.OutCubic).SetLink(gameObject); 29 _canvasGroup.DOFade(1f, 0.24f).SetEase(Ease.OutCubic).SetLink(gameObject); 30 } 31 } 32 33 public virtual void ChangeScene() 34 { 35 DOTween.Clear(true); 36 SceneManager.LoadScene("InGame"); 37 } 38}

ゲームからタイトルに戻るボタンのスクリプト
こちらが該当のボタンについているオブジェクト

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.SceneManagement; 5using DG.Tweening; 6 7public class ButtonToTitle : ButtonVsCom 8{ 9 public override void ChangeScene() 10 { 11 DOTween.Clear(true); 12 SceneManager.LoadScene("Title"); 13 } 14}

SetActiveを実行するスクリプト
一番下のHPCheckにて実行しています

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5using TMPro; 6using System; 7using DG.Tweening; 8 9public class CollideTank : MonoBehaviour 10{ 11 BulletObj itemData; 12 [SerializeField] private TextMeshProUGUI _enemyHPText; 13 [SerializeField] GameObject wonObj; 14 [SerializeField] private GameObject pausing; 15 [SerializeField] private Transform team; 16 [SerializeField] private Slider enemyHPSlider; 17 18 [SerializeField] private GameObject toTitle; 19 20 private int _enemyHPInt; 21 22 void OnTriggerEnter2D(Collider2D collidedItem) 23 { 24 if(collidedItem.transform.parent.parent == team){ 25 itemData = collidedItem.gameObject.GetComponent<BulletObj>(); 26 _enemyHPInt = Convert.ToInt32(_enemyHPText.text); 27 if(itemData.Type == 0) 28 TakeDamage(itemData.Damage, _enemyHPText); 29 30 Destroy(collidedItem.gameObject); 31 } 32 33 } 34 35 void TakeDamage(int damage, TextMeshProUGUI enemyHPText) 36 { 37 _enemyHPInt -= damage; 38 if(_enemyHPInt <= 0) 39 _enemyHPInt = 0; 40 41 DOTween.To(() => enemyHPSlider.value, (x) => enemyHPSlider.value = x, _enemyHPInt, 1).OnUpdate(() => {enemyHPText.text = $"{enemyHPSlider.value:F0}";}).OnComplete(HPCheck); 42 } 43 44 private void HPCheck() 45 { 46 if(_enemyHPInt <= 0){ 47 Time.timeScale = 0; 48 _enemyHPText.text = "0"; 49 pausing.SetActive(true); 50 wonObj.SetActive(true); 51 //toTitle.SetActive(true); 52 toTitle.GetComponent<Image>().enabled = true; 53 } 54 } 55}

試したこと

SetActiveを使わずEnabledのほうがいいみたいなことを見たのでImageをEnabledするようにしてみたが変化なし

必要な情報がありましたら追加しますのでお声掛けください

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Y0241-N

2023/04/20 00:55

見た感じは特に問題点なさそうです。 SetActiveかenableかは処理負荷を気にしてもほぼ誤差なのでSetActiveでいいと思います。 処理が意図したタイミングで実行できなかった場合は、 本当に押せているのか、処理がどこまで実行されているのか (処理内にDebug.Logを仕込むなどで確認する) 意図したタイミングでボタンに処理が登録されているのか という点を確認してみてください。
guest

回答1

0

自己解決

Time.timeScaleの値が0だったためボタンのアニメーションが動かなかっただけでした

ボタンのDOTweenに.SetUpdate(true)をつけることでとりあえずは解決しました

本来ならポーズはTime.timeScaleを使わずに実装したほうがいいとのこと
しかしなかなかに難しそうなので保留。。。

投稿2023/04/20 08:02

Great

総合スコア22

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問