AIを活用して、ゲーム制作!
初心者でもAIに助けてもらいながらUnityでゲームを開発する方法を解説します。
このページの内容は、下記の動画で詳しく説明しています
はじめに
ゲーム制作なんて自分には絶対に無理!
自分はプログラマーとか、専門家じゃないからゲームなんて作れるわけがない!
そんなふうに思っていませんか?
確かに自分ひとりでは難しいかもしれません
でも、最近はAIの進化がものすごく、これらAIを活用すれば
あなたもゲーム制作者になれるかもしれません!
さぁ、一緒に、AIに頼りまくったゲーム制作を始めていきましょう!
前回の振り返り
前回は、ChatGPTに教えてもらいながら
Unityから、制作中のゲームの状態を表すデータを出力する方法を確立しました。
これにより、AIへUnityの状態を伝える力がアップしました。
このチャレンジのコンセプト
- AIを活用することで、初心者でもゲーム制作できることを目指す!
- Unity(ユニティ)というゲームエンジンを使って制作する
- AIはできる限り、無料のものを使用する(商用利用の関係や、どうしても必要な機能の関係で有料版を使用する場合もあり)
- AIを活用したゲーム制作の過程を、省略せずに全てをお見せすることで、視聴者の方が真似をして再現できるようにする
このページで使用するAIツール
ChatGPT(チャットジーピーティー)
- https://openai.com/ja-JP/chatgpt/
- ChatGPTは、チャット形式で質問や指示を投げかけると、自然な言葉で回答してくれるAIです。
- 今回は、ゲーム制作の進め方を提案してもらったり、具体的な手順を教えてもらったりしました。
このページ(および動画)の活用方法
- まずは真似して同じように試してみて、慣れてきたら少しアレンジするのが良いと思います
- 手順などは、動画を見てもらうのが一番分かりやすいと思います
- AIへの指示文(プロンプト)はこのページに載せていますので、コピペして、ご自身用に修正しながらご使用ください
それでは、AIに助けてもらいながら、ゲーム制作を始めていきましょう!
AIに進め方の概略を考えてもらう
まずは、今後の進め方をChatGPTに聞いてみます。
現在Unityで下記のようなゲームを作成中です。
このゲームに、
・採掘用ツールのピッケルという要素
・獲得した鉱石を消費してピッケルのグレードアップ
・取得した鉱石が種類ごとにたまっていく仕組み
・ピッケルごとに採掘できる鉱石の種類と確率が変わる仕組み
を追加したいと思います。
これらを全て追加するまでの概略の開発順序を考えてください。
各ステップの詳細な説明は不要です。スクリプトもまだ書かないでください。
<前回ChatGPTに書いてもらったゲーム内容の文章を貼り付ける>
以下は、あなたのゲームに新しい要素を追加するための概略的な開発順序です。この順序に従えば、段階的に実装を進めることができます。
開発順序
1. ピッケルオブジェクトの作成
- ピッケル(採掘用ツール)をゲームのデータとして追加。
- 対応する要素:
- ツールの種類(例: 初期ピッケル)。
- ツールのアップグレードに必要なデータ構造(例: 現在のレベル、アップグレードに必要なコスト)。
2. アップグレードシステムの拡張
- UpgradeButton の機能を拡張し、鉱石を消費してピッケルをアップグレードする機能を追加。
- 必要な操作:
- 現在の鉱石数を確認。
- アップグレード条件を満たしていればアップグレードを実行し、ツールの性能を向上。
- 消費した鉱石を差し引く。
3. 鉱石の種類の管理
- 鉱石を種類ごとに管理する仕組みを導入。
- 鉱石ごとに異なるスプライトとポイント値を設定。
- 各鉱石の取得数を保存。
- 必要な変更:
- スコア管理から鉱石ごとのカウントに変更。
- UIの拡張(鉱石ごとの数値表示)。
4. ピッケルの種類と確率の連動
- ピッケルの種類に応じて採掘できる鉱石の種類と出現確率を変更。
- 初期ピッケル: 基本鉱石のみ採掘可能。
- 上位ピッケル: レア鉱石の採掘が可能に。
- 実装方法:
- 鉱石出現確率をピッケルのデータに基づいて計算。
- クリックイベント時に現在のピッケルに応じた抽選処理を実行。
5. UIの更新
- 各鉱石のカウントを表示するUIをCanvas内に追加。
- ピッケルの種類やレベルを視覚的に表示するエリアを新設。
- 必要なら、現在のピッケルによる効率を表示。
6. テストと調整
- 全ての要素が正しく動作することを確認。
- ゲームバランスの調整:
- 鉱石の出現確率。
- アップグレードコスト。
- 鉱石ごとのポイント値。
注意事項
- データ構造: ピッケルや鉱石の情報はスクリプタブルオブジェクト(ScriptableObject)を活用すると管理が容易になります。
- 段階的な保存: 変更を加えた後、ゲーム全体が期待通りに動作することを都度確認してください。
- スクリプト変更の影響範囲: 既存の「OreController」「GameManager」スクリプトに影響が出るため、慎重にコードを追加・変更してください。
まずは、ステップ1の「ピッケルオブジェクトの作成」から進めると良いでしょう。この順序で進める際に、各ステップでの詳細が必要であればお知らせください!
ゲーム制作の進め方を提案してくれました。
今回は、ステップ1~2まで進めていきます。
ステップ1:ピッケルオブジェクトの作成
ステップ1を進めていきます
1. ピッケルオブジェクトの作成
- ピッケル(採掘用ツール)をゲームのデータとして追加。
- 対応する要素:
- ツールの種類(例: 初期ピッケル)。
- ツールのアップグレードに必要なデータ構造(例: 現在のレベル、アップグレードに必要なコスト)。
ステップ1の手順を聞く
あなたが提案してくれた手順通りに進めますので、
ステップ1から順番にできる限り具体的で詳細に教えてください。
既存のスクリプトに修正を加える場合は、必ずスクリプトの中身を書く前に
どのスクリプトを修正するかを私に伝えてください、現状のスクリプトを教えるようにします。
「現状のヒエラルキー」
Main Camera
- Transform
- Camera
- AudioListener
- UniversalAdditionalCameraData
- Physics2DRaycaster
Global Light 2D
- Transform
- Light2D
Ore
- Transform
- SpriteRenderer
- OreController
- BoxCollider2D
- ClickEffect
- AudioSource
GameManager
- Transform
- GameManager
Canvas
- RectTransform
- Canvas
- CanvasScaler
- GraphicRaycaster
ScoreText
- RectTransform
- CanvasRenderer
- Text
UpgradeButton
- RectTransform
- CanvasRenderer
- Image
- Button
Text (Legacy)
- RectTransform
- CanvasRenderer
- Text
ProgressBar
- RectTransform
- Slider
Background
- RectTransform
- CanvasRenderer
- Image
Fill Area
- RectTransform
Fill
- RectTransform
- CanvasRenderer
- Image
EventSystem
- Transform
- EventSystem
- StandaloneInputModule
- BaseInput
BackGround
- Transform
- SpriteRenderer
ステップ1の「ピッケルオブジェクトの作成」に進みます。このステップでは、ピッケルに関する基本情報をゲーム内で管理できる仕組みを作成します。
ステップ1: ピッケルオブジェクトの作成
目標
- プレイヤーが使用するツール(ピッケル)を管理する仕組みを追加。
- ピッケルの種類、レベル、性能(クリックで獲得できるスコア増加量)を設定。
- 将来的にアップグレードで変更可能にする基盤を整備。
手順
1. ScriptableObjectの作成
ScriptableObjectを使用して、ピッケルのデータを柔軟に管理できるようにします。
- 新しいC#スクリプトを作成
- Assetsフォルダ内に「Scripts」フォルダがなければ作成してください。
- Scriptsフォルダ内に「PickaxeData.cs」という名前で新しいスクリプトを作成します。
- スクリプト内容
以下のコードをPickaxeData.cs
に記述してください。
using UnityEngine;
[CreateAssetMenu(fileName = "PickaxeData", menuName = "MiningGame/Pickaxe")]
public class PickaxeData : ScriptableObject
{
public string pickaxeName; // ピッケルの名前
public int level; // ピッケルのレベル
public int miningPower; // 1クリックあたりのスコア増加量
public int upgradeCost; // 次のレベルへのアップグレードコスト
}
- ScriptableObjectインスタンスの作成
- Unityエディタで
Assets
フォルダを右クリックし、Create > MiningGame > Pickaxe
を選択。 - 作成された
PickaxeData
インスタンスを選択して以下のようにデータを設定します。- Name: “Basic Pickaxe”
- Level: 1
- Mining Power: 10
- Upgrade Cost: 50
2. PickaxeManagerの作成
現在使用中のピッケルを管理するスクリプトを追加します。
- 新しいC#スクリプトを作成
- Scriptsフォルダ内に「PickaxeManager.cs」という名前で新しいスクリプトを作成します。
- スクリプト内容
以下のコードをPickaxeManager.cs
に記述してください。
using UnityEngine;
public class PickaxeManager : MonoBehaviour
{
public PickaxeData currentPickaxe; // 現在使用中のピッケル
public int GetMiningPower()
{
// 現在のピッケルの採掘力を返す
return currentPickaxe.miningPower;
}
public void UpgradePickaxe()
{
// ピッケルをアップグレード(次のステップで詳細を実装)
Debug.Log("Upgrade function will be implemented later.");
}
}
3. HierarchyにPickaxeManagerを追加
- GameManagerオブジェクトにアタッチ
PickaxeManager.cs
スクリプトを GameManager オブジェクトにアタッチします。
currentPickaxe
を設定
- GameManagerオブジェクトの
PickaxeManager
コンポーネント内のCurrent Pickaxe
に、先ほど作成したBasic Pickaxe
インスタンスをドラッグ&ドロップで割り当てます。
4. ヒエラルキーの更新
GameManager
- Transform
- GameManager
- PickaxeManager (追加)
- currentPickaxe: Basic Pickaxe
次のステップ
- 現在のピッケルを利用して、クリック時のスコア計算を変更します。
- この変更は
OreController
またはGameManager
に影響を与える可能性があります。次に進む前に、現状の関連スクリプトを共有してください!
ピッケルの種類を考えてもらう
現在Unityで「鉱石クリッカー」というクリッカーゲームを制作中です。
ゲーム中で鉱石を採掘するためのツールである「ピッケル」の種類を考えてください。
#条件
・ピッケルには以下のパラメータを含めてください
-Name
-Level
-Mining Power
-Upgrade Cost
・以下に示した鉱石の種類を考慮して考える
#鉱石の種類
石 Stone 最も基本的な鉱石。序盤の収集対象。
銅鉱石 Copper Ore 石よりも価値のある初期鉱石。
鉄鉱石 Iron Ore 中盤の基礎素材。アップグレードに必要。
銀鉱石 Silver Ore 価値の高い中盤の鉱石。
金鉱石 Gold Ore 高価な鉱石で、後半の素材として重要。
プラチナ Platinum 入手が難しい鉱石。深海エリアで出現。
エメラルド Emerald 宝石系の鉱石。レアな報酬やイベントで登場。
ルビー Ruby エメラルドより価値の高い宝石。
ダイヤモンド Diamond 最も価値のある宝石。
オリハルコン Orichalcum 超希少な鉱石。エンドコンテンツの目標。
鉱石の種類に基づき、ゲームに登場させる「ピッケル」の種類を以下のように提案します。それぞれのピッケルにはユニークな名前、レベル、採掘力(Mining Power)、アップグレードコスト(Upgrade Cost)を設定しました。
ピッケルの種類とステータス
1. 木製ピッケル (Wooden Pickaxe)
- Level: 1
- Mining Power: 1
- Upgrade Cost: 10 Stone
- 特徴: 初期装備。石を効率的に採掘するのに適している。
2. 銅製ピッケル (Copper Pickaxe)
- Level: 2
- Mining Power: 5
- Upgrade Cost: 50 Stone, 10 Copper Ore
- 特徴: 銅鉱石や鉄鉱石の採掘に最適化された初期アップグレード。
3. 鉄製ピッケル (Iron Pickaxe)
- Level: 3
- Mining Power: 15
- Upgrade Cost: 100 Stone, 30 Copper Ore, 10 Iron Ore
- 特徴: 中盤の必需品で、銀鉱石や金鉱石の採掘が効率的。
4. 銀製ピッケル (Silver Pickaxe)
- Level: 4
- Mining Power: 30
- Upgrade Cost: 200 Stone, 50 Iron Ore, 20 Silver Ore
- 特徴: 銀鉱石や金鉱石の大量収集に特化。
5. 金製ピッケル (Golden Pickaxe)
- Level: 5
- Mining Power: 50
- Upgrade Cost: 300 Stone, 100 Silver Ore, 30 Gold Ore
- 特徴: 金鉱石やプラチナの採掘が可能。
6. プラチナピッケル (Platinum Pickaxe)
- Level: 6
- Mining Power: 75
- Upgrade Cost: 500 Stone, 50 Gold Ore, 20 Platinum
- 特徴: 深海エリアで高い採掘力を発揮する。
7. エメラルドピッケル (Emerald Pickaxe)
- Level: 7
- Mining Power: 100
- Upgrade Cost: 800 Stone, 10 Platinum, 5 Emerald
- 特徴: レア鉱石(エメラルド・ルビー)の収集に適している。
8. ルビーピッケル (Ruby Pickaxe)
- Level: 8
- Mining Power: 150
- Upgrade Cost: 1000 Stone, 20 Emerald, 10 Ruby
- 特徴: ダイヤモンドやルビーの採掘に最適。
9. ダイヤモンドピッケル (Diamond Pickaxe)
- Level: 9
- Mining Power: 200
- Upgrade Cost: 1500 Stone, 30 Ruby, 15 Diamond
- 特徴: ダイヤモンドや超希少鉱石の採掘効率を大幅に向上。
10. オリハルコンピッケル (Orichalcum Pickaxe)
- Level: 10
- Mining Power: 300
- Upgrade Cost: 2000 Stone, 50 Diamond, 10 Orichalcum
- 特徴: 最強のピッケル。全ての鉱石を最高効率で採掘可能。
補足
- Upgrade Cost: 上記の値は参考用であり、ゲームバランスに応じて調整してください。特に、進行速度やプレイヤーの収集効率を考慮する必要があります。
- 追加要素: レベルごとに「専用エフェクト」や「採掘速度のアニメーション」を追加すれば、アップグレードの満足感が向上します。
このリストを元に、ゲーム内にピッケルのステータスやアップグレードシステムを組み込むことができます!
スコア計算の修正
次に進んでください。
以下に「OreController」と「GameManager」スクリプトを示します
スクリプトを修正する時は省略せずに、既存のスクリプトを置き換えるだけで済むようにしてください。
「OreController」
<現状のOreController.csの中身を貼り付ける>
「GameManager」
<現状のGameManager.csの中身を貼り付ける>
次のステップでは、ピッケルの採掘力をゲームのクリックポイント計算に組み込むように OreController
と GameManager
のスクリプトを修正します。
目的
- ピッケルの「採掘力」(クリックで得られるポイント増加量)を有効にする。
- スコア計算に「PickaxeManager」から取得した採掘力を反映させる。
手順
1. 「OreController」スクリプトの修正
以下の変更を行います。
- クリック時に「PickaxeManager」から現在のピッケルの採掘力を取得し、それをスコア計算に使用する。
置き換え後の「OreController」スクリプト:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class OreController : MonoBehaviour
{
public GameManager gameManager; // GameManagerの参照
public PickaxeManager pickaxeManager; // PickaxeManagerの参照
public ParticleSystem oreEffectPrefab; // 破片エフェクトのPrefabを登録
public GameObject orePopupPrefab; // 鉱石ポップアップ用のPrefab
private ClickEffect clickEffect;
private Camera mainCamera; // カメラの参照
private AudioSource audioSource; // 効果音再生用のAudioSource
[SerializeField] private List<Ore> oreList; // 鉱石のリスト
private void Start()
{
clickEffect = GetComponent<ClickEffect>();
audioSource = GetComponent<AudioSource>(); // AudioSourceの取得
if (audioSource == null)
{
Debug.LogError("AudioSource component not found on the ore object!");
}
// 各コンポーネントとオブジェクトのエラーチェック
if (clickEffect == null)
{
Debug.LogError("ClickEffect component not found on the ore object!");
}
if (gameManager == null)
{
Debug.LogError("GameManager reference is not set in the Inspector!");
}
if (pickaxeManager == null)
{
Debug.LogError("PickaxeManager reference is not set in the Inspector!");
}
if (oreEffectPrefab == null)
{
Debug.LogError("OreEffectPrefab is not assigned in the Inspector!");
}
if (orePopupPrefab == null)
{
Debug.LogError("OrePopupPrefab is not assigned in the Inspector!");
}
mainCamera = Camera.main;
if (oreList == null || oreList.Count == 0)
{
Debug.LogError("Ore list is empty! Please assign ores in the Inspector.");
}
}
private void OnMouseDown()
{
Debug.Log("Ore clicked!");
// 効果音を再生
if (audioSource != null)
{
audioSource.Play();
}
// ランダムな鉱石を取得
Ore selectedOre = GetRandomOre();
if (selectedOre != null)
{
int miningPower = pickaxeManager.GetMiningPower(); // ピッケルの採掘力を取得
int pointsToAdd = selectedOre.points * miningPower;
gameManager.AddPoints(pointsToAdd);
Debug.Log("Obtained " + selectedOre.oreName + " worth " + pointsToAdd + " points!");
ShowOrePopup(selectedOre);
}
else
{
Debug.LogError("Failed to obtain an ore!");
}
if (clickEffect != null)
{
clickEffect.Play();
}
else
{
Debug.LogError("ClickEffect is null!");
}
PlayOreEffectAtClickPosition();
}
private Ore GetRandomOre()
{
float randomValue = Random.value;
float cumulativeProbability = 0;
foreach (Ore ore in oreList)
{
cumulativeProbability += ore.probability;
if (randomValue <= cumulativeProbability)
{
return ore;
}
}
return null;
}
private void PlayOreEffectAtClickPosition()
{
if (oreEffectPrefab != null)
{
Vector3 clickPosition = mainCamera.ScreenToWorldPoint(Input.mousePosition);
clickPosition.z = 0;
ParticleSystem effect = Instantiate(oreEffectPrefab, clickPosition, Quaternion.identity);
effect.Play();
Destroy(effect.gameObject, effect.main.duration);
}
else
{
Debug.LogError("OreEffectPrefab is null!");
}
}
private void ShowOrePopup(Ore selectedOre)
{
Vector3 clickPosition = mainCamera.ScreenToWorldPoint(Input.mousePosition);
clickPosition.z = 0;
GameObject popup = Instantiate(orePopupPrefab, clickPosition, Quaternion.identity);
SpriteRenderer spriteRenderer = popup.GetComponent<SpriteRenderer>();
if (spriteRenderer != null && selectedOre.oreSprite != null)
{
spriteRenderer.sprite = selectedOre.oreSprite;
}
StartCoroutine(AnimatePopup(popup));
Destroy(popup, 0.75f);
}
private IEnumerator AnimatePopup(GameObject popup)
{
float duration = 0.5f;
float elapsedTime = 0;
Vector3 originalPosition = popup.transform.position;
while (elapsedTime < duration)
{
float yOffset = Mathf.Sin(elapsedTime / duration * Mathf.PI) * 0.5f;
popup.transform.position = originalPosition + new Vector3(0, yOffset, 0);
elapsedTime += Time.deltaTime;
yield return null;
}
}
}
2. 「GameManager」スクリプトの修正
現時点では clickPower
のロジックを「PickaxeManager」に委譲するため、削除またはコメントアウトします。
置き換え後の「GameManager」スクリプト:
using UnityEngine;
using UnityEngine.UI;
public class GameManager : MonoBehaviour
{
public Text scoreText;
public Button upgradeButton;
public Slider progressBar;
private int score = 0;
private void Start()
{
UpdateUI();
upgradeButton.onClick.AddListener(UpgradeTool);
}
public void AddPoints(int points)
{
score += points;
UpdateUI();
}
private void UpgradeTool()
{
// 後続のステップでピッケルアップグレードをPickaxeManagerに委譲する実装を追加予定
Debug.Log("Upgrade functionality will be handled via PickaxeManager.");
}
private void UpdateUI()
{
scoreText.text = "Score: " + score;
progressBar.value = Mathf.Min(score / 1000f, 1f);
}
}
次のステップ
- 動作確認:ゲーム内で鉱石をクリックして得点計算が正しく動作しているか確認してください。
- 確認後、ピッケルのアップグレード機能の詳細を「PickaxeManager」に追加します。
ステップ2:アップグレードシステムの拡張
次はステップ2を進めていきます
2. アップグレードシステムの拡張
- UpgradeButton の機能を拡張し、鉱石を消費してピッケルをアップグレードする機能を追加。
- 必要な操作:
- 現在の鉱石数を確認。
- アップグレード条件を満たしていればアップグレードを実行し、ツールの性能を向上。
- 消費した鉱石を差し引く。
ステップ2の手順を聞く
次のステップに進んでください。
手順は細かく具体的に指示してください。
現状の「PickaxeManager」を下記に示します。
もし「PickaxeManager」以外のスクリプトを修正する場合は、必ずスクリプトの中身を書く前に
どのスクリプトを修正するかを私に伝えてください、現状のスクリプトを教えるようにします。
スクリプトを修正する場合は省略せずに、既存のスクリプトをそのまま置き換えれば済むようにしてください。
「PickaxeManager」
<現状のPickaxeManager.csの中身を貼り付ける>
次のステップでは、「ピッケルのアップグレード」機能を実装します。この機能では、スコアを使用してピッケルをアップグレードし、採掘力を向上させることができます。
目的
- 「PickaxeManager」にアップグレード機能を実装。
- UIボタンを使用して、スコアを消費してピッケルをアップグレード。
- ピッケルがアップグレードされると採掘力が向上。
手順
1. 必要なスクリプトの修正
- 「PickaxeManager」の修正: アップグレード機能のロジックを追加。
- 「GameManager」の修正: スコア消費とUI更新を「PickaxeManager」と連携。
「PickaxeManager」を修正しますので、スクリプトを以下の内容に置き換えてください。
置き換え後の「PickaxeManager」
using UnityEngine;
public class PickaxeManager : MonoBehaviour
{
public PickaxeData[] pickaxeDataList; // ピッケルデータのリスト
public PickaxeData currentPickaxe; // 現在使用中のピッケル
private int currentIndex = 0; // 現在のピッケルインデックス
public int GetMiningPower()
{
// 現在のピッケルの採掘力を返す
return currentPickaxe.miningPower;
}
public bool UpgradePickaxe(ref int currentScore)
{
// ピッケルがリストの最後でない場合のみアップグレード可能
if (currentIndex < pickaxeDataList.Length - 1)
{
int upgradeCost = pickaxeDataList[currentIndex + 1].upgradeCost;
if (currentScore >= upgradeCost)
{
currentScore -= upgradeCost;
currentIndex++;
currentPickaxe = pickaxeDataList[currentIndex];
Debug.Log("Pickaxe upgraded to: " + currentPickaxe.pickaxeName);
return true;
}
else
{
Debug.LogWarning("Not enough score to upgrade the pickaxe.");
return false;
}
}
else
{
Debug.LogWarning("No more upgrades available for the pickaxe.");
return false;
}
}
}
2. 「GameManager」の修正
アップグレードボタンの機能を「PickaxeManager」と連携させるために「GameManager」を修正します。スクリプトを以下に置き換えてください。
置き換え後の「GameManager」
using UnityEngine;
using UnityEngine.UI;
public class GameManager : MonoBehaviour
{
public Text scoreText;
public Button upgradeButton;
public Slider progressBar;
public PickaxeManager pickaxeManager; // PickaxeManagerの参照
private int score = 0;
private void Start()
{
UpdateUI();
upgradeButton.onClick.AddListener(() => UpgradeTool());
}
public void AddPoints(int points)
{
score += points;
UpdateUI();
}
private void UpgradeTool()
{
if (pickaxeManager.UpgradePickaxe(ref score))
{
UpdateUI();
}
}
private void UpdateUI()
{
scoreText.text = "Score: " + score;
// アップグレード可能な場合、ボタンのテキストを更新
if (pickaxeManager != null && pickaxeManager.currentIndex < pickaxeManager.pickaxeDataList.Length - 1)
{
int nextUpgradeCost = pickaxeManager.pickaxeDataList[pickaxeManager.currentIndex + 1].upgradeCost;
upgradeButton.GetComponentInChildren<Text>().text = "Upgrade (" + nextUpgradeCost + ")";
}
else
{
upgradeButton.GetComponentInChildren<Text>().text = "Max Level";
upgradeButton.interactable = false; // アップグレード不可能時はボタンを無効化
}
// プログレスバーを更新
progressBar.value = Mathf.Min(score / 1000f, 1f);
}
}
3. 新規データ「PickaxeData」を作成
ピッケルの情報を管理するために PickaxeData スクリプタブルオブジェクトを作成します。
手順
- 新規スクリプト作成: プロジェクト内で「PickaxeData.cs」というスクリプトを作成し、以下の内容をコピーしてください。
using UnityEngine; [CreateAssetMenu(fileName = "PickaxeData", menuName = "Pickaxe/Create New Pickaxe")] public class PickaxeData : ScriptableObject { public string pickaxeName; // ピッケルの名前 public int miningPower; // 採掘力 public int upgradeCost; // アップグレード費用 }
- データの作成:
- プロジェクトビューで 右クリック → Create → Pickaxe → Create New Pickaxe を選択し、複数のピッケルデータを作成します(例: Pickaxe_Level1、Pickaxe_Level2)。
- 各ピッケルデータに以下を設定してください。
- 名前 (pickaxeName): “Wood Pickaxe”, “Stone Pickaxe”, など。
- 採掘力 (miningPower): ピッケルの強さ。
- アップグレード費用 (upgradeCost): アップグレードに必要なスコア。
- PickaxeManagerのInspector設定:
- 「PickaxeManager」オブジェクトを選択し、Pickaxe Data List に作成した複数のピッケルデータをドラッグ&ドロップします。
- Current Pickaxe には最初のピッケルを割り当てます。
確認すべきこと
- スコアが足りていればピッケルがアップグレードされる。
- アップグレード後、採掘力が向上する(クリックで得られるスコアが増加)。
- UIのスコアとアップグレードボタンのテキストが正しく更新される。
問題がなければ次のステップに進みます!
変更を予定していなかった「GameManager」と「PickaxeData」のスクリプトも書かれていますが。
現状のスクリプトをインプットしていない状況なので、もしかしたら現状を無視したコードになっている可能性もあるので、現状のスクリプトを伝えて書き直してもらいます。
「GameManager」と「PickaxeData」は既に存在しています。
現状のスクリプトを以下に示しますので、これを元に書き換えるようにしてください。
その際に、省略しないで書いて、そのまま現状のスクリプトと置き換えれば済むようにしてください。
「GameManager」
<現状のGameManager.csの中身を貼り付ける>
「PickaxeData」
<現状のPickaxeData.csの中身を貼り付ける>
現状の「GameManager」と「PickaxeData」を基に、ピッケルのアップグレード機能を統合するようにスクリプトを修正します。スコアを消費してピッケルをアップグレードし、採掘力を向上させるシステムを構築します。
以下の内容に基づいて、スクリプトを置き換えてください。
修正後の「GameManager」
「PickaxeManager」と連携し、ピッケルのアップグレード機能を実装します。
using UnityEngine;
using UnityEngine.UI;
public class GameManager : MonoBehaviour
{
public Text scoreText; // スコア表示用UI
public Button upgradeButton; // アップグレードボタン
public Slider progressBar; // 進行バー
public PickaxeManager pickaxeManager; // PickaxeManagerの参照
private int score = 0; // 現在のスコア
private void Start()
{
UpdateUI();
upgradeButton.onClick.AddListener(UpgradeTool);
}
public void AddPoints(int points)
{
score += points;
UpdateUI();
}
private void UpgradeTool()
{
if (pickaxeManager.UpgradePickaxe(ref score))
{
UpdateUI();
}
}
private void UpdateUI()
{
// スコアの更新
scoreText.text = "Score: " + score;
// アップグレードボタンのテキストと有効/無効の設定
if (pickaxeManager.currentPickaxe != null)
{
int nextUpgradeCost = pickaxeManager.GetNextUpgradeCost();
if (nextUpgradeCost > 0)
{
upgradeButton.GetComponentInChildren<Text>().text = "Upgrade (" + nextUpgradeCost + ")";
upgradeButton.interactable = score >= nextUpgradeCost; // スコアが足りない場合ボタンを無効化
}
else
{
upgradeButton.GetComponentInChildren<Text>().text = "Max Level";
upgradeButton.interactable = false;
}
}
// 進行バーの更新(例: 最大スコア1000を基準)
progressBar.value = Mathf.Min(score / 1000f, 1f);
}
}
修正後の「PickaxeManager」
アップグレード機能を実装し、ピッケルの現在レベルや採掘力を管理します。
using UnityEngine;
public class PickaxeManager : MonoBehaviour
{
public PickaxeData[] pickaxeDataList; // ピッケルデータのリスト
public PickaxeData currentPickaxe; // 現在使用中のピッケル
private int currentIndex = 0; // 現在のピッケルのインデックス
private void Start()
{
if (pickaxeDataList != null && pickaxeDataList.Length > 0)
{
currentPickaxe = pickaxeDataList[0]; // 初期ピッケルを設定
}
else
{
Debug.LogError("Pickaxe data list is empty! Please assign pickaxe data in the Inspector.");
}
}
public int GetMiningPower()
{
return currentPickaxe != null ? currentPickaxe.miningPower : 1;
}
public bool UpgradePickaxe(ref int currentScore)
{
if (currentIndex < pickaxeDataList.Length - 1)
{
int nextUpgradeCost = pickaxeDataList[currentIndex + 1].upgradeCost;
if (currentScore >= nextUpgradeCost)
{
currentScore -= nextUpgradeCost;
currentIndex++;
currentPickaxe = pickaxeDataList[currentIndex];
Debug.Log("Upgraded to: " + currentPickaxe.pickaxeName);
return true;
}
else
{
Debug.LogWarning("Not enough score to upgrade.");
return false;
}
}
else
{
Debug.LogWarning("No further upgrades available.");
return false;
}
}
public int GetNextUpgradeCost()
{
if (currentIndex < pickaxeDataList.Length - 1)
{
return pickaxeDataList[currentIndex + 1].upgradeCost;
}
return 0; // 最大レベルに達している場合
}
}
追加手順
- 「PickaxeManager」のInspector設定
- Pickaxe Data List に複数のピッケルデータを順番にドラッグ&ドロップしてください。
- ピッケルはゲームの進行に応じて強化される順序で設定します。
- アップグレードの確認
- ゲームをプレイしてスコアを獲得し、ピッケルをアップグレードしてください。
- アップグレード時、スコアが減少し、採掘力が向上していることを確認します。
問題がなければ次のステップに進みます!
動作確認
Unityを実行して確認します。
スコアがアップグレード条件を満たすと、アップグレードボタンを押せるようになり
ボタンを押すと、ピッケルのグレードがアップしています。
今はまだ見た目では分かりませんが、コンソールの表示で確認することができます。
コメント