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

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

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

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

Unity

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

Q&A

解決済

2回答

5402閲覧

UnityでDOTween.Toメソッドを使ってスコアのアニメーションすると値がズレる

YDK

総合スコア63

C#

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

Unity

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

0グッド

0クリップ

投稿2021/05/06 05:37

Unityでスコアがアップする関数を呼び出してその関数内で、DOTween.To()メソッドを呼んでスコアの
テキストのアニメーションをしているのですが、アニメーションに指定した時間が長いと次に呼び出される
スコアアップ関数で値がずれてしまいます。指定した時間を早くすれば問題ないのですが、一定の値を超えると
ずれてしまいます。

C#

1public void UpdateScore(int scoreToAdd) 2 { 3 DOTween.Kill(tween); 4 sequence.Append(tween = DOTween.To(() => score, value => score = value, score + scoreToAdd, 0.2f) 5 .OnUpdate(() => scoreText.text = string.Format($"Score: {score:D7}"))); 6 }

C#

1scoreManager.UpdateScore(score);

UpdateScoreに指定したスコアを渡しています。

0.2fなどの低い値だと問題はないのですが、1.0fとかだとずれてしまいます。

どなたかわかる方がいましたら、回答お願いします。

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

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

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

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

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

guest

回答2

0

回答を書こうと思ったら回答が付いてますね

public void UpdateScore(int scoreToAdd) { tween.Kill(); var afterScore = score + scoreToAdd; sequence.Append(tween = DOTween.To(() => score, value => score = value, score + scoreToAdd, 1.0f) // .OnComplete(() => { score = afterScore; }) 必要なかった .OnKill(() => { score = afterScore; }) .OnUpdate(() => scoreText.text = string.Format($"Score: {score:D7}"))); }

hogefugapiyoさんと同じような意見、内容だと思います。
こちらでは先に結果のscoreを代入しておいて、
Kill、もしくはComplete、どちらの結果で終了したとしても決まった値を代入するというメソッドをtweenに追加してみました。

色々おかしかったのでコードを書き直しておきました。

投稿2021/05/06 09:04

編集2021/05/06 09:35
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

YDK

2021/05/06 09:41

回答ありがとうございます。 OnComplete, OnKillメソッドを呼ぶことで終了時にスコアの値を更新しているのはわかるのですが、 OnKillメソッドをコメントアウトにした時は値がズレるのに対し、OnCompleteメソッドをコメントアウト したときは値がズレませんでした。KillとCompleteメソッドの違いは大体わかるのですが、 OnKillとOnCompleteメソッドの違いはなんでしょうか? また、なぜOnCompleteメソッドだけだと値がズレるのでしょうか?
hogefugapiyo

2021/05/06 09:45

詳しくは1570pさんからお話いただけると思いますが、scoreをTweenで直接いじってしまっているのでTweenが完走しないとスコアの反映が途中で終わってしまいます。 例) ①100点取った(合計スコア100)  Tween→0からはじめて50まで増加 ②更に100点取った(合計スコア200)  さっきのTweenはKillしよ!(ここでKillされたせいでスコアが正常に反映されないまま終わる)  今のスコアは50か…じゃあ50から100点増えて150点まで増加しよう! ということで、スコアの増加と実際のスコアに差ができます。 OnKillでTweenがKillされたときもスコアの更新を担保することで、この部分をカバーしていると思います
hogefugapiyo

2021/05/06 09:58

(補足) ①と②は連続して発生したと考えてください。 アニメーション時間が1fなら、たとえば①の0.5秒後に②が起こった。というような感じです(最初のTweenが完走していない)
YDK

2021/05/06 10:25

値が反映されないままKillされた時の保険として中で値の更新をしているんですね。 おかげさまでDOTween.Toの仕組みについて知ることができました。 ありがとうございました。
guest

0

ベストアンサー

カウントアップが最後まで完走してないのに次が来るので値がズレるってことですかね。
スコアの更新と、表示するスコアを切り分けてみるのはどうですか?
scoreという生データをそのままDOTweenで走らせるのではなく
スコアの反映自体は瞬時に終わらせて、DOTweenではあくまでも見かけ上の数値が変わるだけっていう感じです。

質問の意図を勘違いしていたり、望む動作とは違うようでしたらすいません。

cs

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5using DG.Tweening; 6 7public class Test : MonoBehaviour { 8 [SerializeField] Text scoreText; 9 public int score = 0; 10 11 // Start is called before the first frame update 12 void Start() { 13 14 } 15 16 public void UpdateScore(int scoreToAdd) { 17 var tmpScore = score; // 現在のスコアを一旦記憶 18 var tmpScoreGoal = score + scoreToAdd; // 今回の加算でどこまで増えるか 19 score = tmpScoreGoal; // スコア自体はすぐ反映してしまう 20 21 // 表示する部分だけDOTweenで見せかける 22 DOTween.To(() => tmpScore, (value) => tmpScore = value, tmpScoreGoal, 1f) 23 .OnUpdate(()=> { scoreText.text = tmpScore.ToString(); }); 24 } 25} 26

投稿2021/05/06 08:40

編集2021/05/06 08:42
hogefugapiyo

総合スコア3302

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

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

YDK

2021/05/06 09:17

回答ありがとうございます。 やりたかったことはこれで合ってます。 コメントがあってすごくわかりやすかったです。 現在と加算した後の値を新しい変数に代入して、score変数自体はメソッドが呼ばれるたびに 値の代入と更新をすることで、指定した時間以内に呼び出されたとしても更新された値が適用されるので 値がズレることは無いって解釈で大丈夫でしょうか?
hogefugapiyo

2021/05/06 09:36

回答あってたようで良かったです。 今回って演出のためのアニメーションだと思うので、実際のスコアをn秒かけて書き換える必要は無いかなと思います。なのでスコアは即時反映にして、Tweenはあくまでも見せかけの演出として使うことでスコアの整合性を保ちます。 次のTweenが差し込まれても参照するscoreは既に更新されているので、次のアニメーションが再生されても値のズレは起きません。
YDK

2021/05/06 10:10

アニメーション用のスコアと実際のスコアの値を分けることで見せかける発想は 思いつきませんでした。分かりやすくて理解しやすかったです。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問