プログラム研究 備忘録

java,C#,Unity等の備忘録です。経済理論も少し。

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

}

 

yield キーワードを使用した場合、メソッド演算子、または get アクセサーが反復子であることを示する。

アイテム生成③

・敵を倒した時に、敵がアイテムを落とすようにする。

 

// 複数のアイテムを入れれるように配列
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;
}