- 2024年8月10日
1分間 Unity講座 スクリプトファイルのtemplateに表示されている不要なコメント(Start is called before the first frame update:Update is called once per frame)を消す方法
このブログは「ファイブボックス一分間Unity講座」の補足説……
第10回目の今回も演出関連の記事です。ゲームの進行には影響しませんので、スキップしていただいても結構です。
今回は鍋の底から泡が浮かび上がってくる演出を作ってみます。
「ベジタブルゲームの作り方」その他の記事はこちらから
複数の泡をUI素材として生成し、任意のパネルの子要素として配置します。
まずは BackCanvas の子要素として、作成済みの BGPanel と WaterPanel の間に新たな Panel を作成します。さらにその子要素として Image を作成します。
作成したPanelを以下のように修正します。
続いてImageを以下のように修正します。
この泡は上昇し、水の表面に付いたら削除される設定にします。 そこで水の画像の上部にも当たり判定を付けておきましょう。
作成済みのUI素材、WaterImage に BoxCollider 2Dコンポーネント を追加し、以下のように修正します。
作成したBubbleImageは生成後、左右に揺れながら上昇し、水の上で削除されるようにします。 [02_Script]フォルダに Bubble というスクリプトファイルを作成します。
作成したスクリプトファイルは BubbleImageオブジェクトにアタッチしておきます。
Bubbleクラスでは以下の変数を使用します。
変数名 | 型 | アクセス | 説明 |
rt | RectTransform | private | 座標や大きさを更新するための変数 |
s | float | private | 経過時間を加算するための変数、三角関数の周期として使用 |
Bubble.cs を立ち上げて変数の宣言と初期値の設定を行います。
RectTransform rt; //RectTransformコンポーネント型の変数
float s; //経過時間を加算する変
void Start()
{
rt= GetComponent<RectTransform>(); //rtに初期値を取得し代入
}
続いて当たり判定後、削除される動きを作成します。
private void OnTriggerEnter2D(Collider2D collision) //侵入判定
{
if (collision.name == "WaterImage") //当たった相手の名前が WaterImageなら
{
Destroy(gameObject); //自分自身を削除
}
}
FixUpdate()関数では次の2つの動きを作ります。
❶ 三角関数を使って左右に動き続ける
❷ 徐々に大きくなる
void FixedUpdate()
{
s += Time.deltaTime; //1フレーム間の時間を加算
//左右の揺らぎを三角関数で実現
rt.transform.localPosition += new Vector3(Mathf.Sin(s * 3),0, 0);
transform.localScale *= 1.0005f; //徐々に大きくなる
}
これで泡の動きは完成したので、作成した BubbleImageオブジェクトを[03_Prefabs]フォルダにドラッグ&ドロップしてプレハブ化しておきます。
続いて、泡を発生させ続ける動きを UIManagerクラス に追記します。新たに使用する変数は以下の通りです。
変数名 | 型 | アクセス | 説明 |
bubblePrefab | GameObject | [SerializeField] | バブルのプレハブ |
bubblePanel | GameObject | private | バブルを子要素として管理する親オブジェクト、BubblePanelを指定 |
currentTime | float | private | 泡が生成されるまでの時間を加算する変数 |
bubbleTime | float | private | 泡が生成されるまでの制限時間(毎回乱数で決定) |
UIManager.cs を立ち上げて、変数の宣言と初期値の取得を行います。
[SerializeField] GameObject bubblePrefab; //BubbleImageのプレハブ
float currentTime, bubbleTime; //生成までの時間を管理する変数
GameObject bubblePanel; //Bubbleを管理するオブジェクト
void Start()
{
//記述済みコード省略
//BackCanvasからBubblePanelを探して、bubblePanelに代入
bubblePanel = GameObject.Find("BackCanvas/BubblePanel").gameObject;
}
FixedUpdate()関数では以下の内容を実現します。
void FixedUpdate()
{
//記述済みコード省略
currentTime += Time.deltaTime; //経過時間を計測
if (currentTime > bubbleTime) //もし経過時間が指定時間を越えたら
{
GameObject bubble = Instantiate(bubblePrefab); //bubbleという名で泡を生成
bubble.transform.SetParent(bubblePanel.transform); //bubbleをPanelの子要素に
bubble.transform.localScale = Vector3.one; //bubbleの大きさをリセット
//bubbleの出現位置を鍋の底のランダムな場所に指定
bubble.transform.localPosition = new Vector3(Random.Range(-520, 520), -370, 0);
currentTime = 0; //経過時間をリセット
bubbleTime = Random.Range(0.1f, 2.0f); //次の出現までの時間を乱数で指定
}
}
宣言したbubblePrefab にInspectorから、先のフェーズで作成した BubbleImage のプレハブをAssignします。
これで鍋の底から泡が発生し続ける動きができました。
ファイブボックスでは、Unityの個別指導のオンラインレッスンを行っています。
ご興味のある方は当サイト、オンラインレッスンから、無料体験授業へお問い合わせ下さい。