Contents
【2DSTG制作】の動画内で表示されるコード:#21 – #30
サムネイルをクリックすると、YouTubeの動画ページに移動します。
#22:ゲームオーバー画面
ボタンがクリックされた時の処理
[SerializeField] CanvasGroup groupRetry; public void ButtonClick(string button) { switch(button) { case "Retry": // 連打防止のためボタンを無効化 groupRetry.interactable = false; // リトライ用の処理を実行 Retry(); break; case "Quit": groupRetry.interactable = false; // タイトル画面に戻る処理を実行 Quit(); break; default: break; } }
UIのフェードイン・フェードアウト
using DG.Tweening; public void FadeInRetry() { groupRetry.DOFade(1, 1.0f).SetUpdate(true) .OnComplete(() => { // フェードイン完了後にボタンを有効にする groupRetry.blocksRaycasts = true; groupRetry.interactable = true; }); } public void FadeOutRetry() { groupRetry.DOFade(0, 0.5f) .OnComplete(() => { groupRetry.blocksRaycasts = false; }); }
#23:キャラクターセレクト
CharacterSelect
[SerializeField] CanvasGroup groupTitle; [SerializeField] CanvasGroup groupRetry; [SerializeField] CanvasGroup groupSelect; // 生成するキャラクターの番号 public int characterNum; public void ButtonClick(string button) { // SE再生 SoundManager.instance.PlaySE(); switch(button) { case "Play": // 連打防止 groupTitle.interactable = false; // キャラクターセレクト画面をフェードイン FadeInSelect(); break; case "Retry": // リトライ用の処理を実行 case "Quit": // タイトル画面に戻る処理を実行 case "Kohaku": characterNum = 0; groupSelect.interactable = false; // UIをフェードアウト+ゲーム開始 GameStart(); break; case "Misaki": characterNum = 1; groupSelect.interactable = false; GameStart(); break; default: break; } }
プレイヤーユニットの生成
[SerializeField] GameObject playerA; [SerializeField] GameObject playerB; public void GameStart() { // クリックしたボタンのキャラクターを生成 if (characterNum == 0) { Instantiate(playerA, playerA.transform.position, Quaternion.identity); } else { Instantiate(playerB, playerB.transform.position, Quaternion.identity); } }
#24:イベントを取得して音声を再生する
イベントの取得(Live2D)
using UnityEngine; public class Live2dUserData : MonoBehaviour { public void UserDataEventListener(string value) { // イベントに入力した内容に応じて分岐 switch(value) { case "Voice1": // ボイス再生(戦闘開始!) SoundManager.instance.PlayVOICE(univ1220); break; case "Voice2": // ボイス再生(まだまだ!) SoundManager.instance.PlayVOICE(univ1230); break; ...省略... } } }
CubismMotion3Json.cs
var animationEvent = new AnimationEvent { time = UserData[i].Time, functionName = "UserDataEventListener", stringParameter = UserData[i].Value, };
#25:プレイヤーの動きとLive2Dのパラメータをリンク
ターゲットの位置を取得
using Live2D.Cubism.Framework.LookAt; using UnityEngine; public class Live2dTarget : MonoBehaviour, ICubismLookTarget { // ターゲット GameObject playerUnit; Vector3 targetPosition; void Start() { playerUnit = GameObject.FindWithTag("Player"); } public Vector3 GetPosition() { // プレイヤーが存在すれば if (playerUnit != null) { // プレイヤーの位置を取得 targetPosition = playerUnit.transform.position; } else { targetPosition = Vector3.zero; } return targetPosition; } public bool IsActive() { return true; } }
#27:難易度の選択
難易度に応じてパラメータが変化
// 難易度を管理するスクリプト [SerializeField] Manager manager; // ヒットポイント [SerializeField] int hp; void Start() { // 難易度に応じて耐久力を変化させる if (manager.difficulty == 1) { // EASYの場合は2分の1(小数点以下切り上げ) hp = Mathf.CeilToInt(hp * 0.5f); } else if (manager.difficulty == 3) { // HARDの場合は2倍 hp = hp * 2; } }
#29:撃ち返し弾
発射角度をランダムにする
// 弾の移動速度 [SerializeField] float speed; // ランダムな角度の範囲 [SerializeField] int minAngle; [SerializeField] int maxAngle; void Start() { // 撃ち返し弾の速度にランダムな値を加算 speed = speed + Random.Range(-0.5f, 0.5f); // 撃ち返し弾の角度をランダムにする transform.localRotationo = Quaternion.AngleAxis(Random.Range(minAngle, maxAngle), new Vector3(0, 0, 1)); }