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

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

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

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

Unity

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

Q&A

解決済

2回答

3028閲覧

MoveRotationを使用し数秒後に回転を停止させたい

soranin

総合スコア13

C#

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

Unity

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

0グッド

0クリップ

投稿2020/05/21 00:22

前提・実現したいこと

MoveRotationを使い円盤を回転させ
5秒後に回転を開始させる(コルーチン)事は成功したのですが
何秒後に回転を止めるという事が出来ず立ち止まってます

下記にスクリプトコピペしてます
※回転と5秒後に開始のスクリプトのみの表記になってます

該当のソースコード

public class NewBehaviourScript01 : MonoBehaviour
{
Rigidbody m_Rigidbody;
Vector3 m_EulerAngleVelocity;
// Start is called before the first frame update
void Start()
{
StartCoroutine("Eu");
}
void FixedUpdate()
{
Quaternion deltaRotation = Quaternion.Euler(m_EulerAngleVelocity * Time.deltaTime);
m_Rigidbody.MoveRotation(m_Rigidbody.rotation * deltaRotation);
}
private IEnumerator Eu()
{
yield return new WaitForSeconds(5);
m_EulerAngleVelocity = new Vector3(0, 0, 1000);
m_Rigidbody = GetComponent<Rigidbody>();
}
}

試したこと

https://xr-hub.com/archives/20368のサイトを参考にしましたが
実行されず、、

もう一つStopCoroutineを組み合わせてたのもあり試しましたが反応はありませんでした。
https://docs.unity3d.com/ja/2018.4/ScriptReference/MonoBehaviour.StopCoroutine.html

そもそもコルーチンで回転を止める事は可能なのか?
ヒントを頂けると助かります。

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

unity 2019 イメージ説明と Visual 2019

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

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

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

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

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

guest

回答2

0

「回転を止める」ということであれば、m_EulerAngleVelocityの値を"0(new Vector3(0,0,0))"にするか、FixedUpdateメソッド内の回転処理を呼ばれなくするかのどちらかになります。
※回転停止に関してはコルーチンは関係ないと思います。

回転停止方法はいくつかありますが、数秒後に停止するサンプルは以下になると思います。
※”Invoke”を利用すると、数秒後にメソッドを実行させることができます。
(以下サンプルだと、10秒後に回転停止します)

C#

1 // Start is called before the first frame update 2 void Start() 3 { 4 StartCoroutine("Eu"); 5 6 // 10秒後に回転停止 7 Invoke("StopRotation", 10f); // 追加 8 } 9 10 // 回転停止メソッド追加 11 private void StopRotation() { 12 // 回転度を"0"に初期化 13 m_EulerAngleVelocity = new Vector3(); 14 }

投稿2020/05/21 01:02

tsuki01

総合スコア1751

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

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

tsuki01

2020/05/21 01:05

先に回答ついてました。失礼いたしました。 この回答はスルーして頂いて大丈夫です。
soranin

2020/05/21 01:09

tsuki01さんありがとうございます サンプルを見るとInvokeとコルーチンを一緒に使用されてますが 特に問題は無いのでしょうか??
tsuki01

2020/05/21 01:16

一緒に利用しても特に問題はありません。 ただ、Invokeメソッドの秒数を、コルーチンの秒数より早く設定しちゃうと意味がなくなってしまうのでご注意ください。
soranin

2020/05/21 01:24

実際にtsuki01さんのサンプルを参考にした場合 hogefugapiyoさんに教えて頂いた回答とは別の文になるのでしょうか? 別の回答になれば そちらの方も勉強しておきたいと考えてます
tsuki01

2020/05/21 01:37

「m_EulerAngleVelocity = new Vector3(0, 0, 0);」で回転停止させる文は変わらないです。 (自分のは「= new Vector3();」となってますが結果は同じです) なので、あとは好みとか使いやすさに応じて、InvokeやCoroutinを使い分ける様にしたら良いのではないでしょうか。 今回に関しては hogefugapiyo様の回答の方が、質問者様のソースに近いので一番シンプルかと思います。
soranin

2020/05/21 01:40

ありがとうございます 今は一瞬で0にしてますが 徐々に0にする場合は別の構文が必要になるのでしょうか? 今は教えていただいたのを1秒間隔に回転を下げるようにしましたが 莫大な数の行数になりました
soranin

2020/05/21 01:43

今の質問をベストアンサーにして 投稿し直したほうがよろしいでしょうか 回答続きも失礼になるので 自分ちゃんとも調べるようにします
tsuki01

2020/05/21 01:47

そうですね。今の処理だとピタっ!と止まるので、止める処理は別の書き方になると思います。 はい、別の質問として投稿頂けると、回答欄に記載できるので助かります。 (他の方の目にもついて、早く回答頂けるかもしれませんし) よろしくお願いいたします。
soranin

2020/05/21 01:50

承知しました 別に再投稿しようとおもいます
tsuki01

2020/05/21 01:53

すみません。ベストアンサー間違えているようです。 hogefugapiyo様の方をベストアンサーになくて大丈夫でしょうか。
soranin

2020/05/21 01:53

間違えてベストアンサーにしてしまいました
tsuki01

2020/05/21 01:53

承知しました。変更お願いいたします。
guest

0

ベストアンサー

この書き方にするなら単純にEulerAngleVelocityが0になれば回転しなくて済むんじゃないでしょうか?
いただいたコードをそのまま使うと、とりあえずこんな書き方でも止まるのかなと思いますが。どうでしょうか

cs

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class NewBehaviourScript01 : MonoBehaviour { 6 7 Rigidbody m_Rigidbody; 8 Vector3 m_EulerAngleVelocity = Vector3.zero; 9 10 void Start() { 11 m_Rigidbody = GetComponent<Rigidbody>(); 12 13 StartCoroutine("Eu"); 14 } 15 16 void FixedUpdate() { 17 Quaternion deltaRotation = Quaternion.Euler(m_EulerAngleVelocity * Time.deltaTime); 18 m_Rigidbody.MoveRotation(m_Rigidbody.rotation * deltaRotation); 19 } 20 21 private IEnumerator Eu() { 22 yield return new WaitForSeconds(5); 23 m_EulerAngleVelocity = new Vector3(0, 0, 1000); 24 yield return new WaitForSeconds(5); 25 m_EulerAngleVelocity = new Vector3(0, 0, 0); 26 } 27 28} 29 30

追記

徐々に止めるっていうことは、n秒かけて変更していく形になるので変更する度合いを時間で割合を計算して代入していってあげると目的の動きになるかと思います。

ちなみにStartCoroutine(ChangeAngle(new Vector3(0, 0, 1000), 5f)); とか書けば、5秒かけて回転が加速していくかと思います。

cs

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class NewBehaviourScript01 : MonoBehaviour { 6 7 8 Rigidbody m_Rigidbody; 9 Vector3 m_EulerAngleVelocity = Vector3.zero; 10 11 float stopDuration = 1; 12 13 void Start() { 14 m_Rigidbody = GetComponent<Rigidbody>(); 15 StartCoroutine("Eu"); 16 17 } 18 19 void FixedUpdate() { 20 Quaternion deltaRotation = Quaternion.Euler(m_EulerAngleVelocity * Time.deltaTime); 21 m_Rigidbody.MoveRotation(m_Rigidbody.rotation * deltaRotation); 22 } 23 24 private IEnumerator Eu() { 25 yield return new WaitForSeconds(5); 26 m_EulerAngleVelocity = new Vector3(0, 0, 1000); 27 28 // 5秒かけて回転速度を0にする 29 StartCoroutine(ChangeAngle(new Vector3(0, 0, 0), 5f)); 30 } 31 32 private IEnumerator ChangeAngle(Vector3 endAngle, float duration) { 33 34 // 現在の回転速度を取得 35 var nowAngleVel = m_EulerAngleVelocity; 36 37 // スタート時間を取得 38 float startTime = Time.time; 39 40 // 終了時間を求める 41 float endTime = startTime + duration; 42 43 do { 44 // 効果時間に対する現在の割合を求める 45 float timeRate = (Time.time - startTime) / duration; 46 47 // 回転速度を更新 48 var vel = (endAngle - nowAngleVel) * timeRate + nowAngleVel; 49 50 // 回転速度の反映 51 m_EulerAngleVelocity = vel; 52 53 // 1フレーム待機 54 yield return null; 55 56 } while (Time.time < endTime); // 現在のタイムが終了時間に達するまでループ 57 58 // 最終的な回転速度を代入して終了 59 m_EulerAngleVelocity = endAngle; 60 61 } 62 63}

投稿2020/05/21 00:54

編集2020/05/21 02:04
hogefugapiyo

総合スコア3302

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

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

soranin

2020/05/21 01:19

hogefugapiyoさんありがとうございます 無事に止まることが出来ました 今一瞬で止まるようにしてますが これを徐々に0に近づけるとなると 別の文になるのでしょうか? 調べるとAddForce()と書かれていましたが・・ ※本来のご質問は解決しましたのでhogefugapiyoさんをベストアンサーにします
soranin

2020/05/21 01:55

間違えて違う方にベストアンサーしてしまいました すみません。 どうしましょうか。。
hogefugapiyo

2020/05/21 02:00

徐々に回転をとめるならこんな感じでどうでしょうか。回答に追記します
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問