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

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

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

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

Unity

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

Q&A

解決済

2回答

1981閲覧

Unityの.thisの使い方に関する疑問など

kenken1130

総合スコア15

C#

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

Unity

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

0グッド

0クリップ

投稿2018/10/25 18:20

Unityの制作本に沿ってやっていたところ、少し疑問だったので質問させていただきます。
画面を押してから離すまでの距離の長さに応じて車が動くという簡単なゲームのスクリプトを書いているのですが

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class CarController : MonoBehaviour { 6 float speed = 0; 7 Vector2 startPos; 8 9 10 // Use this for initialization 11 void Start () { 12 13 } 14 15 // Update is called once per frame 16 void Update () { 17 if (Input.GetMouseButtonDown(0)) 18 { 19 //マウスをクリックした座標 20 this.startPos = Input.mousePosition; 21 } 22 else if(Input.GetMouseButtonUp(0)){ 23 //マウスを離した座標 24 Vector2 endPos = Input.mousePosition; 25 float swipeLength = (endPos.x - this.startPos.x); 26 27 //スワイプの長さを初速度に変換 28 this.speed = swipeLength / 500.0f; 29 } 30 31 transform.Translate(this.speed, 0, 0); 32 this.speed *= 0.98f; 33 34 } 35} 36

上記が正しいコードとのことなのですが
次のように表記しては何故ダメなのでしょうか

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class CarController : MonoBehaviour { 6 float speed = 0; 7 8 9 // Use this for initialization 10 void Start () { 11 12 } 13 14 // Update is called once per frame 15 void Update () { 16 if (Input.GetMouseButtonDown(0)) 17 { 18 //マウスをクリックした座標 19 Vector2 startPos = Input.mousePosition; 20 } 21 else if(Input.GetMouseButtonUp(0)){ 22 //マウスを離した座標 23 Vector2 endPos = Input.mousePosition; 24 float swipeLength = (this.endPos.x - this.startPos.x); 25 26 //スワイプの長さを初速度に変換 27 this.speed = swipeLength / 500.0f; 28 } 29 30 31 32 transform.Translate(this.speed, 0, 0); 33 this.speed *= 0.98f; 34 35 } 36} 37

疑問点としては
・Vector2 startPos;は最初に表記しているのにendPosは何故宣言しないのか。

・float swipeLength = (endPos.x - this.startPos.x);
の部分でendPosにthis.をつけないのはなぜか。

・後者のコードのように書くとなぜエラーになるのか

初心者のため情報に不足があったり、的外れな質問でしたら申し訳ないです。
よろしくお願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

Vector2 startPos;は最初に表記しているのにendPosは何故宣言しないのか。

必要がないからです。
y_waiwaiさんがおっしゃる変数のスコープが前提なんですが、それをUnityで考えると、startPosが次のフレームでわからなくならないようにするためです。
マウスボタンを押し下げたそのフレームでのマウスの位置を開始位置として、スワイプが終わるフレームまで保持しておく必要があります。
反対にマウスを離した瞬間には計算が実行できるので、覚えておく必要がないです。
ライフサイクルの長い変数は少なくするように書くのが普通ですが、上のコードでstartPosの直後にendPosを宣言しておくことは可能です。

float swipeLength = (endPos.x - this.startPos.x);

の部分でendPosにthis.をつけないのはなぜか。

thisにないからです。
thisはCarControllerクラスのインスタンスを指しますが、上のコードではクラスの直下、関数の外、には、startPosしかなくendPosはありません。逆にstartPosの直後で宣言しておけばthisをつけることは可能です。

後者のコードのように書くとなぜエラーになるのか

thisにないからです。
startPosの直後で宣言しておけばエラーにならずにすみます。ただそうすると今度はVector2 endPos = Input.mousePosition;でエラーになると思いますが。

投稿2018/10/26 00:01

papinianus

総合スコア12705

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

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

kenken1130

2018/10/28 08:43

ご回答ありがようございます。変数のスコープの知識が甘かったのですが、理解できたかと思います。 丁寧な説明で非常にわかりやすかったです。
guest

0

Vector2 startPos = Input.mousePosition;

関数内で定義した変数は、関数内だけでしか有効になりません。
この関数を抜けると、startPos 変数は消滅します

this というキーワードは、自クラスを表します
this.startPos
という記述は、自クラスに定義されているstartPos変数、を表します

・後者のコードのように書くとなぜエラーになるのか

float swipeLength = (this.endPos.x - this.startPos.x);

後者のクラスには、endPos、startPos が定義されてないからですね

投稿2018/10/25 22:19

y_waiwai

総合スコア87749

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

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

kenken1130

2018/10/28 08:41

ご回答ありがとうございます。理解できました。 変数のスコープに関する理解が甘かったようです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問