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

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

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

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Unity

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

Q&A

3回答

1489閲覧

Update関数の中で何度も同じ値を代入することは、負荷がかかりますか?

obasuteyama-

総合スコア43

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Unity

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

0グッド

0クリップ

投稿2021/08/31 10:02

編集2021/09/01 04:44

素朴な疑問で申し訳ないです。
例えば…

C#

1void Update() 2{ 3 var o = GameObject.Find("player"); 4}

などとして、探して代入して、探して代入して、…となって負荷が寄りかかっていそうだと思ってしまいます。
これは実際にこのようにしていて、負荷が増えていますか?

他にも…

C#

1var oScript = o.GetComponent<OScript>(); 2oScript.number = 3;

などの、初めに他のスクリプトの変数を変更するために必要なものなどもUpdate関数で繰り返し呼び出していいのか教えてもらいたいです。

よろしくお願いします。

追記 9/1 hogefugapiyoさんへ

今したいと思っていることは、複製したプレハブで別のオブジェクトの変数をいじることです。
今、インベントリシステム的なのを作っていて、クリックしたら自分のオブジェクトを複製、
そのオブジェクトをとりあえずプレハブと呼びまして、
オリジナルオブジェクトがプレハブの切り替え用bool型変数をいじって区別をします。
そこでプレハブ用オブジェクトから他オブジェクトの変数をいじろうとするのですが、
もちろんその時にStartで参照をしたらよいのですが、それをもしそうしたら、オリジナルオブジェクトの方でも参照してしまい、
できるだけ無駄を省きたいし、負荷が寄りかかりそうなので、Update関数上でプレハブの区別用bool型がtrueのときの参照しようとしています。
長くて申し訳ありません。いきさつはこんな感じです。

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

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

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

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

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

YAmaGNZ

2021/08/31 22:19

それがずっと変わらないのであれば、Updateで代入する必要はないでしょう。 変わるのであれば、しかるべきタイミングで代入すればいいだけです。
guest

回答3

0

探して代入して、探して代入して、…となって負荷が寄りかかっていそうだと思ってしまいます。

負荷=処理時間がかかる、という意味であれば、その通りです。
基本的には最初にStart()で取得して変数に格納し、それをUpdate()で使うのが一般的です。

どの程度、時間がかかるかは、私は知らないので、自分で計測してみてください。

投稿2021/08/31 13:06

fiveHundred

総合スコア10152

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

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

obasuteyama-

2021/08/31 13:20

そうですか、そうですよね、 最後の悪あがきなのですが、 自作の関数などで、boolがtrueになったら値を代入しなおす… のようなことをしようとしています。 何かいい方法などはありませんかね?
fiveHundred

2021/09/01 01:16 編集

毎フレーム探すことになる、というのが問題なので、そうでないのであれば、Update()に書いても特に問題ないと思います。
fiveHundred

2021/09/01 02:06 編集

とはいえ、1度取得すれば済むのであれば、同じオブジェクトを毎回取得するのは無駄になるので、もしそうであれば避けたほうがいいです。 変更されるのがオブジェクト内の変数だけであれば、そのオブジェクトを1度取得すれば済みます。
guest

0

ひたすら同じものを使うのであれば
最初に1回取得すればそれを使い回せばスッキリというのがソースコードを見る限りの感想です。

FindGetComponentとかはなるべくUpdateではやらずに
Startとかで一回やってそれを使うみたいなのがよくあるお作法の話ではありますが
ぶっちゃけ動けばそれが正義なので、従わなくても動けば良いです。

毎回Updateなりで取りたい理由があるのであれば
その理由を書いていただけると他の方も答えやすいかもしれません。

例えば、ソースコードだけじゃなく「こういう機能を作りたいと思っています」みたいなビジョンも共有いただけると、みなさんから別の切り口の回答を引き出すことができるかもしれません?

投稿2021/09/01 02:09

hogefugapiyo

総合スコア3302

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

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

obasuteyama-

2021/09/01 04:45

ただいま追記でいきさつを書かせていただきました。 読んでいただけると幸いです。
guest

0

あなたの言う負荷というのがどういうことなのかってのがイマイチわかりませんが、コードを書いている以上、呼び出されるたびに実行されますね。

投稿2021/08/31 12:24

y_waiwai

総合スコア88042

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

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

obasuteyama-

2021/08/31 12:50

その呼び出されるたび実行されるものにデメリット(?)やほかの処理に悪影響などを与えたりはしませんか? もしそのようなものがないのであれば、見やすくなったりや、負荷のことを考えてしまったりがなくなるので、気持ちが軽くなるのですが…
y_waiwai

2021/08/31 13:07

提示のようにブツをさがすだけ、ってなら悪影響はないかと思います まあ、処理内容によりけりになりますが 最初に一回だけ実行して出しとく、ってことができるならいいんですが、クラス変数にするとかってなるとちと大事になるから考えもんですねえ
fana

2021/09/01 02:15

> GameObject.Find("player"); みたいなのは,何らかの集合から条件に見合うやつを探してくるのでしょうから,その処理負荷は集合のサイズに大きく依存するだろうと想像できますね. (「5個の中から探してこい」と「100億個の中から探してこい」とでは処理時間にかなりの差が生じるだろう) 負荷のことを度外視してOKなのか否か?ってのは,そこらへんのことをどう見積もるかに依存するんじゃないですかね.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問