2014年03月07日

データのセーブとロード(unityC#)

 自分用の覚え書きです。

 プレイヤーが途中でゲームを止めたときに、その時点でのデータをセーブし、次回始めたとき続きからできるようにする方法です。こちらのサイト様を参考にさせてもらいました(というか、おんぶに抱っこですが)

 データはint,float,stringでできるようです。

<スクリプト>
 Empty Object(GameController)に以下のスクリプトをドロップします。
 レベルはプレイヤーが現在プレイしているレベルを変数に入れるようにすればOKかと思います。(下の例はStart()に入れているので保存する意味はないと思います)

using UnityEngine;
using System.Collections;

public class GameController : MonoBehaviour {
public int money  = 0;
public float timer = 0;
public string level;

void Awake ()
{
money = PlayerPrefs.GetInt("money");
timer = PlayerPrefs.GetFloat("timer");
level = PlayerPrefs.GetString("level");
}

void Start ()
{
level = "Level1";
PlayerPrefs.SetString("level",level);
}

void Update ()
{
timer += Time.deltaTime;
PlayerPrefs.SetFloat("timer",timer);
}

void OnGUI ()
{
if (GUI.Button(new Rect(5, 5, 100, 50), "+ 10$")) {
money +=10;
PlayerPrefs.SetInt("money", money);
}
if (GUI.Button(new Rect(5, 60, 100, 50), "Data Clear")) {
money = 0;
timer = 0;
PlayerPrefs.DeleteKey("money");
PlayerPrefs.DeleteKey("timer");
}
GUI.Label(new Rect(5, Screen.height/2 - 20, Screen.width-10, 50), "Level : "+level);
GUI.Label(new Rect(5, Screen.height/2 , Screen.width-10, 50), "Money : "+money + " $");
GUI.Label(new Rect(5, Screen.height/2+ 20, Screen.width-10, 50), "Time : "+timer);
}
}

<実行結果>
 +10$を押すと10$ずつ加算され、Data Clearを押すと、タイマーとお金がリセットされます。自動的に終了時点のデータが保存され、再開するとデータがロードされて続きから始められます。
1datahozondesu.jpg

<コマンドのことなど>
・ロード
 money = PlayerPrefs.GetInt("money");
 timer = PlayerPrefs.GetFloat("timer");
 level = PlayerPrefs.GetString("level");
・セーブ
 PlayerPrefs.SetInt("money", money);
 PlayerPrefs.SetFloat("timer",timer);
 PlayerPrefs.SetString("level",level);
・データクリアー
 PlayerPrefs.DeleteKey("money");

-----------------
 <ご注意>私自身が全くの超初心者ですので、文中まちがいがあるかも知れません。その際はご容赦をお願いします。<(_ _)>
posted by Shindo Izo at 17:38| Comment(0) | Unity3D マイマニュアル | 更新情報をチェックする

2014年03月05日

Unity マイプロダクト No.2

 2014年2月13日のブログに書いたマイプロジェクトNo.2、

 Rolling Ball

(玉転がしゲーム)が完成しました。

 もし、遊んでやろうと思っていただける、とても奇特な方がいらっしゃったら、こちらのサイトからどうぞ。

-----------------
ラベル:Unity3d
posted by Shindo Izo at 14:57| Comment(0) | Unity マイプロジェクト | 更新情報をチェックする

2014年02月15日

プレイヤー落下処理(unityC#)

 自分用の覚え書きです。

 プレイヤーがステージから落下した時、ゲームオーバーとし、指定したシーンからロードし直すようにしたい場合の方法です。 
 下の例は、ボール(プレイヤー)が落下してBox Colliderで検知して、ゲームオーバーと表示。指定秒後に最初から始まる、という設定です。

<落下検知用Box Colliderを用意する>
 1.Sphere作成、Playerとリネーム&リセット
 2.GUI Text作成、GameOver Textとリネーム&リセット後、適当な位置に移動
 3.Empty Object作成、Fall Outとリネーム&リセット。
 4.Fall OutのTransform設定(大きくして、下に下げた)
 5.Box ColliderのIs triggerにチェックを入れる
 6.Mesh Rendererのチェックを外すか、消去
 7.Add Compornentから、FallOutCatch.cs追加
1falloutcatchdesu.jpg

<FallOutCatch.csの内容>

using UnityEngine;
using System.Collections;

public class FallOutCatch : MonoBehaviour {

void OnTriggerExit(Collider other)
{
//Destroy(other.gameObject);//Player消去の場合
GameController.gameover = true; //ゲームオーバー
}
}

<ゲームオーバー表示とリスタートシステム作り>
 1.Empty Object作成後、リネーム&リセット
 2.Add Compornentから、GameController.cs追加
 3.GameOver TextをGameover Textにドロップ
2gameconttexttuki.jpg

<GameController.csの内容>

using UnityEngine;
using System.Collections;

public class GameController : MonoBehaviour {

public GUIText gameoverText; //ゲームオーバーテキスト
public static bool gameover; //ゲームオーバー判定用

void Start ()
{
gameoverText.text = ""; //←(初期化)必要!
gameover = false; //ゲームオーバーでない
}

void Update ()
{
//もしゲームオーバーなら
if (gameover)
{
gameoverText.text = "GAME OVER!"; //テキスト表示
Invoke("Restart", 5); //5秒後にRestart() 実行
print (""); //コンソールテキスト消去
}
}

//リスタート
void Restart ()
{
print ("Reload & Start!"); //コンソールにテキスト表示
Application.LoadLevel (Application.loadedLevel); //最後にロードしたシーンをリロード
}
}

 以上は自己流ですので、参考程度ということでお願いします。
-----------------
 <ご注意>私自身が全くの超初心者ですので、文中まちがいがあるかも知れません。その際はご容赦をお願いします。<(_ _)>
ラベル:Unity3d
posted by Shindo Izo at 17:50| Comment(0) | Unity3D マイマニュアル | 更新情報をチェックする

2014年02月14日

スコア、ハイスコアの保持(unityC#)

 自分用の覚え書きです。

 スコアやハイスコアを定義しても、シーンが変わるごとに初期化されてしまいます。そういうゲームならいいのですが、スコアをシーンを通して加算していく場合はダメです。
 色々考えたあげく、次の方法に落ち着きました。

<スコアを初期化させないようにする>
 スコアを処理するスクリプト(PlayerController.csなど)で、最初に、

 public static int score;

と宣言すると、シーンが変わっても初期化されません。ハイスコアも同じです。
 途中でリスタートしたり、ゲームオーバーになった場合は、スコアだけ初期化するスクリプト(score = 0;)を最初のシーンにだけ追加しておけば、スコアは0から始まり、ハイスコアはそのままですのでOKです。ハイスコアはプログラムが終了するまで保持されます。

 以上は自己流ですので、参考程度ということでお願いします。
-----------------
 <ご注意>私自身が全くの超初心者ですので、文中まちがいがあるかも知れません。その際はご容赦をお願いします。<(_ _)>
ラベル:Unity3d
posted by Shindo Izo at 12:10| Comment(0) | Unity3D マイマニュアル | 更新情報をチェックする

2014年02月13日

次の処理の前に時間待ちを入れる(unityC#)

 自分用の覚え書きです。

 次の処理の前にプレイヤーに時間待ちをさせるにはどうしたらいいか…。例えば、現在のレベルをクリアーして次のレベルに行く時、しばらくの時間クリアーと表示したい場合など。

 Invoke("呼び出す関数名",時間)

というコマンドが良さそうです。(時間は秒です)

void Update ()
{
  //省略
  //....
  //クリアーしたら、2秒後にLoadingLevel()に飛ぶ  
  if (clear)
  {
    Invoke("LoadingLevel", 2);
  }
}

void LoadingLevel ()
{
  Application.LoadLevel (level);
}

 ゲームオーバー画面などにも、メニュー画面に飛ぶ前に3秒入れるとか、に使えそうです。
-----------------
 <ご注意>私自身が全くの超初心者ですので、文中まちがいがあるかも知れません。その際はご容赦をお願いします。<(_ _)>
ラベル:Unity3d
posted by Shindo Izo at 21:26| Comment(2) | Unity3D マイマニュアル | 更新情報をチェックする

Unity マイプロジェクト No.2

 Unity ホームページのチュートリアルRoll-a-BallとSpace Shooterを終了しましたので、何とか自力でプロジェクトを作れないか、と始めています。
 と言っても何を始めていいのか分からないので、とりあえず、Roll-a-Ballを発展させていくことにしました。(いつか完全オリジナルを作ってみたいですが、当分先になるでしょう)
 ゲーム名は:

 Rolling Ball

というこれまたオリジナリティに欠ける名前です。日本名は、「ゴロゴロ玉」、ってこれまたつまらない名前です(笑)。

 5面まで作ろうと思っています。現在1、2面を作っている最中です。得点をどうするか、クリアしたら次のレベルに行くのにどうするか、ハイスコアのこととか、色々悩んでいる最中です。
 1面は、真四角から壁をぶち抜き、廊下を伝ってまた真四角に戻る感じのものです。ボールは、Unity Asset StoreからBall Packというのをダウンロードしました。

1level1nojyoutaidesu.jpg

 2面は、ステージは1面と全く同じなのですが、当たったら減点するトゲトゲボールを置いてみました。それに当たらないように得点を上げる難しさが加わりました。

2level2rollbadpickdesu.jpg

 こんな簡単なものでも、七転八倒してます。
 最後まで行ければいいんですが...
-----------------
ラベル:Unity3d
posted by Shindo Izo at 20:57| Comment(0) | Unity マイプロジェクト | 更新情報をチェックする

2014年02月12日

GUI Button を使う(C#)

 自分用の覚え書きです。

<終了ボタンとリスタートボタンを作る>
 終了ボタンは2DTextureを使い、リスタートボタンはGUI.Buttonを使いました。それらを四角のボックスで囲んでいます。
 もうひとつ同じものを画面右下に作っています。その場合、座標指定は、Screen.widthとScreen.heightを使うと便利です。
 下図は、Cubeが落ちるプログラム
1guibuttondessei.jpg

<手順>
 1.Empty GameObject作成後、GUI_Buttonsとリネーム&リセット。
 2.Add Componentから、GuiButtons.cs作成
 3.適当に作っておいた2DテクスチャーをIconにドロップ
2guibuttonsousane.jpg

<スクリプトの内容>

using UnityEngine;
using System.Collections;

//GUI Button を使う
public class GuiButtons : MonoBehaviour {

public Texture2D icon; //ボタンアイコン用2D画像

void OnGUI() {
//画面の左上にメニューを作る
GUI.Box (new Rect(10,10,100,90),"MENU");

if (GUI.Button(new Rect(30, 35, 60, 30), icon))
{
Application.Quit (); //アプリ終了
}
if (GUI.Button(new Rect(30,65, 60, 30), "Restart"))
{
Application.LoadLevel (Application.loadedLevel); //同じレベルを最初から
}

//画面の右下にメニューを作る
GUI.Box (new Rect(Screen.width - 110,Screen.height - 100,100,90),"MENU");

if (GUI.Button(new Rect(Screen.width - 90, Screen.height - 75, 60, 30), icon))
{
Application.Quit (); //アプリ終了
}
if (GUI.Button(new Rect(Screen.width - 90,Screen.height - 45, 60, 30), "Restart"))
{
Application.LoadLevel (Application.loadedLevel); //同じレベルを最初から
}
}
}

-----------------
 <ご注意>私自身が全くの超初心者ですので、文中まちがいがあるかも知れません。その際はご容赦をお願いします。<(_ _)>
ラベル:Unity3d
posted by Shindo Izo at 18:03| Comment(0) | Unity3D マイマニュアル | 更新情報をチェックする

2014年02月11日

スペースシューター作りの練習11

スペースシューター作りの練習11
 2014年1月22日〜2月2日にかけて書いた、Unity HP のチュートリアル II 1 〜 17を復習しています。

 今回は、17の続きです。敵機がPlayerに的を絞らせないような動きをさせる(回避戦術)スクリプトの追加です。

<新敵機と回避戦術スクリプトの追加>
 EnemyをEnemy1にリネーム後、複製してEnemy2とリネーム。Enemy2にEvasiveManeuver.cs追加します。数値は図のように設定。
1enemyevasivedesse.jpg

<落下物のサイズを増やす>
 GameController選択後、Hazards Sizeを4に変更。Element3にEnemy2をドロップ。

<回避戦術スクリプトEvasiveManeuver.cs>
 やはり、私のチープな頭では難しく、いいかげんな解釈ですふらふら

using UnityEngine;
using System.Collections;

//回避的戦術
public class EvasiveManeuver : MonoBehaviour
{
public Boundary boundary; //Boundary
public float tilt; //傾き角度
public float dodge; //身をかわす度合い
public float smoothing; //スムーズ(?)
public Vector2 startWait; //戦術前の待ち時間
public Vector2 maneuverTime; //戦術実行時間
public Vector2 maneuverWait; //戦術後待ち時間

private float currentSpeed; //現在速度
private float targetManeuver; //回避戦術ベクトル(X方向)

void Start ()
{
currentSpeed = rigidbody.velocity.z; //Z方向現在速度
StartCoroutine(Evade()); //Evade()へ
}

IEnumerator Evade ()
{
yield return new WaitForSeconds (Random.Range (startWait.x, startWait.y)); //戦術前待ち時間
while (true)
{
targetManeuver = Random.Range (1, dodge) * -Mathf.Sign (transform.position.x); //回避戦術ベクトル
yield return new WaitForSeconds (Random.Range (maneuverTime.x, maneuverTime.y)); //戦術実行時間
targetManeuver = 0; //初期化
yield return new WaitForSeconds (Random.Range (maneuverWait.x, maneuverWait.y)); //戦術後待ち時間
}
}

void FixedUpdate ()
{
float newManeuver = Mathf.MoveTowards (rigidbody.velocity.x, targetManeuver, smoothing * Time.deltaTime); //新ベクトル
rigidbody.velocity = new Vector3 (newManeuver, 0.0f, currentSpeed); //新速度(X方向移動)
//新ポジション設定(Boundaryによる縛りあり)
rigidbody.position = new Vector3
(
Mathf.Clamp(rigidbody.position.x, boundary.xMin, boundary.xMax), 
0.0f, 
Mathf.Clamp(rigidbody.position.z, boundary.zMin, boundary.zMax)
);

rigidbody.rotation = Quaternion.Euler (0, 0, rigidbody.velocity.x * -tilt); //Z軸回転(機体を傾ける)
}
}

<コマンドのことなど>
・yield return new WaitForSeconds (Random.Range (a, b)) … aからbの間のランダムな秒数時間待ち
・Mathf.Sign(数値) … sinの値を返す ※後の追記:「Mathf.Sign(a)は、aが正か0の時1を返し、負の時は-1を返す」の間違いでした。
  三角関数のSinの場合は、Mathf.Sin(a) です。<(_ _)>
・Mathf.MoveTowards … よく分かりませんが、Referenceでは、

 static float MoveTowards(float current, float target, float maxDelta);
  ----------
  Parameters
   current The current value.
   target The value to move towards.
   maxDelta The maximum change that should be applied to the value.
  ----------

とあります。現在の値から最大変化値で目指す値に向かう時の値(意味が分かりませんが)、ってかんじでしょうか。分かったような分からないような感じです。

 以上は私の勝手な解釈です。間違っている可能性大ですので、参考程度でお願いします。

 で、プレイしてみると、とても難しく、すぐやられてしまいます。難易度高過ぎ!
 とにかく、最後まで行きました。
-----------------
 <ご注意>私自身が全くの超初心者ですので、文中まちがいがあるかも知れません。その際はご容赦をお願いします。<(_ _)>
posted by Shindo Izo at 11:34| Comment(0) | Unity3Dの練習 Part II | 更新情報をチェックする

2014年02月10日

スペースシューター作りの練習10

 2014年1月22日〜2月2日にかけて書いた、Unity HP のチュートリアル II 1 〜 17を復習しています。

 今回は、17の続きです。敵機とロックがランダムに出てくるようにします。チュートリアルでは3種類のアステロイドと敵機の合計4つがランダムに落ちてきますが、あと2つ作る元気がないので、ロックを複製してそれを縮小し、RockSとしました。
 ですので、3種類がランダムに落ちてくるようにします。
 まず、前回作ったEnemyをPrefab化して、Hirarchyの方は削除しておきます。

<3種類の落下物が出てくるようにする>
 1.GameController選択
 2.GameController.csを加筆
 3.Sizeを3にし、Element0〜Element2に対して、それぞれRock, RockS, Enemyをドロップする(順番は関係ありません)
1gamecontrock2enemysa.jpg

<GameController.csの加筆部分>

using UnityEngine;
using System.Collections;

public class GameController : MonoBehaviour
{
public GameObject[] hazards; //配列hazards
//
//省略
//
IEnumerator SpawnWaves ()
{
yield return new WaitForSeconds (startWait);
while (true)
{
for (int i = 0; i < hazardCount; i++)
{
//hazardにhazards[]内のどれかをランダムに代入
GameObject hazard = hazards [Random.Range(0, hazards.Length)];
//省略
//
}
//
//省略
}
}
//
//省略
}

<とりあえず完成図>
2chokusenenermydesu.jpg

<コマンドのことなど>
・配列のこと
 上の場合、GameObject[] hazards で、配列hazardsの宣言になるのでしょう。あとは、Inspectorでサイズを決め、その数分ドロップすればいいようです。
 使うときは、hazards[配列番号]でOKのようです。
・Randam.Range(a,b) … a〜bの間のランダムな数を返す、でしょう。

 以上は私の勝手な解釈なので、間違っている可能性ありです。参考程度でお願いします。

 とりあえず完成なんですが、今のままだと敵機が直線で落ちてくるだけです。(でも、これだけでも大変ゲームとしては難しくなっていますが)
 チュートリアルでは、変速の動きをするスクリプトがくっついています。ちょっと見たところ難しそうなので後回しにしました。
 次回、それにトライしてみたいと思います。(ひょっとしたらサッパリ分からない可能性もありますが...)
-----------------
 <ご注意>私自身が全くの超初心者ですので、文中まちがいがあるかも知れません。その際はご容赦をお願いします。<(_ _)>
posted by Shindo Izo at 21:31| Comment(0) | Unity3Dの練習 Part II | 更新情報をチェックする

スペースシューター作りの練習9

 2014年1月22日〜2月2日にかけて書いた、Unity HP のチュートリアル II 1 〜 17を復習しています。

 今回は、17の途中までやりました。敵弾と発射システムの製作です。この辺りはややこしく、頭が混乱してます。

<敵弾作り>
 やはり、Playerの弾を作ったときの要領でやってみました。

 1.Playerの弾と同じように、Missle_Pictureを作り、それをEnemyMissile(Empty Object)の中に入れ、それをさらにShotSpawn(Empty Object)に入れます。
 2.EnemyMissileを選択後、Rigidbody, Capsule Collider, Mover.cs,  DestroyByContact.csを追加します
 3.MoverのSpeedを-20に設定、DestroyByContact.csのPlayer Explosionにexplosion_playerをドロップします
 4.EnemyMissileをPrefab化しておきます。
1enemyshotdesu.jpg

<敵弾発射システム作り>
 1.Enemy選択
 2.WeaponController.csを追加
 3.Shot, ShotSpawn, FireRate, Deley に、それぞれEnemyMissile, ShowSpawn, 1.5, 0.5を入れます。
 4.Weapon_enemy(サウンド)を追加します。
2weaponcontdesu.jpg

<WeaponController.cs>

using UnityEngine;
using System.Collections;

public class Done_WeaponController : MonoBehaviour
{
public GameObject shot; //弾
public Transform shotSpawn; //発射点
public float fireRate; //発射間隔
public float delay; //遅延時間

void Start ()
{
//間隔fireRate秒、遅延時間delay秒でFireを繰り返し実行する
InvokeRepeating ("Fire", delay, fireRate);
}

void Fire ()
{
Instantiate(shot, shotSpawn.position, shotSpawn.rotation); //弾発射
audio.Play(); //発射音
}
}
 
<コマンドのことなど>
・InvokeRepeating ("関数名〜", a, b); … 遅延時間a秒、作動間隔b秒で"関数名〜"(上の場合、Fire() )を繰り返し実行せよ、といった意味ではないかと思われます。遅延時間は作動するときに遅れを作るものかと思われます。

 以上は私の勝手な解釈なので、間違っている可能性ありです。参考程度でお願いします。

 複雑で頭がパンクしそう...ふらふら
 つづく...
-----------------
 <ご注意>私自身が全くの超初心者ですので、文中まちがいがあるかも知れません。その際はご容赦をお願いします。<(_ _)>
posted by Shindo Izo at 17:39| Comment(0) | Unity3Dの練習 Part II | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。