Unity GUIメモ
・Label
テキストや画像表示、Rectクラスで位置と範囲を指定。
テキストとテクスチャを一緒に表示したい場合、GUIContentクラスにまとめて指定することで表示ができる。他のコントローラ関数も同様。
・BOX
Labelと同じくテキストや画像を表示。背景画像に表示できるのが特徴。
・Button
ボタン背景付きのテキストや画像を表示。同時に画面上の、Rectクラスで指定したボタンエリアをクリックしたときにtrueを返す。
・RepeatButton
ボタンエリアを押下している間、常にtrueを返す。
・TextField
一行のテキスト入力欄を表示。引数には、入力欄に表示するテキストを指定。
戻り値には、常に入力欄の文字列を返す。
・TextArea
複数行のテキスト入力欄を表示。
・PasswordField
表示する文字列を指定した文字に全て置き換えてから表示。
string passwordFieldText = "PasswordField";
char maskChar = '*';
・Toggle
on/offのチェックボックス。引数で選択状態を指定。戻り値は現在の状態。
・Window
ポップアップウィンドウを表示。Window同士を識別ためのID番号とWindow内の表示
内容を書いたWindow関数が必要になる。GUI.DragWindow関数をWindow関数内で書くことで、そのWindowをドラッグ可能にすることができる。
int windowID = 0;
Rect windowRect = new Rect(10,10,300,100);
void OnGUI(){
windowrect = GUI.Window(windowID,windowRect,WindowFunction,"Window");
}
void WindowFunction(int window_ID){
GUI.DragWindow();
GUI.Label(new Rect(10,30,50,20),"Hello window");
}
ゲームルール
・一定時間が経過すると終了
・プレイヤーのHPが0になると終了
・ボスを倒すとゲームクリア
まずは一定時間
ゲームオーバーのフラグ、クリアを二つ用意。
Update関数内で残り時間を減算し、0以下になったらGameOver関数が呼ばれる。
public class GameRuleCtrl : MonoBehaviour {
// 残り時間
public float timeRemaining = 5.0f * 60.0f;
// ゲームオーバーフラグ
public bool gameOver = false;
// ゲームクリア
public bool gameClear = false;
void Update()
{
timeRemaining -= Time.deltaTime;
// 残り時間が無くなったらゲームオーバー
if(timeRemaining<= 0.0f ){
GameOver();
}
}
public void GameOver()
{
gameOver = true;
Debug.Log("GameOver");
}
public void GameClear()
{
gameClear = true;
Debug.Log("GameClear");
}
}
次にプレイヤーHP
プレイヤーのCtrlでDied関数で
gameRuleCtrl.GameOver();
を呼び出すようにする。
Bossを倒したら同じように・・・
void Died()
{
status.died = true;
dropItem();
Destroy(gameObject);
if (gameObject.tag == "Boss")
{
gameRuleCtrl.GameClear();
}
}
Died()をいじる。
敵のランダム出現
コルーチンを使い、最大出現数を設定。
2体発生させるオブジェクトを作成したとしたら、
そのオブジェクトを発生させたい場所に配置する。
マップ全体を把握して、配置させる方法もあるのかもしれませんが、
調べてみた所、これが簡単そうです。
public class EnemyGeneratorCtrl : MonoBehaviour {
//生まれてくる敵プレハブ
public GameObject enemyPrefab;
//敵を格納
GameObject[] existEnemys;
//アクティブ最大数
public int maxEnemy = 2;
// Use this for initialization
void Start () {
//配列確保
existEnemys = new GameObject[maxEnemy];
//周期的に実行したい場合はコルーチン
StartCoroutine (Exec());
}
//敵を作成する
IEnumerator Exec(){
while (true) {
Generate ();
yield return new WaitForSeconds (3.0f);
}
}
void Generate(){
for(int enemyCount = 0; enemyCount < existEnemys.Length; ++ enemyCount){
if(existEnemys[enemyCount] == null){
//敵を作成する
existEnemys[enemyCount] = Instantiate(enemyPrefab,transform.position,transform.rotation) as GameObject;
return;
}
}
}
コルーチン
・コルーチン
関数の途中で中断、再開できる仕組み。
yieldというキーワードで、中断させることができ、再開するときは
yieldの後から実行される。
・関数の戻り値はIEnumerator型である必要がある。
void update(){
"表示①"
//3秒待つ
"表示②"
//1フレーム待つ
"表示③"
//この関数の処理を終了する
}
この処理を実装する場合以下のようになる。
IEnumerator TestCoroutine(){
Debug.Log("表示①");
//3秒待機
yield return new WaitForSeconds(3.0f);
Debug.Log("表示②");
//次のフレームまで中断
yield return null;
Debug.Log("表示③");
//コルーチンを終了する
yield break;
Debug.Log("Message4");
}
アイテム生成③
・敵を倒した時に、敵がアイテムを落とすようにする。
// 複数のアイテムを入れれるように配列
public GameObject[] dropItemPrefab;
・アイテムを生成する関数
void dropItem()
{
if (dropItemPrefab.Length == 0) { return; }
GameObject dropItem = dropItemPrefab[Random.Range(0, dropItemPrefab.Length)];
Instantiate(dropItem, transform.position, Quaternion.identity);
}
アイテム生成②
・プレイヤーでのアイテム管理
攻撃強化アイテムは取得してから5秒間効果が続きますが、
回復アイテムは取った時に効果を発揮します。
public void GetItem(DropItem.ItemKind itemKind)
{
switch (itemKind)
{
case DropItem.ItemKind.Attack:
powerBoostTime = 5.0f;
break;
case DropItem.ItemKind.Heal:
// MaxHPの半分回復
HP = Mathf.Min(HP + MaxHP / 2, MaxHP);
break;
}
攻撃強化アイテムを取った時にpowerBoostTimeに効果時間を入力。
効果時間中はpowerBoostをtrueにしておく。
void Update()
{
powerBoost = false;
if (powerBoostTime > 0.0f)
{
powerBoost = true;
powerBoostTime = Mathf.Max(powerBoostTime - Time.deltaTime, 0.0f);
}
}
・Mathf.MinとMathf.Max
Min(a,b)はaとbの小さい方を返します。Maxは逆です。
HP = Mathf.Min(HP + MaxHP / 2.0f,MaxHP);
現在のHPに最大HPの半分を足した値がMaxHPを超えていれば、MaxHPを返す。
// 攻撃情報を取得する.
AttackInfo GetAttackInfo()
{
AttackInfo attackInfo = new AttackInfo();
// 攻撃力の計算.
attackInfo.attackPower = status.Power;
// 攻撃強化中
if (status.powerBoost)
attackInfo.attackPower += attackInfo.attackPower;
attackInfo.attacker = transform.root;
return attackInfo;
}