スクラッチからUnityへ変換
第5回目はスクラッチブロックの「制御」偏です。
制御グループには、プログラミングのアルゴリズムを形成する「条件分岐」「繰り返し」などが含まれます。
スクラッチのクローンは、Unityでは「Prefab(プレハブ)」と呼ばれる機能が担います。
〇秒待つ
時間をこのトロールする方法はいくつかありますが、次の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回繰り返す処理は「for文」を使うことで実現することが出来ます。
for(int i = 0 ; i < 10 ; i++) //10回繰り返す
{
//繰り返す内容を内部に記載
}
例文
以下の処理を10回繰り返す
右回りに36度回す
0.1秒待つ
for文の処理はとても速いので、一瞬で完了します。スクラッチの様に繰り返し回数ごとの動きを作りたい場合はコルーチンなどで待ち時間を指定します。
IEnumerator TurnRight()
{
for(int i = 0; i < 10; i++)
{
transform.Rotate(0, 0, 36);
yield return new WaitForSeconds(0.1f);
}
}
ずっと
ずっとのプログラムはイベント関数の 「Update関数」、または「FixedUpdate関数」 になります。
Update メソッド
Update関数内では1秒間に200回前後の処理が行われますが、その回数はパソコンのスペックやその時の環境によって変わってきます。
void Update() //カッコ内の処理を繰り返す
{
//ここに繰り返し発動すさせる内容を記載
}
どのような環境でも1フレームに要する時間を同じにするには、Application.targetFrameRate という関数を使って1秒間に処理する回数を指定します。
void Start()
{
Application.targetFrameRate = 50; //1秒間に50回転するように指定
}
FixedUpdate メソッド
一方FixedUpdate関数では1フレームに要する時間を指定することが出来ます。初期値は0.02秒なので、1秒間に50回の処理が行われます。
攻撃や敵の動きなど、あらゆる環境で同じ速さで動かしたい場合などに利用します。
void FixedUpdate() //カッコ内の処理をFixed Timestanp秒で繰り返す
{
//ここに繰り返し発動すさせる内容を記載
}
もし~なら
条件分岐は「if文」で作成します。
if( //ここに条件式 )
{
//条件が 真 の時の処理
}
例文
もし「Wキー」が押されたら、
y座標を10ずつ変える
if (Input.GetKey(KeyCode.W))
{
transform.position += new Vector3( 0 , 10.0f , 0);
}
もし~なら~ではなければ
「もし~なら、そうでなければ~」この2つの条件に振り分けるには「if~else文」を使用します。
if( //ここに条件式 )
{
//条件が 真 の時の処理
}
else
{
//条件が 偽 の時の処理
}
例文
もしx座標が0より大きければ
0度に向ける(右に向ける)
そうでなければ
180度に向ける(左に向ける)
if (transform.position.x > 0)
{
transform.rotation = Quaternion.Euler(-transform.right);
}
else
{
transform.rotation = Quaternion.Euler(-transform.right);
}
~まで待つ
「~まで待つ」は、コルーチンと繰り返し処理の「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()); //任意の場所でコルーチンを発動
すべてを止める
これは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 にする
止めるスクリプトの最初に、Bool型変数を条件とし、return を実行
if ( // bool値 ) return; // bool値が true なら後続処理をスキップ
//これ以降に条件文、または bool値が true のときに止めたい処理を記載
クローンされたとき
Unityでは、自分自身をクローンとして生成(インスタンス)することが出来ます。
自分自身のインスタンスを、本体との挙動と分けたて運用したい時は、作成時にインスタンスに本体と見分けができる「タグ」などをつけておくと良いでしょう。(タグのつけ方は次の「自分自身のクローンを作る」でご紹介します)
さらにスクリプトファイル等の条件分岐で「もしタグが○○なら~」などと分けることで、「クローンされたとき」に対応する動きを実現することが出来ます。
Cloneタグが付いている場合とついていない場合で動きを分ける
if (gameObject.tag == "Clone") //もし「クローン」タグが付いていれば
{
transform.Rotate(0, 0, 15); //左回りに回転
}
else
{
transform.Rotate(0, 0, -15); //右回りに回転
}
また、オブジェクトを Prefab(プレハブ)と呼ばれる特殊なオブジェクトに変換し、それをクローンとして生成(インスタンス)することも出来ます。
プレハブにはスクリプトファイルを持たせることが出来ますが、そこに書いたプログラムが独立して起動します。つまりそのプログラム自体が「クローンされたとき」に該当します。
自分自身のクローンを作る
クローンは Instantiate メソッドを使用して作成します。
Instantiate メソッドは引数が1つの場合は「何を」生成するのかを指定します。
引数が1つのケース
Instantiate("生成するプレハブ");
引数が3つの場合は、引数は順番に「何を」「どこに」「向きは」になります。
引数が3つのケース
Instantiate("生成するプレハブ", 生成する場所 , インスタンスの向き);
自分自身のインスタンスを生成する場合
例:(何を)自分自身のインスタンスを、(どこに)自分自身の座標に、(向きは)自分自身と同じ向きに生成し、生成されたインスタンスに「Clone」タグをセット
Instantiate(gameObject, //自分自身を
transform.position, //自分自身の場所に
transform.rotation).tag = "Clone"; //自分の向きで生成、Clonetagを付与
※タグの付与は必須ではありません。付与すると本体と別々の動きを作ることが出来ます。
プレハブのインスタンスを生成する場合
事前にプレハブを用意し、Inspectorから作成した変数へAssign。
[SerializeField] GameObject picoPrefab;
任意の場所でインスタンスを生成
Instantiate(picoPrefab, //変数:picoPrefab を
Vector3.zero, //座標:(0:0:0) の場所に
Quaternion.identity); //プレハブ素材がもともと持つ向きで生成
このクローンを削除する
クローンを削除するには、Destroy メソッドを使用します。
Destroy ( gameObject ) ; //指定したオブジェクトを削除
なお、Destroyメソッドは第2引数として、削除までの時間を指定することが出来ます。
Destroy ( gameObject , 2.0f) ; //指定したオブジェクトを2秒後に削除
ファイブボックスでは、スクラッチはもう卒業、という方向けにUnityの個別指導のオンラインレッスンを行っています。
ご興味のある方は当サイト、オンラインレッスンから、無料体験授業へお問い合わせ下さい。
Comments