プログラミングの基本

Last-modified: Mon, 28 Nov 2022 20:06:32 JST (518d)
Top > プログラミングの基本

はじめに

プロジェクトの作成の続きです。

 

「プロジェクトの作成」では重力操作や当たり判定などの簡単な物理演算による操作を勉強しました。
しかし、さらに複雑な操作をしようと思うとプログラミングでの操作が必要になります。
そこで、このページではUnity上でのC#のプログラミングの基本を勉強します。

 

ひつじをC#で動かしてみる

C# のソースコードのファイルをコンポーネントとしてひつじにつけましょう。
AddComponent>NewScriptを押します。
「NewBehaviourScript」とあるところを「move_seep」に変えてください。
すると、プロジェクトのアセットに「move_seep.cs」というのが追加されました。
これをダブルクリックします。

 
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4.  
  5. public class MoveSheep : MonoBehaviour
  6. {
  7.     // Start is called before the first frame update
  8.     void Start()
  9.     {
  10.     }
  11.  
  12.     // Update is called once per frame
  13.     void Update()
  14.     {
  15.     }
  16. }
 

エディターが開いて、このようなファイルが出てきたと思います。
これがC#のソースコードになります。
初めて見る人には、何が何だかわからないと思います。
C#の基本的な構文に関してはここで勉強しましょう。

 

ステップ1:ひつじを移動させてみよう

 

では、ここにいろいろ書き足して、実際にひつじを動かしてみましょう。

 
  1.     void Start()
  2.     {
  3.         //ここから書いていく
  4.         Vector2 pos = this.transform.position;
  5.  
  6.         pos.x = 3;
  7.         pos.y = 4;
  8.  
  9.         this.transform.position = pos;
  10.     }
 

「void Start()」 の後に続く {} の中に上の通りに書き込んでください。

 

少し説明すると、「void Start()」は、そのオブジェクトがゲームに出現したときに一番初めに一度だけ呼び出されるメゾット(一連の命令をまとめたもの)です。
今回ひつじは、初めからゲームに出現しているので、ゲームを起動するとすぐに「void Start()」の中身の命令(後に続く {} の中の命令)が実行されます。

 

命令の中身を見ていくと、1行目は「このオブジェクトの位置を”Vector2”という型の”pos”という名前を持つ変数に代入する」というものです。Vector2とは二次元ベクトルを扱う型になります。ひつじ位置は(0,0,0)ですので"pos"には(0,0,0)が代入されたことになります。
2、3行目は「その変数のxy座標を(3,4)にする」、4行目は「このオブジェクトの位置を、新しい変数で更新する」といったものになります。つまり”pos”は(3,4,0)になり、ひつじの位置も(3,4,0)に更新されます。

 

まとめると、「ゲームが開始されてすぐに一度だけ、ひつじの位置が(0,0,0)から(3,4,0)に変わる」という命令になります。

 

実際に動かしてみましょう。
ファイルの変更を保存して、エディターを閉じ、ゲームを再生してみましょう。
ひつじは右上に移動したはずです。

 

ステップ2:少しずつ動かしてみよう

 

これだと、一瞬での移動になってしまいます。
ということで次は、少しずつ移動できるように改良してみましょう。

 
  1.     // Start is called before the first frame update
  2.     void Start()
  3.     { 
  4. //全部消す
  5.     }
  6.  
  7.     // Update is called once per frame
  8.     void Update()
  9.     { 
  10.         //ここから書いていく
  11.         Vector2 pos = this.transform.position;
  12.  
  13.         pos.x += 0.01f;
  14.         pos.y += 0.01f;
  15.  
  16.         this.transform.position = pos;
  17.     }
  18. }
 

次は、一旦「void Start()」の中身を消して、「void Update()」の中身を上のように変えてください。

 

「void Update()」はそのオブジェクトがゲームに出現してから毎フレーム呼び出されるメゾットです。
フレームとは、アニメーションのコマ割り、パラパラ漫画のようなもので、画像の切り替わりの間隔のことです。
先ほどと同様、ひつじは最初からいますので、ゲームが開始したら毎フレームで「void Update()」の中身が実行されます。
中身についてみていくと、1行目と4行目はさっきと同じですね。
変わったのは2、3行目で、「現在の変数のxy座標にそれぞれ0.01足す」というものです。
ちなみに、数値の後にある"f"は数値がfloat型(少数の型)であることを識別するためにつけています。

 

まとめると、「ゲームが開始してから毎フレームごとに、xy座標がそれぞれ0.01ずつ増えていく」となります。

 

実際動かしてみると、少しずつ右上に移動するようになるかと思います。

 

ステップ3:スピード調節をしよう

 

今は、ひつじのスピードの係数は0.01固定ですね。
次は、スピードをインスペクターから自由に調節できるように改良してみましょう。

 
  1.     //ここに書き加える
  2.     public float speed = 0.01f;
  3.  
  4.     // Start is called before the first frame update
  5.     void Start()
  6.     {
  7.     }
  8.  
  9.     // Update is called once per frame
  10.     void Update()
  11.     { 
  12.         Vector2 pos = this.transform.position;
  13.  
  14.         pos.x += speed; //0.01f -> speed
  15.         pos.y += speed; //0.01f -> speed
  16.  
  17.         this.transform.position = pos;
  18.     }
  19. }
 

「void Start()」の上と、「void Update()」の中身をこのように変えます。

 

3行目では、float型(小数を扱う型)として"speed"という名前の変数を定義します。
変数は、データを保存しておく入れ物のようなものです。
今回は予め0.01fを初期値として入れておきます。
ところで、前にある"public"は、そこで定義した変数の値をUnityEditerのインスペクターから変更できるようにするため合言葉のようなものです。
覚えておいてください。

 

14,15行目では、数値を変数に置き換えています。
こうすることで、これまでは0.01で固定だったものがspeedに入れる数値を変えることで変えられるようになりました。

 

実際にひつじのインスペクターからspeedの数値を変えて、ゲームを開始してみましょう。
ひつじのスピードは変わったでしょうか。

 

ステップ4:キー入力で操作できるようにしよう

 

今のままでは、ずっと同じ方向に行くばかりです。
そこで、次はひつじをキー入力で操作できるようにします。

 
  1.     // Update is called once per frame
  2.     void Update()
  3.     { 
  4.         Vector2 pos = this.transform.position;
  5.  
  6.         //pos.x += speed; -> 消す
  7.         //pos.y += speed; -> 消す
  8.  
  9.         //ここから追加
  10.         if (Input.GetKey (KeyCode.D)) 
  11.         {
  12.             pos.x += speed;
  13.         }
  14.  
  15.         if (Input.GetKey (KeyCode.A))
  16.         {
  17.             pos.x -= speed;
  18.         }
  19.  
  20.         this.transform.position = pos;
  21.     }
  22. }