🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

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

Unity

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

Q&A

解決済

2回答

3434閲覧

【Unity】変数が一定の値になったときにある処理を行うコードを書きたい

shukrin

総合スコア14

C#

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

Unity

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

0グッド

0クリップ

投稿2019/12/19 15:31

前提

Unityを勉強中なのですが困ったことがあり質問させていただきました。ある変数が一定の値になったときにある処理を行うコードを書こうとしているところです。自分で考えたものは Update() 内で条件判定を行う以下のコードのようなものですが、この場合変数の変化はそう頻繁に起こるものでもないのに毎フレーム判定が行われて非効率なように思います。さらに言うと変数が一定値の間はずっと毎フレームごとにif文の中身が実行されるので、やはりあまり良くない手法のような気がします。

#ソースコード

lang

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class TestClass : MonoBehaviour 6{ 7 public int a; 8 9 Update() 10 { 11 if(a == 1){ 12 処理内容 13 } 14 } 15}

#教えていただきたいこと
教えていただきたいことは2つあります。
1:変数の変化を監視するもっとスマートな方法
2:変数に変化があったときに一度だけ処理を行う方法

以上2点について教えていただけると幸いです。

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

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

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

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

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

guest

回答2

0

全体としてどのような設計をしているのか分からないので一概には言えませんが、Observerパターンが使えそうです。
これは変数側で値が代入されたときに値の変更を関係各所に通知するような手法で、C#であればeventを使用して実装すると良いかと思います。
実際ただの変数への代入に処理を付随させることはできないので、プロパティにするなり値の登録メソッドを用意するなりする必要があります。

参考:
http://blog.shos.info/archives/2012/12/csharp_observerpattern2.html

投稿2019/12/19 21:21

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

YAmaGNZ

2019/12/19 22:11 編集

少し勘違いをしていたので、コメント削除させていただきます。
shukrin

2019/12/22 14:00

ご回答ありがとうございます。今回はプロパティを使おうと思います。
退会済みユーザー

退会済みユーザー

2019/12/22 14:17 編集

本当に限定的な状況で設計上余りよろしくないのを理解した上で敢えてならプロパティでも良いと思いますが、今理解しやすく簡単にできるからという理由なら絶対にお勧めできません(取っつきやすいからやっちゃいそうだなーと思ってました) 理由は、その値を使った判定が増えたときに、その記述を全部プロパティ内に書く羽目になり、いろんな物が密にくっついて将来的に所謂スパゲッティコードになってしまうからです。 他のクラスで参照する可能性のあるpublicなプロパティでは基本やめた方がよいと忠告しておきます。 将来に渡って値の更新タイミングに他のクラスで何か処理させるようなことが絶対にないと断言できるならまぁといったところでしょうか... 取っつきやすいのは分かりますけどね。
guest

0

ベストアンサー

監視するべきは値が変化したときだと思うので、プロパティとかでチェックさせちゃうとかどうでしょう。

下記サンプルはマウスクリックしていくとaの値が増えていき、5になったときにデバッグログが吐かれます。

cs

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class Test : MonoBehaviour { 6 7 private int a; 8 public int A { 9 private set { 10 a = value; 11 if (a == 5) { Debug.Log("A is 5!"); } 12 } 13 get { return a; } 14 } 15 16 private void Update() { 17 if (Input.GetMouseButtonDown(0)) { 18 A++; 19 } 20 } 21} 22

投稿2019/12/20 01:08

hogefugapiyo

総合スコア3302

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

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

shukrin

2019/12/22 13:58

ご回答ありがとうございます。プロパティをそのように使うことは思いつきませんでした。今回はプロパティを使って実装しようと思います。
hogefugapiyo

2019/12/23 00:31

NotionalKettle さんの回答でも補足がありますが、必ずしもこのやり方が正というわけではないのであとは自身のプログラムの設計と相談してみて色々と機能を変更してみてくださいね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問