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

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

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

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

Unity3D

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

Unity

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

Q&A

3回答

14233閲覧

Unity C# で使われる「var」についての「違い・使いどころ」など詳しく理解したいです!

nissei

総合スコア35

C#

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

Unity3D

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

Unity

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

1グッド

0クリップ

投稿2017/11/23 11:19

キャラのを動かす為「PlayerMove」のスプリプトにて、まずはこの様なコードを書いてみました!
パターンA

  //変数宣言 [SerializeField] private float speed = 15f; private Vector3 moveD = Vector3.zero; if (Input.GetKey(KeyCode.W)) moveD.z += 1f; if (Input.GetKey(KeyCode.S)) moveD.z -= 1f; if (Input.GetKey(KeyCode.D)) moveD.x += 1f; if (Input.GetKey(KeyCode.A)) moveD.x -= 1f; moveD = moveD.normalized; transform.position += moveD * Time.deltaTime * speed;

これだとキャラは動くのですが、一度キーを押してしまうと摩擦が無いかの如く、その方向に滑るようににしてずっと動てしまいします。

次に自分なりに試行錯誤して「var」と言うのを知りコードを改良してみました。
パターンB

var vac = Vector3.zero; if (Input.GetKey(KeyCode.W)) vac.z += 1f; if (Input.GetKey(KeyCode.S)) vac.z -= 1f; if (Input.GetKey(KeyCode.D)) vac.x += 1f; if (Input.GetKey(KeyCode.A)) vac.x -= 1f; vac = vac.normalized; transform.position += vac * Time.deltaTime * speed;

パターンBだと押している間だけキャラは進み、ボタンを離すとピタっと止まります!
この「var」という性能と効果をよく理解出来ません。
今後、「Vector3」を使ったキャラ移動のコードは全て「var」を使った方がいいのでしょうか?

どなたかこの「var」について解説と、上記の2種類のコードの根本的な違いを教えて頂きたいです!
宜しくお願いします。

退会済みユーザー👍を押しています

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

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

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

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

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

guest

回答3

0

varについては、コンパイル時に型が決まるだけで全く一緒です。

挙動の違いについては、提示されたコード片のインデントの違いやprivateキーワードから推測するに
単に初期化する場所が違うように見えます

投稿2017/11/23 11:59

asm

総合スコア15147

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

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

0

おそらくポイントはvarかどうかではなく、フィールドなのかメソッドのローカル変数なのかの違いにあると思います。Unityで物体の振る舞いを制御するのはBehaviorだと思いますが

C#

1public class MyBehaviour : MonoMyBehaviour { 2 private Vector3 field = ...; // (1)ここに書くのがフィールド 3 4 void Update() { 5 Vector3 local1 = ...; // (2)ここに書くのがローカル変数 6 var local2 = ...; // (3)右辺の型が自明なら型名を省略してvarと書ける 7 } 8}

(2),(3)ともにローカル変数であり、varかどうかは型名を省略するかどうかの違いでしかありません。

(1)はフィールドでこのMyBehaviourがアタッチされている期間中ずっと存在しつづけます。Updateが呼ばれたとき、前回呼び出されたときの値が(1)には残ります。対して(2),(3)はUpdateが呼ばれる度に新たに生成し、計算の中間結果として使いますがUpdateからリターンすると消えてなくなります。

つまり生存期間が違う変数なのです。ご質問の振る舞いの違いはここにあると思います。

投稿2017/11/23 11:56

KSwordOfHaste

総合スコア18392

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

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

0

C#における var は、コンパイル時に型の評価が行われます。
var キーワードに関しては、MSDNのコーディング規約に以下のような記述があります。

C#コーディング規約

変数の型が割り当ての右側から明らかである場合、または厳密な型が重要でない場合は、ローカル変数の暗黙の型指定を使用します。

C#

1string name = "hoge";

C#

1var name = "hoge";

型推論がを行うので、コンパイルはややvarを使った方が遅くなるはずですが、
実行されるコードには違いはありません。
なので

パターンBだと押している間だけキャラは進み、ボタンを離すとピタっと止まります!

何かの勘違いでしょう。コードが一部しか書かれていないので細かいことは分かりませんが、

var は、コンパイル時に型の評価が行われる

という知識を覚えておいてください。

投稿2017/11/23 11:47

mtdsnsk

総合スコア789

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

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

nissei

2017/11/26 05:31

お返事ありがとうございます。 パターンBに関しては勘違いではありません。 コードも一部ではなく、アップデート内に書かれている全文です。 他に関数や変数宣言、スタート内には何も書かれていません。 まだ初心者ゆえに、「 var は、コンパイル時に型の評価が行われる」部分の理解が難しいですが、今後の参考としておぼえておきます。
mtdsnsk

2017/11/28 03:08

実行されるコードに違いはないので、varを使ったことと今回発生した現象は関係ありません。 なので、他の部分が影響しているはずです。varが関係しているというのは明らかに勘違いされています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問