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

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

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

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

Unity3D

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

Unity

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

Q&A

解決済

2回答

6618閲覧

選択文で条件がtrueになった時、1回だけ実行されるコードの書き方が知りたいです

kosho206

総合スコア41

C#

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

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2020/06/12 00:32

UnityのPlayabeでアニメーションを再生するために下のコードを書きました。

void Update() { if (movementDif == Vector3.zero) { AnimationPlayableUtilities.PlayClip(anim, IdleClip, out playableGraph); } else { AnimationPlayableUtilities.PlayClip(anim, runClip, out playableGraph); } }

ですが、これだと条件がtrueの間はアニメーションが毎フレーム連続再生されてしまって、アニメーションが停止しているような状態に見えてしまいます。
そこで、条件がtrueになった瞬間だけ処理を実行するようなコードを書きたいのですが、どういう風に書けば良いのかがわかりません。

void Update() { bool IdleSet = false; bool runSet = false; if (movementDif == Vector3.zero) { IdleSet = true; } if (movementDif != Vector3.zero) { runSet = true; } if (IdleSet == true) { AnimationPlayableUtilities.PlayClip(anim, IdleClip, out playableGraph); IdleSet = false; } if(runSet == true) { AnimationPlayableUtilities.PlayClip(anim, runClip, out playableGraph); runSet = false; } }

このようなコードを書けば、条件がtrueになった瞬間だけ処理を実行できますが、次のフレームでまた同じく条件がtrueになれば、結局連続で実行されてしまいます。

少し調べたところ、「UniRxというライブラリを使えば関数を一回だけ実行できる」というような情報が見つかったので、見よう見まねで

void Start() { this.UpdateAsObservable() .First(x => movementDif == Vector3.zero) .Subscribe(x => AnimationPlayableUtilities.PlayClip(anim, IdleClip, out playableGraph)); this.UpdateAsObservable() .First(x => movementDif != Vector3.zero) .Subscribe(x => AnimationPlayableUtilities.PlayClip(anim, runClip, out playableGraph)); }

このようなコードを書いてみましたが、Start関数に書いているためか、アニメーションが切り替わりません。
Update関数に書くと、またさっきと同じように連続再生されてほぼ停止しているような挙動になります。

1時間ほど色々調べて自己解決を試みたのですが上手くできませんでした。
条件がtrueになった瞬間のみ処理を実行するコードの書き方を教えてください。

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

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

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

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

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

guest

回答2

0

ベストアンサー

まだC#はじめたばっかりなので見当違いなことを言ってしまってるかもしれませんがすみません…もし何かのさ参考になればと投稿させていただきます。

例えば、変数 a = 0で一番最初に定義しておいて、

if(a==0){
if (IdleSet == true)
{
AnimationPlayableUtilities.PlayClip(anim, IdleClip, out playableGraph);
IdleSet = false;
a = 1;
}

という感じに
a=0の状態じゃないとこのif文には入れないという感じにif文を重ねて、
trueで一番最初通過したときにa=1にしてもうこのif文には入れないという感じにするのはどうでしょうか?

投稿2020/06/16 04:26

mi-san

総合スコア14

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

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

0

Updateメソッドの内部で変数を作るのではなく、(提示されていませんが)その外部のクラスにフィールドなりプロパティなりを作って、Updateメソッドから抜けても内容が保存されるようにしておけばいいのでは。

投稿2020/06/12 00:52

Daregada

総合スコア11990

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問