スクラッチからUnityへ変換
4回目の今回は「イベント」グループの変換です。
イベントに関するブロックには「ハットブロック」と呼ばれる、一番最初に動くプログラムが多くあります。しかも「〇〇キーが押されたとき」などのブロックは、プログラムが起動していなくても反応します。 Unityではこのような機能は存在しませんので、他のイベント関数内で発動する条件分岐文としてご紹介します。
旗が押されたとき
旗が押されたときにに該当するプログラムはなく、Unityエディタ上で上部のStartボタン(▶ボタン)、または [ Cntrolキー ] + [ P キー ] でプレイされます。
Playを止めるときも同様のボタン、ショートカットキーになります。
「スペースキー」が押されたとき
イベント関数内の条件分岐(if文等)で作成します。
キーが押されている間、信号が送り続ける場合
if (Input.GetKey(KeyCode.Space)) //もしスペースキーが押されていたら
キーを押したとき、一度だけ信号を送るとき
if (Input.GetKeyDown(KeyCode.Space)) //もしスペースキーが押されたら
キーを離した(上げた)時、一度だけ信号を送るとき
if (Input.GetKeyUp(KeyCode.Space)) //もしスペースキーが離されたら
このスプライトが押されたとき
事前にクリック対象のオブジェクトにColliderコンポーネントが付いていることを確認します。
// マウスの左ボタンがクリックされたかどうかをチェック
if (Input.GetMouseButtonDown(0))
{
// マウスの位置からRayを発射
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
//発射したRayが他のオブジェクトと衝突したかどうかをチェック
if (Physics.Raycast(ray, out RaycastHit hit))
{
// クリックされたオブジェクトが自分自身であるかを確認
if (hit.collider.gameObject == gameObject)
{
// クリックされた際のイベントをここに記述
Debug.Log("オブジェクトがクリックされた");
}
}
}
背景が「背景1」になったとき
背景を必要とするのは2Dのケースがほとんどかと思いますので、2Dを前提で説明します。
下の図を参考に、事前に UI の Panel を使って背景を準備します。
通常UIは最前面に配置されるので、Canvas の Render Mode を Screen Space-Camera にし、RenderCamera に MainCamera を指定、SortingLayer を使って最背面に表示させましょう。
まずはUIを使うので、NameSpace で UI を使う宣言をします。
using UnityEngine.UI;
Panel の Imageコンポーネント にアクセスするための変数と、複数の背景画像を管理する配列を宣言します。
public Sprite[] bgSprites; //画像を管理する配列
public Image image; //パネルの Imageコンポーネント
インスペクターから 配列:bgSprites に変更したい複数の画像を、変数:Image に用意した Panel をそれぞれAssignします。
背景の名前は、ImageコンポーネントのSpriteプロパティの name が管理しています。条件分岐文の中で文字列として比較します。
if (image.sprite.name == "Space") //例:背景が「Space」になった
{
// 指定の背景になった時のイベントをここに記述
Debug.Log("背景が〇〇になった");
}
※Update関数など繰り返し発生する部分に記載すると、毎回情報が上がってしまうので、配置場所には注意が必要です。
音量が10より大きいとき
音量は AudioSource コンポーネントが管理しています。
事前に対象のオブジェクトに Inspector から AudioSource コンポーネントを追加します。
条件分岐文の中で、AudioSourceコンポーネントにアクセスし、Volumeプロパティの値を参照、内部に該当のイベントを記載します。
if (GetComponent<AudioSource>().volume > 0.5)
{
// 音量が指定の値を越えたときのイベントをここに記載
Debug.Log("音量が0.5より大きくなった");
}
タイマーが10より大きいとき
開始直後からの時間を計測する場合
Unity では既存の Timeクラスが時間を管理しています。Time.time を使うとスタートボタンを押してからの経過時間を取得することが出来ます。
if (Time.time > 10) //スタートボタンを押してから10秒経過したら
{
// 開始から10秒経過したときのイベントをここに記載
Debug.Log("ゲーム開始から10秒経過");
}
任意の時間軸から時間を計測する場合
特定の時間からの経過時間を計測するには、Update関数などの繰り返し呼び出されるイベント関数内で、Time.deltaTime を使って任意の変数に時間を加算していきます。
float currentTime; //時間を計測するための変数を宣言
変数は任意の場所でリセット、リセットされた時間から経過時間を計ります。
currentTime = 0; //変数は任意のポイントで0秒にリセット
繰り返し発動するイベント関数内の条件分岐で検知します。
void Update()
{
currentTime += Time.deltaTime; //経過時間を加算
if (Time.deltaTime > 10) //経過時間が10秒を越えたら
{
//経過時間が10秒になったときのイベントをここに記載
Debug.Log("任意の時間から10秒経過");
currentTime = 0; //時間をリセット
}
}
「メッセージ1」を受け取ったとき
受け取る側には、メッセージを受け取ったときに発動する関数を作成します。
メッセージを受け取る側にスクリプトファイルを作ります。
他のオブジェクトのプログラム(クラス)からメッセージを受け取りますが、関数のアクセス修飾子は private で大丈夫です。関数名がメッセージ名となります。
void Message1() //この関数名がメッセージ名になります
{
// ここにメッセージを受け取ったときのイベントを記載
Debug.Log("メッセージ1を受け取った");
}
「メッセージ1」を送る
メッセージを送る側のプログラムです。
メッセージを送る側は、メッセージを受け取るオブジェクトを指定して、SendMessageメソッドを使って文字列としてメッセージ(関数)を発動します。この時関数が文字列となるため、引数等は使用できません。
// Cat というオブジェクトを探し、Catが持つ関数 Messeage1 を呼び出す
GameObject.Find("Cat").SendMessage("Message1");
「メッセージ1」を送って待つ
スクラッチの「送って待つ」ブロックを使用した場合、受け取った側のに付いた同一スクリプト内の処理がすべて終わったタイミングで後続処理が発動します。 Unity でこの処理を行うには、コルーチンや繰り返し文の内部で変数の値をチェックして条件分岐させるなどの処理が必要です。
フローが複雑なので、今回は「〇秒後にメッセージを送る」という内容をご紹介します。
指定した時間後にメッセージを送るには、SendMessageメソッドの2番目の引数に指定する時間を入力します。
// Cat というオブジェクトを探し、2秒後に Messeage1 を呼び出す
GameObject.Find("Cat").SendMessage("Message1",2.0f);
ファイブボックスでは、スクラッチはもう卒業、という方向けにUnityの個別指導のオンラインレッスンを行っています。
ご興味のある方は当サイト、オンラインレッスンから、無料体験授業へお問い合わせ下さい。
Comments