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

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

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

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

Unity

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

Q&A

解決済

1回答

3808閲覧

[Unity] アニメーションで再生から指定した時間逆再生し、その後再生するという処理をスクリプトで書きたい

.com

総合スコア8

C#

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

Unity

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

0グッド

0クリップ

投稿2021/04/10 16:25

前提・実現したいこと

Unityで入力したらアニメーションが指定した時間まで逆再生し、その指定した時間まで逆再生が完了したら再生を逆再生が完了した位置からまた始まるという処理をしたいです。

処理例:制限時間10秒の時9,8,7,6.....とカウントダウンしていく(このカウントダウンアニメーションはできている)、この時に残り時間2秒でボタンを押したら、押した2秒から3,4,5,6,7,8と逆再生する。そして8秒からまた通常の再生が始まる。
例:(制限時間(10秒) - 押したときの時間(2秒) = 逆再生の終わる時間(8秒))

現在、ボタンを押して逆再生はできている。指定した時間(秒数)で逆再生から再生に変えるという処理ができていない。

発生している問題・エラーメッセージ

入力によって逆再生、再生、一時停止(これはいらない)をできるようにはしました。そこから指定した時間まで逆再生という所が上手くいきません。

エラーメッセージ:なし

該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class CountController : MonoBehaviour 6{ 7 // Animatorを入れる変数 8 private Animator animator; 9 private float BackTime = 0.0f; // 戻る時間 10 private float NowTime = 10.0f; // 今の時間 11 private float n = 10.0f; // ループ用変数 12 public float time = 10.0f; // 全体の時間 13 14 private float i = 2.0f; 15 16 void Start() 17 { 18 // カウントのAnimatorにアクセスする 19 animator = GetComponent<Animator>(); 20 Play(); 21 } 22 23 void FixedUpdate() 24 { 25 // ボタンを押す前までの時間を保持 26 NowTime -= Time.deltaTime; 27 28 //if (NowTime >= 3.0f) 29 //{ 30 // Play(); 31 //} 32 33 //if (NowTime >= 7.0f) 34 //{ 35 // Reverse(); 36 // NowTime = 0.0f; 37 //} 38 39 if (Input.GetKeyDown("joystick button 0")) 40 { 41 ReversePlay(); 42 } 43 } 44 45 // 再生 46 public void Play() 47 { 48 animator.SetFloat(Animator.StringToHash("countdown"), 1); 49 } 50 51 // 一時停止 52 public void Pause() 53 { 54 animator.SetFloat(Animator.StringToHash("countdown"), 0); 55 } 56 57 // 逆再生 58 public void Reverse() 59 { 60 animator.SetFloat(Animator.StringToHash("countdown"), -1); 61 } 62 63 // 変数を入れる 64 public void PutFunction() 65 { 66 BackTime = NowTime; 67 } 68 69 70 // カウントダウンが指定秒数だけカウントアップし、またカウントダウンする 71 public void ReversePlay() 72 { 73 // 今の時間が5秒未満なら指定秒数だけカウントアップ 74 if (NowTime < 5.0f) 75 { 76 // 押した時間の保持 77 PutFunction(); 78 // ループ用変数を再初期化する(2回目やった時バグらないように) 79 n = 10.0f; 80 81 // 戻る秒数を減らしていって、戻る秒数が1以上なら逆再生。0になったら再生する 82 for (n = 10; n > BackTime; n -= Time.deltaTime) 83 { 84 if (n == BackTime) 85 { 86 break; 87 } 88 // ループ中は逆再生 89 Reverse(); 90 } 91 // 今の時間を測る関数に今の時間を渡す 92 NowTime = Time - BackTime; 93 // ループを抜けたら再生 94 Play(); 95 } 96 } 97 98} 99

試したこと

・コメントアウトしてある部分でちゃんと時間は測れて、逆再生、再生を繰り返しているかの確認。(これはちゃんとできていました)

・逆再生の方法を↓に変えてみる(変わりませんでした)

C#

1Animator animator = GetComponent<Animator> (); 2animator.speed = -1;

・フローチャート(↓)を書いて流れを確認しながらコードを書く。(~~できませんでした。~~書き方が下手なんでしょうね)

◎ボタンが押されたか
〇今の制限時間は5秒未満か
・押したときの時間を保持(例:2秒)
*制限時間 - 押したときの時間(例・10 - 2 = 8 →8秒までループ) の時間だけループ
・ループ中はずっと逆再生

・ループを抜けたら再生

補足情報(FW/ツールのバージョンなど)

Unityのバージョン:Unity2020.2.0b2

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

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

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

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

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

guest

回答1

0

自己解決

アニメーションの経過時間を持ってくるみたいな便利なものはUnityには(読み取り専用しか)無かったのでリストを使ってパラパラ漫画みたいにするようにしました。下がソースコードです。10秒だけで少ないのと確実に疑似アニメーションするようにcaseでは全パターン書いています。
でも、せっかく作ったアニメーションを何とか動かしたいので方法を模索中です。時間もないのでひとまずこれで進めます。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using System; 5 6public class CountList : MonoBehaviour 7{ 8 // リストに入れるためのPrefab 9 public GameObject one; 10 public GameObject two; 11 public GameObject three; 12 public GameObject four; 13 public GameObject five; 14 public GameObject six; 15 public GameObject seven; 16 public GameObject eight; 17 public GameObject nine; 18 public GameObject ten; 19 public GameObject TimeUp; 20 21 float time = 0.0f; 22 int i = 0; 23 24 // カウントダウンの遷移用 25 float state; 26 27 // Prefabを入れるリスト 28 public List<GameObject> ObjectList = new List<GameObject>(); 29 30 void Start() 31 { 32 // CreateObjectを呼び出し、その後は1秒毎に実行 33 InvokeRepeating(nameof(CreateObject), 0.0f, 1.0f); 34 // Timerを呼び出し、その後は1秒毎に実行 35 InvokeRepeating(nameof(Timer), 0.0f, 1.0f); 36 StartCount(); 37 } 38 39 void FixedUpdate() 40 { 41 42 } 43 44 void Update() 45 { 46 //if (Input.GetKey("joystick button 0")) 47 if(Input.GetKeyDown(KeyCode.K)) 48 { 49 ListCase(); 50 } 51 } 52 53 // 時間を測る 54 void Timer() 55 { 56 state += 1; 57 } 58 59 // 最初の10秒からスタートするリスト 60 void StartCount() 61 { 62 ObjectList.Add(ten); 63 ObjectList.Add(nine); 64 ObjectList.Add(eight); 65 ObjectList.Add(seven); 66 ObjectList.Add(six); 67 ObjectList.Add(five); 68 ObjectList.Add(four); 69 ObjectList.Add(three); 70 ObjectList.Add(two); 71 ObjectList.Add(one); 72 ObjectList.Add(TimeUp); 73 } 74 75 void CreateObject() 76 { 77 GameObject ListObjects = GameObject.Instantiate(ObjectList[i]) as GameObject; 78 ListObjects.transform.position = transform.position; 79 ListObjects.transform.rotation = Quaternion.identity; 80 i++; 81 } 82 83 void ListCase() 84 { 85 switch (state) 86 { 87 // 1~4はカウントアップしてやると何か変だから相談。 88 // カウントダウンしてそこまでその間時間停止とかでも良きだとも思う 89 // 1秒経って押したとき 90 //case 1: 91 // i = 0; 92 // state = 9; 93 // ObjectList.Clear(); 94 // ObjectList.Add(one); 95 // ObjectList.Add(TimeUp); 96 // break; 97 //// 2秒経って押したとき 98 //case 2: 99 // i = 0; 100 // state = 8; 101 // ObjectList.Clear(); 102 // ObjectList.Add(two); 103 // ObjectList.Add(one); 104 // ObjectList.Add(TimeUp); 105 // break; 106 //// 3秒経って押したとき 107 //case 3: 108 // i = 0; 109 // state = 7; 110 // ObjectList.Clear(); 111 // ObjectList.Add(three); 112 // ObjectList.Add(two); 113 // ObjectList.Add(one); 114 // ObjectList.Add(TimeUp); 115 // break; 116 //// 4秒経って押したとき 117 //case 4: 118 // i = 0; 119 // state = 6; 120 // ObjectList.Clear(); 121 // ObjectList.Add(four); 122 // ObjectList.Add(three); 123 // ObjectList.Add(two); 124 // ObjectList.Add(one); 125 // ObjectList.Add(TimeUp); 126 // break; 127 // 5秒経って押したとき 128 case 5: 129 i = 0; 130 state = 4; 131 ObjectList.Clear(); 132 ObjectList.Add(five); 133 ObjectList.Add(four); 134 ObjectList.Add(three); 135 ObjectList.Add(two); 136 ObjectList.Add(one); 137 ObjectList.Add(TimeUp); 138 break; 139 // 6秒経って押したとき 140 case 6: 141 i = 0; 142 state = 2; 143 ObjectList.Clear(); 144 ObjectList.Add(five); 145 ObjectList.Add(six); 146 ObjectList.Add(five); 147 ObjectList.Add(four); 148 ObjectList.Add(three); 149 ObjectList.Add(two); 150 ObjectList.Add(one); 151 ObjectList.Add(TimeUp); 152 break; 153 // 7秒経って押したとき 154 case 7: 155 i = 0; 156 state = -1; 157 ObjectList.Clear(); 158 ObjectList.Add(four); 159 ObjectList.Add(five); 160 ObjectList.Add(six); 161 ObjectList.Add(seven); 162 ObjectList.Add(six); 163 ObjectList.Add(five); 164 ObjectList.Add(four); 165 ObjectList.Add(three); 166 ObjectList.Add(two); 167 ObjectList.Add(one); 168 ObjectList.Add(TimeUp); 169 break; 170 // 8秒経って押したとき 171 case 8: 172 i = 0; 173 state = -4; 174 ObjectList.Clear(); 175 ObjectList.Add(three); 176 ObjectList.Add(four); 177 ObjectList.Add(five); 178 ObjectList.Add(six); 179 ObjectList.Add(seven); 180 ObjectList.Add(eight); 181 ObjectList.Add(seven); 182 ObjectList.Add(six); 183 ObjectList.Add(five); 184 ObjectList.Add(four); 185 ObjectList.Add(three); 186 ObjectList.Add(two); 187 ObjectList.Add(one); 188 ObjectList.Add(TimeUp); 189 break; 190 // 9秒経って押したとき 191 case 9: 192 i = 0; 193 state = -7; 194 ObjectList.Clear(); 195 ObjectList.Add(two); 196 ObjectList.Add(three); 197 ObjectList.Add(four); 198 ObjectList.Add(five); 199 ObjectList.Add(six); 200 ObjectList.Add(seven); 201 ObjectList.Add(eight); 202 ObjectList.Add(nine); 203 ObjectList.Add(eight); 204 ObjectList.Add(seven); 205 ObjectList.Add(six); 206 ObjectList.Add(five); 207 ObjectList.Add(four); 208 ObjectList.Add(three); 209 ObjectList.Add(two); 210 ObjectList.Add(one); 211 ObjectList.Add(TimeUp); 212 break; 213 // 10秒経って押したとき(これは基本的に無い) 214 case 10: 215 i = 0; 216 state = 10; 217 ObjectList.Clear(); 218 break; 219 220 default: 221 break; 222 } 223 } 224}

投稿2021/04/20 06:40

.com

総合スコア8

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問