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));
}







