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

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

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

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

Unity

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

Q&A

解決済

2回答

5196閲覧

C#でオブジェクトをなめらかに回転させたいです

yuki384

総合スコア14

C#

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

Unity

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

0グッド

1クリップ

投稿2017/11/10 05:52

UnityでC#で書いています。
オブジェクトをクリックしたときに-90°なめらかに回転させたいのですが、
すぐ回転してしまいます…どうしたらよいのでしょうか?

C#

1 private float leftRotation; 2 3 void Start () { 4 5 } 6 void Update () 7 { 8 if (Input.GetMouseButtonDown(0)) 9 { 10 leftRotation = 0f; 11 int i; 12 for(i=0; 18>i; i++){ 13 if(leftRotation == 90){ 14 break; 15 } 16 leftRotation += 5f; 17 transform.eulerAngles += new Vector3(0f, 0f, -5f); 18 19 } 20 21 } 22 }

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

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

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

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

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

guest

回答2

0

ベストアンサー

やりがちなミスですが、書かれているスクリプトは1フレーム内で処理が完了してしまいます。
つまり、せっかくループ処理で少しずつ回転処理を書いているにもかかわらず、その処理が1フレーム内で終わってしまいます。

画面に出力されるのは1フレーム単位なので、次のフレームでは5 * 18 = 90が実行されたあと、つまり90°回転した状態が表示されるので、見た目にはアニメーションしていないように見えるのです。

なので、1フレームに5°ずつというように処理を書かないとなりません。
提示されたコードから拡張すると以下のような感じでしょうか。
(ただ、色々と考慮しないとならないことを省略してるので、あくまで一例です。例えば連打された際に意図した挙動になりません。コルーチンなどを利用するほうがいいかと思います)

cs

1void Update () 2{ 3 if (Input.GetMouseButtonDown(0)) 4 { 5 _loopCount = 0; 6 _isAnimating = true; 7 } 8 9 if (_isAnimating) 10 { 11 Animation(); 12 } 13} 14 15void Animation() 16{ 17 Vector3 eulerAngle = new Vector3(0f, 0f, -5f); 18 transform.Rotate(eulerAngle); 19 20 _loopCount++; 21 22 if (_loopCount == 18) 23 { 24 _isAnimating = false; 25 } 26}

投稿2017/11/10 06:26

edo_m18

総合スコア2283

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

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

yuki384

2017/11/10 06:39

ありがとうございます!試行錯誤してみます!
yuki384

2017/11/13 01:58 編集

public class ashika : MonoBehaviour { private int _loopCount; private int _lorate; private bool _isAnimating; public bool IsAnimating { get { return _isAnimating; } set { _isAnimating = value; } } void Start () { _lorate = 0; } void Update() { if (Input.GetMouseButtonDown(0) && transform.localEulerAngles.z % 90 == 0) { _loopCount = 0; _isAnimating = true; _lorate++; } if (_isAnimating) { Animation(); } } void Animation() { Vector3 eulerAngle = new Vector3(0f, 0f, -5.0f); transform.Rotate(eulerAngle); _loopCount++; if (_loopCount == 18) { _isAnimating = false; } } } 1回目、2回目のクリックではうごくのですが、180°になったあと動きません… どう直したらよいのでしょうか?
edo_m18

2017/11/13 02:07

transform.localEulerAngles.zの値を確認しているのはなぜでしょう? おそらくですが、値のチェックがうまく行ってないのではないかと思います。 float型の値は誤差が必ず出るので、おそらく`==0`が失敗している気がします。 そもそも角度を5°ずつ進めて、それをカウントしているので現在の角度は確認しなくても大丈夫な気がしますが、いかがでしょうか?
yuki384

2017/11/13 02:09

連打時の処理を作ろうとしてこうなりました。
edo_m18

2017/11/13 02:10

なるほど。その場合は、そもそも「アニメーション中ならマウスクリックを無視」とすればいいと思いますが、いかがですか?
yuki384

2017/11/13 02:13

なるほど!意図した動作になりました! ありがとうございます。
edo_m18

2017/11/13 02:15

よかったです。 ちなみに、↑でも書きましたが、float型のチェックは知らないとハマるので気をつけてくださいね。
yuki384

2017/11/13 02:16

次回使う際は気をつけます。 全く知らなかったのでありがとうございます。
guest

0

1フレームで終わっているのでそう見えてしまっています。
時間かフレームを管理しつつ少しずつ回せばよいかと思います。

投稿2017/11/10 06:29

hien

総合スコア69

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

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

yuki384

2017/11/10 06:40

ありがとうございます!工夫してみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問