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

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

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

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

Q&A

解決済

1回答

2533閲覧

素早くダブルクリックするとアニメーションが2度再生されてしまいます

agu

総合スコア41

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

1グッド

0クリップ

投稿2016/01/06 13:18

オブジェクトがクリックされた際に、そのオブジェクトがアニメーションで回転するというスクリプトを書いています。
回転中はクリックを受け付けないようにしているのですが、
素早くダブルクリックをすると、回転が終了すると1回転してしまいます。

下記のようなスクリプトで実装しているのですが、発生原因がつかめず困っています。
お手数をおかけしますがどなたかご助言いただけないでしょうか。

■クリック検知しているスクリプト
function Update () {
if(Input.GetMouseButtonDown(0)){
var hit : RaycastHit;
var ray : Ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if(Physics.Raycast(ray,hit,100)){
if(hit.collider.tag == "Object"){
if(!nowRotate){
nowRotate = true;
hit.transform.gameObject.SendMessage("Rotate");
}
}
}
}
}

■変数
nowRotate:回転中のフラグです。このフラグをtrueにして回転中に回転させないようにしています。falseにするタイミングは回転が終了したタイミングで、Animationから呼んだ別の関数で行っています。

■関数
Rotate:対象オブジェクトのAnimatorパラメータを変更しています。このパラメータがtrueになると回転するようにしています。

kobaya_c👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

ソースには問題ないように思えます。
フラグ管理されているので、

C#

1function Update () 2{ 3 if(!nowRotate) 4 { 5 nowRotate = true; 6 targetGameObject.SendMessage("Rotate"); 7 } 8}

だけでアニメーション側のみのテストを行い、
nowRotateがfalseになるタイミングの挙動チェックをしてはどうでしょうか?

投稿2016/01/06 13:48

buibui80

総合スコア1033

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

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

agu

2016/01/06 21:24 編集

ご助言ありがとうございます!結論としてご助言いただいたバグ調査の方法がヒントとなり、行いたい挙動がとれるようになりました! 上記のように自動で回転し続けるようにし、nowRotateをfalseにする関数中にログを出すようにしてみました。 ついでにUpdate中にfalseになっていたらログを出すようにしてみたのですが、やはりfalseになるタイミングは回転が終了した時となっているようでした。 そこで、いったん再度クリックで回転するようにし、実際にダブルクリックをしてみると、 Updateの方で表示するログはダブルクリックすると一瞬で2回表示され、 その時、falseにする関数で表示してるログは1回しか呼ばれませんでした。 つまり、1度目の回転ではfalseにしている関数が呼ばれていないという事でした。 そこについて確認してみた所、最初に記載させて頂いた記述から省いていた部分があったのですが、そこが問題だったということがわかりました。 回転の回数をカウントしており、アニメーションを始めた瞬間にカウントを+1し、アニメーションが終了する際にカウントを-1して0に戻し、カウントが0になっていたらnowRotateをfalseにするという流れとしておりました。 これがダブルクリックすることによりカウントを追加する関数が2回呼ばれ、カウントが2となり、本来0になるタイミングで-1してもこの場合はカウントが2から1減算されるため0にならず、falseとならないということでした。 ためしに、記載させて頂いたソース中のif(nowRotate){の次に、このカウントが0になっていたらフラグを立てて回転するようにしてみた所、うまく挙動するようになりました。 記載外の部分が原因というしようのないオチですみません。。 今回はUpdateで常に監視し続けるというバグの調査方法を知れたので、これから役立てていきたいと思います。 ただ、nowRotateをtrueにしているはずなのにif文をスルーしてしまうという現象は起きているということになります。おそらくフラグがtrueになる前にもう一度処理が呼ばれているということになるのでしょうが、これはフラグがtrueになるのが遅いということなのでしょうか?
buibui80

2016/01/07 01:40

Updateはフレーム単位で呼ばれ、1つのフレームにかかる時間は一定ではありません。 Update内で Time.deltaTime をログ出力すると、 「前フレームから今フレームまでの差分時間(秒単位)」がわかります。 入力の受付はUpdate内で行っているので差分時間単位での入力受付となる為、 入力発生と回転処理完了のタイミングによっては意図しない動作になる可能性があるかもしれません。
agu

2016/01/12 19:16

返答が遅くなってしまい申し訳ありません。 なるほど。Updateの更新と実際に回転する処理とのタイミングかもということですね。回転を実際に付けつけているタイミング等、少し調査してみます! ご回答いただきありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問