はじめに
今回は、格ゲーなどで使うキャラクター選択システムを作ってみたので紹介します。
構造
キャラクター選択シーン
- キャラクターのアイコンを貼り付けたボタンを配置
- ボタンをクリックしたら、static int型の変数に数字を入れて保存
- 同じシーン内で対応したキャラクターの立ち絵を表示する
バトルシーン
- 選択されたキャラクターの立ち絵、キャラクター名を表示する
としました。
キャラクターの立ち絵を表示する
スクリプトは以下のように書きました。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CharacterPic : MonoBehaviour
{
//ボタンごとに対応するキャラクターの立ち絵をアサインしてください
public GameObject _character1;
public GameObject _character2;
public static int _selectCharaNumber;
void Start()
{
_selectCharaNumber = 0; //最初は何も表示したくないので、割り当てをしていない番号を代入します
}
public static int CharaNamber()
{
return _selectCharaNumber;
}
//キャラクター1のボタンにつける
public void Chara1()
{
_selectCharaNumber = 1;
_character1.SetActive(true);
_character2.SetActive(false); //キャラ数に合わせて追加してください
}
//キャラクター2のボタンにつける
public void Chara2()
{
_selectCharaNumber = 2;
_character2.SetActive(true);
_character1.SetActive(false); //キャラ数に合わせて追加してください
}
}
かなり力技。キャラクター数が増えたときに大変なので、例えば画像を差し替えるようにするとか、プレハブを生成するとか…改良の余地ありですね。
スクリプトができたら、適当なゲームオブジェクトを作ってアタッチしてください。Inspectorにキャラクターの立ち絵をアサインしておくのも忘れず行いましょう。
それができたら、ボタンでキャラクターに対応したメソッドを呼べるようにしておきます。
別シーンでキャラクターの立ち絵、キャラクター名のテキストを表示する
①のシーンで選んだキャラクターをバトルシーンで使うための機能になります。
スクリプトはこちらです。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Player : MonoBehaviour
{
int _charaNumber;
public Text _nameArea; //キャラクターの名前を表示させたいテキスト
//キャラクターの名前
public string _charaName1;
public string _charaName2;
//キャラクターの立ち絵
public GameObject _character1;
public GameObject _character2;
void Start()
{
_charaNumber = CharacterPic._selectCharaNumber; //キャラクター選択シーンで選んだキャラクターの番号を取得
CharaSpawn();
}
//キャラの名前、ゲームオブジェクト表示
public void CharaSpawn()
{
if(_charaNumber == 1)
{
_nameArea.text = string.Format(_charaName1);
_character1.SetActive(true);
}
if(_charaNumber == 2)
{
_nameArea.text = string.Format(_charaName2);
_character2.SetActive(true);
}
}
}
こちらのスクリプトも適当なゲームオブジェクトを用意しアタッチして、キャラクター名や立ち絵素材をアサインしてください。
これでキャラクター選択の仕組みができました!
最後に
いかがでしたでしょうか。
1つのゲームオブジェクトで管理できるようにしたとはいえ、キャラクター数が増えるととんでもないことになりそうなので、もう少しいいコードにできないか考えてみようと思います。
最後まで読んでいただき、ありがとうございました!