見下ろし型アクションゲーム制作テンプレート「TopDownEngine」の機能の使い方(コード)。
実際にゲームを作りながら把握した、(多分公式を見ても分からない)各種機能の使い方。
攻撃力(接触時の相手側へのダメージ)の設定
- プレハブ本体を選択。
- コンポーネント、DamageOnTouch -> DamageCausedの値で、接触時のダメージを設定出来る。
主に、敵キャラクターや、弾丸等にアタッチされている。
弾丸でも、弾丸本体のプレハブに値が設定されている。
プレイヤーの能力や、銃の性能で決められる仕様ではない(速度や加速度等も)。
HP
プレハブ本体 -> コンポーネント、HealthがHP周りを管理している。
以下、HPの値に関係する各変数。
- 初期HP:InitialHealth
- 最大HP:MaximumHealth
- 現在HP:CurrentHealth
弾丸の消滅判定も、Healthで管理されている。
Healthが1に設定されているので、衝突判定が1回のみになる。
ダメージを与える
プレハブ本体にアタッチされている、Healthのメソッド、Damage()を呼ぶ。
(HPに関連性の高いクラスなら、_healthに参照を取得している)。
コード
using MoreMountains.TopDownEngine;
Health.Damage(damage, instigator, flickerDuration, invincibilityDuration);
引数の説明
- damage:(int)ダメージ量。
- instigator:(GameObject)ダメージの原因となるゲームオブジェクト(攻め手側)。
- flickerDuration:(float)点滅時間(デフォルトは0.5)。
- invincibilityDuration:(float)無敵時間(デフォルトは0.5)。
CharacterAbilityの派生クラスでの代替メソッド
キャラクターに機能を追加する場合に使用する「CharacterAbility」での各種代替メソッド。
Start、Awake
- PreInitialization
- Initialization
protected override void PreInitialization ()
{
base.PreInitialization();
//ここにコードを追加
}
protected override void Initialization ()
{
base.Initialization();
//ここにコードを追加
}
名前の通り、PreInitializationの方が先に実行される。
Update系
- ProcessAbility
- EarlyProcessAbility
- LateProcessAbility
Update == ProcessAbility
EarlyUpdate == EarlyProcessAbility
LateUpdate == LateProcessAbility
public override void ProcessAbility()
{
base.ProcessAbility();
//ここにコードを追加
}
【モバイル向け】バーチャルコントローラ
モバイル向けにビルドしたら、自動的にバーチャルコントローラが現れる。
各リスナーには、既にInputManagerのメソッドが登録されている。
InputManager経由でPlayerの各種アクションが呼ばれる。
ボタンの対応表
(注)バーチャルコントローラなので、キーボードの各キーと対応している訳ではない。
- 【A】ジャンプ、インタラクト(調べる、アイテムの使用、会話)
- 【B】武器切り替え
- 【X】ラン
- 【Y】ダッシュ(回避)
- 【RT】攻撃
- 【顔アイコンをクリック】ポーズメニューを開く
通常設定では、インベントリを開く方法が無い。
モバイル向けゲームでも、インベントリを使用したい場合は、「インベントリを開くボタン」と、インベントリ画面に「インベントリを閉じるボタン」を追加する必要がある。
CorgiEngineのデモでは右上の装備欄をインベントリ開閉ボタンにしていたので、その辺りに透明なボタンを設置すると良い。
スコア(ポイント)表示の追加
インスペクターから設定するだけで、GameManager.PointsをTextで表示出来る。
(デモシーンKoalaDungeonをベースとした場合の例)。
- ヒエラルキー -> KoalaCameras -> KoalaUICameraを選択。
- KoalaUICameraにアタッチされたコンポーネント、GUIManagerのインスペクターからポイント表示用のTextを紐付け。
敵の死亡時にスコアを加算
敵のプレハブ本体 -> HealthのDeathの項にある、「Points When Destroyed」に加算したい値を設定。
敵の死亡時に指定したメソッドを呼ぶ
- 敵のプレハブ -> 子のDeathFeedbackを選択。
- コンポーネント、MMFeedbacks -> Add new feedback…でEventsを追加。
- Events -> PlayEventsに呼びたいスクリプトのメソッドを設定。
【3の補足】プレハブを設定する場合、Scene内のメソッドを登録出来ない。
敵本体にアタッチしたスクリプト経由で、GameManager等に追加したメソッドを呼ぶ。
スコア(ポイント)の加算、セット
GameManager.Pointsを加算したり、セットしたりする方法。
GUIManagerに紐付けされた、Points表示用のTextも更新される。
加算
int points = 10;
//Aパターン
TopDownEnginePointEvent.Trigger(PointsMethods.Add, points);
//Bパターン
GameManager.Instance.AddPoints(points);
セット
int points = 10;
//Aパターン
TopDownEnginePointEvent.Trigger(PointsMethods.Set, points);
//Bパターン
GameManager.Instance.SetPoints(points);
シーンの移行
LevelManagerか、LoadingSceneManagerを使う事でシーンの移行が出来る。
直接の移行でなく、間にローディングシーンが挟まれる。
LevelManagerの使用時には、「using MoreMountains.TopDownEngine」と宣言。
LoadingSceneManagerの使用時は、「using MoreMountains.Tools」と宣言しておく。
using MoreMountains.Tools;
using MoreMountains.TopDownEngine;
if (LevelManager.Instance != null)
{
LevelManager.Instance.GotoLevel("シーン名");
}
else
{
LoadingSceneManager.LoadScene("シーン名");
}
セーブ&ロード
MMSaveLoadManagerを使えば簡単にクラスを保存出来る。
使用時には、「using MoreMountains.Tools」と宣言しておく。
//以下はPlayerStatusという自作クラスのセーブ&ロードを行っている例。
//自作クラスの中にstaticのファイル名の変数を作成&使用している。
//セーブ
MMSaveLoadManager.Save(セーブするクラスを代入した変数, "FileName");
MMSaveLoadManager.Save(playerStatus, PlayerStatus.FileName);
//ロード
セーブデータの受け手の変数 = (ロードするクラスの型)MMSaveLoadManager.Load(typeof(ロードするクラスの型), "FileName");
playerStatus = (PlayerStatus)MMSaveLoadManager.Load(typeof(PlayerStatus), PlayerStatus.FileName);
//以下はセーブデータクラスの例。
//セーブデータクラスには、このアトリビューションが必須。
[System.Serializable]
public class PlayerStatus
{
//当然だが外部から扱う値はpublicに。
public int attackLevel = 1;
public int attack = 10;
//計算のみに使う値はprivateのままでOk。
int attackToAdd = 5;
//staticの定数を含めてもエラーは出ない。(但しセーブデータ内にファイル名を設置するのが設計上良いかは知らないが)。
public static string FileName = "SaveData_PlayerStatus";
public int points = 1000;
//列挙型も大丈夫。
public enum ColorType {
Red = 0,
Blue = 1,
}
public enum StatusType {
Attack = 0,
AttackSpeed = 1,
Size = 2,
}
//Unity独自の型を使用するとエラーが出る。
/*
Vector2 size = new Vector2(5, 1);
Vector3 position = new Vector3(0, 0, 0);
*/
//引数や、返り値のあるメソッドも使用可能。勿論、外部から扱うのであればpublicに。
public int CheckValue (ColorType colorType, StatusType statusType) {
//割愛
}
//通常と同じで、計算でprivateな変数を使用してもOk。
public void AddAttack () {
attackLevel++;
attack += attackToAdd;
}
スクリーンショットを撮る
1ボタンで撮る
- 空のGameObjectを作成。
- インスペクター -> AddComponent -> MMScreenshot
- デフォルト設定では、キーボードの「Kキー」をクリックで、ゲーム画面サイズの3倍の大きさのスクリーンショットが撮れる。
- デフォルト設定では、フォルダ「…Project Name\Screenshots」に保存される。
- GameViewSizeMultiplierの値を変更してサイズ倍率の変更が可能。
上部メニューから撮る
上部メニュー -> Tools -> More Mountains -> Screenshotから「等倍、2倍、3倍」で撮影可能。
- ショートカットキー「Ctrl+K」でも撮影出来るが、何故か3倍のみしか対応していない。
- ゲーム実行中じゃなくても撮影可能。