スクラッチからUnityへ変換「制御編」イメージ画像

スクラッチ Unity変換表「制御」

制御グループには、プログラミングのアルゴリズムを形成する「条件分岐」「繰り返し」などが含まれます。

スクラッチのクローンは、Unityでは「Prefab(プレハブ)」と呼ばれる機能が担います。


スクラッチブロック 〇秒待つ

〇秒待つ

時間をこのトロールする方法はいくつかありますが、次の2つの方法をご紹介します。

  1. コルーチンを使用
  2. Time.deltaTime を使用

他にも Invokeメソッド、SendMessageメソッド、Destroyメソッドなど引数に待ち時間を指定する関数を活用して作ることもできます。

コルーチンを活用

コルーチンは非同期的な処理を管理するための特別な関数です。通常の関数とは異なり、一時停止したり再開したりでき、時間のかかるタスクやアニメーションの制御、経過時間に応じたイベントを発動したりするときに使用されます。

関数の型に IEnumerator (アイ・イニューマレーター)を指定し、関数内で yield return で待ち時間を指定します。

IEnumerator Wait1()                         //コルーチン関数を宣言 
{ 
   yield return new WaitForSeconds(1.0f);   //1秒待つ 
   Debug.Log("1秒後に発動"); 
   //指定した時間経過後の処理を記載 
}

作成した関数はStartCoroutine関数で呼び出します。

StartCoroutine(Wait1());     //コルーチン関数の呼び出し

Time.deltaTImeを活用

Time.deltaTime はUpdate関数など繰り返し発動するイベント関数の1フレーム間の時間です。この時間を任意の変数に加算していくことで、特定のポイントからの時間を計測することが出来ます。

float currentTime;                  //時間を計測するための変数 

void Update() 
{
    currentTime += Time.deltaTime;  //変数に時間を加算 
    if (currentTime > 1.0f)         //変数が1秒を越えたら 
    { 
         Debug.Log("1秒後に発動");   //条件分岐内でイベントを発動 
         currentTime = 0f;          //時間をリセット 
    } 
}

スクラッチブロック 10回繰り返す

〇回繰り返す

10回繰り返す処理は「for文」を使うことで実現することが出来ます。

for(int i = 0 ; i < 10 ; i++)    //10回繰り返す
{
     //繰り返す内容を内部に記載 
}
  • 例文
スクラッチブロック 10回繰り返す(36度まわす)

以下の処理を10回繰り返す
 右回りに36度回す
 0.1秒待つ


for文の処理はとても速いので、一瞬で完了します。スクラッチの様に繰り返し回数ごとの動きを作りたい場合はコルーチンなどで待ち時間を指定します。

IEnumerator TurnRight()                      //コルーチン型関数の宣言
{
    for(int i = 0; i < 10; i++)          //10回繰り返す
    { 
        transform.Rotate(0, 0, 36);              //36度回す
        yield return new WaitForSeconds(0.1f);   //0.1秒待つ
    } 
}

スクラッチブロック ずっと

ずっと

ずっとのプログラムはイベント関数の 「Update関数」、または「FixedUpdate関数」 になります。

Update メソッド

Update関数内では1秒間に100回から250回前後の処理が行われますが、その回数はパソコンのスペックやその時の環境によって変わってきます。

void Update() //カッコ内の処理を繰り返す 
{
    //ここに繰り返し発動すさせる内容を記載 
}

どのような環境でも1フレームに要する時間を同じにするには、Application.targetFrameRate という関数を使って1秒間に処理する回数を指定します。

void Start() 
{  
    //1秒間に50回転するように指定 
    Application.targetFrameRate = 50;
}

FixedUpdate メソッド

Unity FixedTimestanpの設定

一方FixedUpdate関数では1フレームに要する時間を指定することが出来ます。初期値は0.02秒なので、1秒間に50回の処理が行われます。

攻撃や敵の動きなど、あらゆる環境で同じ速さで動かしたい場合などに利用します。

void FixedUpdate()   //カッコ内の処理をFixed Timestanp秒で繰り返す
{
     //ここに繰り返し発動すさせる内容を記載 
}

スクラッチブロック もし~なら

もし~なら

条件分岐は「if文」で作成します。

if( //ここに条件式 ) 
{
    //条件が 真 の時の処理 
}
  • 例文
スクラッチブロック もしWキーが押されたらy座標を10ずつ変える

もし「Wキー」が押されたら、
 y座標を10ずつ変える

if (Input.GetKey(KeyCode.W))      //もし wキーが押されていたら
{
     transform.position += new Vector3( 0 , 10.0f , 0);  // y座標を10ずつ変える
}

スクラッチブロック もし~なら、でなければ

もし~なら~ではなければ

「もし~なら、そうでなければ~」この2つの条件に振り分けるには「if~else文」を使用します。

if( //ここに条件式 )
{
    //条件が 真 の時の処理 
} else {
    //条件が 偽 の時の処理 
}
  • 例文
スクラッチブロック x座標が0より大きいなら、そうでなければ

もしx座標が0より大きければ
 0度に向ける(右に向ける)
そうでなければ
 180度に向ける(左に向ける)

 

if (transform.position.x > 0)    //もしx座標が0より大きければ
{
     transform.rotation = Quaternion.Euler(-transform.right);   //0度に向ける
} else { 
    transform.rotation = Quaternion.Euler(-transform.right);    //180度に向ける
}

スクラッチブロック ~まで待つ

~まで待つ

「~まで待つ」は、コルーチンと繰り返し処理の「while文」を組み合わせることで実現できます。

IEnumerator WaitTrue()                //コルーチン型関数の宣言
{
    while( //条件文 )                 //条件が true であれば以下の処理を繰り返す 
    {
        yield return null;           //1フレームスキップ 
    }
     //ここに待った後(条件文が false になった後)の処理を記載 
}

StartCoroutine(WaitTrue());         //任意の場所でコルーチンを発動
  • 例文
スクラッチブロック マウスが押されたまで待つ

マウスが左クリックされるまで待つ
  Catに「Messeage1」を送る

 

コルーチン型の関数の作成と呼び出し

IEnumerator MouseClickedMesseage()           //コルーチン型関数の宣言
{
    while (!Input.GetMouseButtonDown(0))     //左クリックされるまで繰り返し 
    {
         yield return null;                  //1フレームスキップ 
    }
    //Catをを探して、付与されているスクリプトの Messeage1 関数を発動 
    GameObject.Find("Cat").SendMessage("Messeage1"); 
} 

StartCoroutine(MouseClickedMesseage());    //任意の場所でコルーチンの呼び出し 

※メッセージを送る(SendMessage)はイベント編をご参照ください


スクラッチブロック ~まで繰り返す

~まで繰り返す

「~まで待つ」は、繰り返し処理の「while文」を使って実現します。

スクラッチのブロックでは条件に入れる内容は「false の状態から true になるまで」繰り返しますが、while文では「true の状態から false になるまで」繰り返すという反対の内容になるので注意が必要です。

while( //条件文 )     //条件が ture のうちは繰り返す 
{
    //ここに繰り返し発動する処理を記載 
}
  • 例文
スクラッチブロック マウスが押されたまで繰り返す

x座標が10より大きくなるまで繰り返す
  x座標を0.1ずつ変える

一瞬で終わっても良い処理であれば、Update関数や Start関数などで発動すればよいのですが、スクラッチの様に動きを作るにはコルーチンなどで待機時間を設けます。

IEnumerator WhilePosX()                    //コルーチン型関数 
{
    while (transform.position.x<10)       //x座標が10より小さければ繰り返す 
    {                                        //(スクラッチと逆になります)
        transform.Translate(0.1f, 0, 0);     //x座標を0.1移動する 
        yield return null;                   //1フレームスキップ 
    } 
} 

StartCoroutine(WhilePosX());                 //任意の場所でコルーチンを発動

「~」を止める

スクラッチ止めるブロックには3つの種類があり、それぞれ別々の働きをします。

  1. 「すべて」を止める ⇒ ゲーム自体を停止、全てのスプライト、スクリプトを停止
  2. 「このスクリプト」を止める ⇒ このブロックが含まれるスクリプトを停止
  3. 「スプライトの他のスクリプト」を止める ⇒ このプログラムが含まれるスプライトの他のスクリプトを停止

Unityではスプライトを「オブジェクト」と呼び、スクリプトは「クラス」などと呼ばれることもあります。


スクラッチブロック すべてを止める

すべてを止める

これはUnityのエディターモードで進行中のゲームを止めるのか、ビルドされたゲームを止めるのかでプログラムが違ってきます。

エディタモードで止める

エディタモードの作品とは、Unityエディタで開発中の作品のことです。

EditorApplication クラスの IPlaying プロパティがゲーム稼働中かそうでないかを管理しています。 IPlaying プロパティを false にすることでゲームが停止します。

if (EditorApplication.isPlaying)             //もしゲーム稼働中なら 
{
    EditorApplication.isPlaying = false;     //ゲームを停止する 
}

ビルドした作品を止める

ビルドされた作品を止めるには Applicationクラスの Quit メソッドを使用します。

Application.Quit();     //アプリケーションを止める

スクラッチブロック このスクリプトを止める

このスクリプトを止める

任意のスクリプトを止めるには return を使用します。

return を使うと、後続する処理をおこなわずスキップします。

if ( //条件文 or bool値 ) return;    //()内がtrue なら後続処理をスキップ 
//これ以降に条件文、またはbool値が true の時に止めたい処理を記載
  • 例文
スクラッチブロック もしマウスが押されたらこのスクリプトを止める

ずっと以下の処理を繰り返す
 もしマウスが左クリックされたら
  このスクリプトを止める
 右回りに15度回す

bool isStop = false;     //スクリプト停止判定のフラグを宣言

 void Update() //繰り返し文 
{
    if ( isStop ) return;              //もし isStop がtrue なら以下の処理をスキップ 
    if(Input.GetMouseButtonDown(0))    //マウスが左クリックされたら 
    { 
        isStop = true;                 //変数:isStop を true にする
    } 
    transform.Rotate(0, 0, -15);       //右回りに15度ずつ回す 
}

※左クリックをする処理は、この場所でなくても問題ありません。


スクラッチブロック スプライトの他のスクリプトを止める

スプライトの他のスクリプトを止める

上で説明した「このスクリプトを止める」同じ方法をとります。違いは「このスプライト」に当たる部分は停止させない関数でbool型変数の true、false を管理します。一方「他のスクリプト」に当たる部分が停止対象の関数で、return を含んだ後続のスキップ処理を記述します。

  • 止めたくないスクリプト上で Bool型の変数、または関数をコントロール、止める場合はtrue にする
bool値 = true
  • 止めるスクリプトの最初に、Bool型変数、または関数を条件とし、return を実行
if ( // bool値 ) return;     // bool値が true なら後続処理をスキップ 
//これ以降に条件文、または bool値が true のときに止めたい処理を記載

スクラッチブロック クローンされたとき

クローンされたとき

Unityでは、自分自身をクローンとして生成(インスタンス)することが出来ます。

自分自身のインスタンスを、本体との挙動と分けたて運用したい時は、作成時にインスタンスに本体と見分けができる「タグ」などをつけておくと良いでしょう。(タグのつけ方は次の「自分自身のクローンを作る」でご紹介します)

Unity タグのセット

さらにスクリプトファイル等の条件分岐で「もしタグが○○なら~」などと分けることで、「クローンされたとき」に対応する動きを実現することが出来ます。

Cloneタグが付いている場合とついていない場合で動きを分ける

if (gameObject.tag == "Clone")    //もし「クローン」タグが付いていれば 
{
     transform.Rotate(0, 0, 15);  //左回りに回転 
} else { 
    transform.Rotate(0, 0, -15);  //右回りに回転 
}

また、オブジェクトを Prefab(プレハブ)と呼ばれる特殊なオブジェクトに変換し、それをクローンとして生成(インスタンス)することも出来ます。

プレハブにはスクリプトファイルを持たせることが出来ますが、そこに書いたプログラムが独立して起動します。つまりそのプログラム自体が「クローンされたとき」に該当します。


「~」のクローンを作る

スクラッチではクローンを作る際、自分自身や、他のスプライトを指定することが出来ます。Unityでも同様にクラスを持ったオブジェクトのインスタンスや、指定したオブジェクトのプレハブを生成することが出来ます。


スクラッチブロック 自分自身のクローンをつくる

自分自身」のクローンを作る

クローンは Instantiate() メソッドを使用して作成します。

Instantiate()メソッドは、引数が1つの場合は「何を」生成するのかを指定します。

  • 引数が1つのケース
Instantiate("生成するプレハブ");

引数が3つの場合は、引数は順番に「何を」「どこに」「向きは」になります。

  • 引数が3つのケース
Instantiate("生成するプレハブ", 生成する場所 , インスタンスの向き);

自分自身のインスタンスを生成する場合

例:(何を)自分自身のインスタンスを、(どこに)自分自身の座標に、(向きは)自分自身と同じ向きに生成し、生成されたインスタンスに「Clone」タグをセット

Instantiate(gameObject            //自分自身を 
            , transform.position  //自分自身の場所に
            , transform.rotation  //自分の向きで生成、
           ).tag = "Clone";       //Clonetagを付与

※タグの付与は必須ではありません。付与すると本体と別々の動きを作ることが出来ます。


スクラッチブロック 他のプレハブのクローンを作る

「他のプレハブ」のクローンを作る

他のオブジェクトを生成するには事前にプレハブを用意し、Inspectorから作成した変数へAssign。

[SerializeField] GameObject picoPrefab;   //生成するプレハブを変数化
Unity プレハブのAssign

任意の場所でインスタンスを生成

Instantiate(picoPrefab,            //変数:picoPrefab を
            Vector3.zero,          //座標:(0:0:0) の場所に
            Quaternion.identity);  //プレハブ素材がもともと持つ向きで生成

スクラッチブロック このクローンを削除する

このクローンを削除する

クローンを削除するには、Destroy() メソッドを使用します。

Destroy ( gameObject ) ;     //指定したオブジェクトを削除

なお、Destroy()メソッドは第2引数として、削除までの時間を指定することが出来ます。

Destroy ( gameObject , 2.0f) ;     //指定したオブジェクトを2秒後に削除

ファイブボックスでは、スクラッチはもう卒業、という方向けにUnityの個別指導のオンラインレッスンを行っています。

ご興味のある方は当サイト、オンラインレッスンから、無料体験授業へお問い合わせ下さい。

無料体験授業 いつでも受け付けています!

体験授業を受ける子供

スクラッチ、Unityでちょっとしたゲームを作ってみる

HTMLやCSSでWebサイト作成体験

初めてパソコンやタブレットに触れてみる

エクセルやワード、パワーポイントの学習をちょっと体験

まずは1時間程度の無料体験授業を受けて、教室の雰囲気や講師の人柄に触れて頂き、ご自身、お子様に合うのかどうかご確認ください!