Unityに関連する記事です

 if ステートメント(if 文)と bool 値を利用した、基礎的なロジックの構成を学習します。



ロジックを組む


 ロジックを組むとは、プログラムを作るために必要な、順序や条件などの決まりごとや仕組みを考えることです。

 プログラムは、コンピュータが理解できる命令の集まりであり、それを順番に実行することで目的の動作を実現します。
そのため、プログラムを作るときには、どのような順番で命令を実行するかや、ある条件を満たしたときにどのような命令を実行するかなどを考える必要があります。


どんなことをプログラムにさせたいのか考える


 プログラムを書くには、まず、どんなことをプログラムにさせたいのか考える必要があります。
まずどのような動作をプログラムで実現したいかを考え、それを書き出すことが大切です。
例えば、ゲームであれば、「プレイヤーを動かしたい」「敵キャラクターを生成したい」「スコアを計算したい」などの動作日本語で考えます

 そして、それぞれの動作を実現するために必要な処理を考え、それらの日本語をプログラムの命令に置き換えていきます。
その際には、プログラミング言語の文法や構文に従い、命令を書いていく必要があります

 プログラミングは、頭の中で考えている動作を実現するためにはどうするのか、明確にすることが重要であり、そのためには問題解決力や論理的思考力が必要です。
こういった解決力や思考力などは、練習や経験を積むことで、徐々にスキルを向上させることができます。


コメントを書く


 どのような動作をプログラムにさせたいのか、自分の考えを日本語として書き出します
その後、その日本語で考えた部分をプログラム内にコメントとして書き込みます。

 コメントを活用する際には、以下のようなポイントに気をつけることが重要です。

 ・コメントは、自分が理解しやすいように、簡潔かつ分かりやすく書くように心掛ける。
 ・コメントを活用することで、コードの処理内容を自分自身でも理解しやすくなるだけでなく、他の人がコードを読んだ際にも分かりやすくなる。
 ・プログラムに置き換えた後にもコメントが残るので、それを適度に活用することで、コードの可読性を高めることができる。

 以上のようなポイントを意識しながら、コメントを活用することで、考えている動作をプログラミングに置き換えやすくなります。



 キーボードのジャンプ用のボタンを押したらジャンプさせる、という機能が思いついたなら、それを日本語のコメントでプログラム内に書き込みます。


  // ジャンプ用のキーが押され「たら」


    // ジャンプする



 「〜したら」「〜の場合」「〜のとき」といった疑問形で文章がある場合には、その部分で一度区切ります。
なぜなら、このような記述は if 文を活用した分岐の処理の部分に当たるためです。

 分岐がある、ということは、次の処理は発生するか発生しないかに分かれますので、
そういう部分を1行で書いてしまうと処理が作れなくなります。


プログラムの命令に置き換える


 その後、この日本語を見て、処理を考えながらプログラムに置き換えます。

// ジャンプ用のキーが押されたら
if (Input.GetButtonDown("Jump"))
{
    // ジャンプする
    Jump();
}

 このように、日本語で書いたコメントの部分を1つずつ、コメントをプログラムの命令に置き換えていけるかを考えて、書いてみます

 処理が正常に動くか、動かないかは別にして、まずは、頭に浮かんだプログラムを書くようにします。
そうすることで徐々にコメントとプログラムの置き換えが出来るようになるためです。

 プログラムはとにかく書かなければ学習出来ません


変数の使い方


 プログラムはメソッドと変数によって出来ています。
そしてメソッドの内部は構文によって書かれ、その中では変数が利用されています。

 変数には様々なデータ型が用意されていて、ゲームを進める上で必要な情報を管理することが出来ます。

 変数を作る場合には事前に、その役割と、役割に応じた名前をつけることが重要です。
 
 下記のサンプルプログラムを使って、変数の役割を考えてみます。
役割を設定しておくことにより、プログラム内のどの部分で活用するかも見えてくるためです。


サンプルプログラム


 先ほどのボタンを押したらジャンプ(ゲームオブジェクトを上方向に移動)させるプログラムをベースに、役割を持った変数を追加したものです。
まずは全文を提示し、その後、各行ごとに説明します。


PlayerJump.cs
using UnityEngine;

public class PlayerJump : MonoBehaviour {

   bool isJumping = false
   Rigidbody rb;
   float  jumpSpeed = 100.0f;

   void Start () {
    TryGetComponent(out rb);
  }

   void Update () {
     if(Input.GetButtonDown("Jump")&& isJumping == false) {
      Jump();
    }
   }

   void Jump () {
      rb.velocity = Vector3.up * jumpSpeed;
      isJumping = true;
   }

   private void OnCollisionEnter(Collision collision) {
       if(collision.gameObject.CompareTag("Floor")) {
           isJumping = false;
       }
   }
}



 このスクリプトをアタッチしたゲームオブジェクトは、ボタンを押すことでジャンプ出来るようになります。


//  Unityのエンジンを使用するためのライブラリーをインポートしています。
using UnityEngine;

//  クラスの宣言をしています。MonoBehaviourクラスを継承することで、このスクリプトをゲームオブジェクトにアタッチできます。
public class PlayerJump : MonoBehaviour {  

// 変数の宣言です。これらの変数には明確な役割があります。
// isJumpingは、現在プレイヤーがジャンプしているかどうかを示すブール値です。
// rbは、プレイヤーの物理特性を管理するための Rigidbody コンポーネントの参照です。
// jumpSpeedは、プレイヤーがジャンプする際の速度値を示します。
bool isJumping = false;
Rigidbody rb;
float jumpSpeed = 100.0f;

// ゲームオブジェクトが最初にアクティブになったときに呼び出されるメソッドです。
// TryGetComponentメソッドを使用して、Rigidbodyコンポーネントを取得し rb 変数に代入しています。
void Start () {
  TryGetComponent(out rb);
}

// 毎フレーム呼び出されるメソッドです。
// Input.GetButtonDownメソッドを使用して、プレイヤーがジャンプボタンを押したかどうかを確認し、isJumpingがfalseである場合にJumpメソッドを呼び出します。
void Update () {
   if(Input.GetButtonDown("Jump")&& isJumping == false) { Jump();}
}

// ジャンプのためのメソッドです。
//  ゲームオブジェクトに対して上方向に物理的な力をかけます。そうすることにより、ゲーム画面ではプレイヤーがジャンプしているように見えます。
// Rigidbodyの速度(velocity)を設定(Vector3.up * jumpSpeed)して、isJumpingフラグをtrueに設定します。
void Jump () {
  rb.velocity = Vector3.up * jumpSpeed;
  isJumping = true;
}

//  プレイヤーが床に衝突した場合に呼び出されるメソッドです。
//  CompareTagメソッドを使用して、衝突したオブジェクトが「Floor」というタグを持っているかどうかを確認しています。
//  isJumpingフラグをfalseに設定して、プレイヤーが再びジャンプできるようにします。
private void OnCollisionEnter(Collision collision)
{
    if(collision.gameObject.CompareTag("Floor"))
    {
        isJumping = false;
    }
}


ジャンプについて


 プレイヤーがジャンプすることができる理由は、プレイヤーキャラクターに力が働くからです。
ジャンプ中は、プレイヤーキャラクターに上向きの力が働いているため、キャラクターは空中に浮かび上がることができます。
しかし、プレイヤーが空中にいる間に再度ジャンプしてしまうと、キャラクターはますます高く飛んでしまうため、画面外に飛び出してしまう可能性があります。
そこで、プログラムでは、プレイヤーがジャンプ中であるかどうかを判断するための変数 isJumping を使います

 これが変数の役割です。


変数の持つ役割に注目する


 isJumping 変数には、2つの値があります。

 true は、プレイヤーが「ジャンプしている状態」「地面にはついていない状態」の両方であることを表現します。
 false は、プレイヤーが「ジャンプしていない状態」「地面に着地している状態」の両方であることを表現します。

 このように、bool の値には、前もって役割を与えておきます(自分の中でどういう風に使うのかを考えておく)
そうしないと、プログラム内部での使い方のイメージがわかないためです。



 では、実際にどのように使うことで、ジャンプの制御が行われているのかを、プログラムを見ながら考えます。

 まず、isJumping の値が false でなければ、ジャンプ用のボタンを押してもジャンプを行いません。


void Update () {
   if(Input.GetButtonDown("Jump")&& isJumping == false) {  // ← ここ
    Jump();
  }
}



 プレイヤーがジャンプをすると、isJumping の値は true になります。

void Jump () {
  rb.velocity = Vector3.up * jumpSpeed;
  isJumping = true;  // ← ここ
}

 この時点で最初に出来たボタンの処理は、機能をしなくなります。
何故なら、isJumping の値が true に切り替わっているので、ボタンを押した後にある isJumping == false の部分を満たさなくなるからです。



 そして、プレイヤーが地面に着地すると、isJumping の値は false に戻ります。

private void OnCollisionEnter(Collision collision)
{
    if(collision.gameObject.CompareTag("Floor"))
    {
        isJumping = false;  // ←
    }
}

 この仕組みによって、プレイヤーが空中にいる間に再度ジャンプをしてしまうことを防ぐことができます。



 最初に説明したように、複数の構文と変数を組み合わせて仕組みを作ることをロジックを組むといいます。

 このように、プログラムの中で変数を使うことで、プレイヤーの動作を制御することができます。
変数の値によって、プレイヤーがどのような行動をするかを決定することができます。
そして、プログラムを読むことで、変数がどのように使われているかを理解することができます。


なぜ変数による制御が必要になるのか?


 isJumpingは、プレイヤーが現在ジャンプ中かどうかを示すための変数です。
初期値はfalseに設定され、プレイヤーがジャンプするとtrueに設定されます。そして、プレイヤーが地面に着地すると、再びfalseに設定されます。

 isJumping変数の使用方法は、プレイヤーがジャンプ中に再度ジャンプすることを防止するためです。
例えば、プレイヤーが空中にいる場合、制御がなければ何度でもジャンプをすることができます。

 しかし、もしジャンプ中に再度ジャンプすることができてしまうと、プレイヤーが画面外に飛び出してしまったり、想定外の場所に移動してしまう可能性があります。
そのため、isJumping変数を使用して、プレイヤーが地面に戻るまで、再度ジャンプをできなくする仕組みが実装されています



 isJumping変数の考え方を理解するためには、別の例を元に考えることもできます。

 例えば、電車が駅に到着する前にドアが閉まってしまうことを防止するために、扉が開いているかどうかを示す変数を使用することができます。
扉が開いている場合は、再度ドアを開けることができません。
同じように、プレイヤーがジャンプしている間は再度ジャンプをできなくするために、isJumping変数を使用することができます。


より具体的なロジックの説明


 このプログラムでは、プレイヤーがジャンプするときには、プレイヤーが地面にいる状態でなければなりません。
そのため、プログラムでは、ジャンプができるかどうかを判断するための条件分岐を行っています。

 if(Input.GetButtonDown("Jump") && isJumping == false) という部分が、その条件分岐に当たります。
これは、「Jump ボタンが押されたかどうかを確認し、かつ、プレイヤーがジャンプしていない状態(地面にいる状態)であるかどうかを確認する」という意味です。
よって、ジャンプしていない状態であるときに限り、ジャンプが出来るように制御を行っていることになります。



 そして、ジャンプができると判断された場合には、Jump() というメソッドが呼び出されます。
このメソッドでは、 rb.velocity = Vector3.up * jumpSpeed の処理によってプレイヤーに上向きの力を与えてジャンプさせ、
さらに isJumping の値を true に変更しています。つまり、「ジャンプしていて地面にはいない状態」にしています。



 ただし、このままにしてしまうと、ずっと「ジャンプしている状態」になってしまって、ジャンプ中以外であっても、ジャンプができない状態が続いてしまうので、
OnTriggerEnter メソッドを利用して、地面用のゲームオブジェクトに接触したら(地面に着地したら)、プレイヤーが地面に着地したと判断し、
isJumping の値を false に戻すことで、「プレイヤーが地面にいる状態」になります。



 このように、isJumping 変数を if 文と組み合わせて、適切なタイミングで値を true や false に変更することによって、
ジャンプの制御ができるような循環した仕組み、ロジックを作っています。



 プログラムを作るときには、どのような動作を実現したいかを考え、それを実現するために必要な順序や条件などを決めていくことが重要です。
そして、その決まりごとをプログラムの形で表現することで、コンピュータに理解してもらい、目的の動作を実現することができます。



 以上です。

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu



技術/知識(実装例)

2Dおはじきゲーム(発展編)

2D強制横スクロールアクション(発展編)

3Dダイビングアクション(発展編)

2Dタップシューティング(拡張編)

レースゲーム(抜粋)

2D放置ゲーム(発展編)

3Dレールガンシューティング(応用編)

3D脱出ゲーム(抜粋)

2Dリアルタイムストラテジー

2Dトップビューアドベンチャー(宴アセット使用)

3Dタップアクション(NavMeshAgent 使用)

2Dトップビューアクション(カエルの為に〜、ボコスカウォーズ風)

VideoPlayer イベント連動の実装例

VideoPlayer リスト内からムービー再生の実装例(発展)

AR 画像付きオブジェクト生成の実装例

AR リスト内から生成の実装例(発展)

private



このサイト内の作品はユニティちゃんライセンス条項の元に提供されています。

管理人/副管理人のみ編集できます