2014年02月01日

Unity HP のチュートリアル II 15

 続きです。
 今回は、

 Ending the game

を見ました。自機ロケットが破壊されたとき、ゲームオーバーを表示し、同時にリスタートを促す文を表示したあと、リスタートボタンが押されると最初からゲームをやりなおせるようにするスクリプト作成でした。

<Restart用GUITextの作成>
 1.Empty Object作成後、Display Textとリネーム&リセット。
 2.前回作ったScore Text(前回リネームするのを忘れていました)をDiplay Textにドロップ
 3.GUI Text作成後、Restart Textとリネーム&リセットし、Diplay Textにドロップ
 4.Transform Position をx=1,y=1に変更
 5.TextをRestart Text、Anchorをupper right、Alignmentをright、Pixel Offsetをx=-10,y=-10に変更
 6.Font Sizeを20に変更
1restarttexthoka.jpg

<ゲームオーバー用GUI Textの作成>
 1.Empty Object作成後、Game Over Textとリネーム&リセット。
 2.Transform Position をx=0.5,y=0.6に変更
 3.TextをGame Over Text、Anchorをmiddle center、Alignmentをcenterに変更
 4.Font Sizeを25に変更
2gameovehokasa.jpg

<ゲームオーバー時のリスタートできるようにスクリプト加筆>
 1.GameController選択
 2.GameController.csをEdit (加筆、内容はunityHPにあります)
 3.4.Restart Text、Game Over Textをそれぞれインスペクター内の変数にドロップ
3gamaoverrestadesse.jpg

<自機破壊時にゲームオーバーするようにスクリプト加筆>
 1.Asteroid Prefab選択
 2.DestroyByContact.csをedit(加筆。内容はunityHPにあります)
4asteroidspshuuseisa.jpg

 隕石に当たると自機が爆発し、ゲームオーバー、同時にRestartできるようになりました。
-----------------
 <ご注意>私自身が全くの超初心者ですので、文中まちがいがあるかも知れません。その際はご容赦をお願いします。<(_ _)>
posted by Shindo Izo at 16:13| Comment(0) | Unityのお勉強 Part II | 更新情報をチェックする

2014年02月02日

Unity HP のチュートリアル II 16

 続きです。
 今回は、

 Building the game


を見ましたが、Buildは何度もやりましたし、新しい情報もないので省略します。

<Unity HP チュートリアルをやってみて>
 Project:Roll-a-Ball とProject:Space Shooterをやり終わりました。大変勉強になりました。と同時に、「難しいなぁ...」とも思いました。手続きというか、式の立て方が全然分からないのです。
 私の場合、誰かの書いたものをちょこちょこといじるぐらいしかできそうにありませんふらふら


 さて、HPでは完成ということなのですが、隕石をひたすら破壊するだけのゲームなんてちょっとつまらないなぁと思っていたら、完成形が同梱されてました。
 Projectウィンドウの中のDoneフォルダに完成されたものが入っています。その中のSceneフォルダ内Mainをダブルクリックすれば完成形の画面になります。
 グエッ、かっこいい!3種類の隕石が落ちてくるうえに、エイリアン(インベーダー?)がひらひらしながら落ちてきます。しかも、バックがスムーズに流れていく。
 これは相当難しそうだなぁ、と思ってスクリプトを見たら、やはりムズイ。
 ただ完成形を遊ぶだけではつまらないので、練習も兼ねて手作業でやってみたいと思います。と言ってもスクリプト、パーティクルの方は全然分からないのでそのまんまコピペするしか出来ないんですが...。

<流れていくバックを作る1>
 1.2.Backgroundを複製し、Transform Positionをz=-30に変更
 3.Done>Done_Scripts内のDone_BGScroller.csを複製元のBackgroundにドロップ
 4.複製したBackgroundを複製元のBackgroundにドロップ
1backduplicatesa.jpg

<流れていくバックを作る2>
 Background(親)選択
 2.Done_BGScroller.csの、Scroll Speedを-0.25、Tile Size Zを30に変更
2bgscrollersettei.jpg

<流れていくバックを作る3>
 Prefabs>VFX>Starfield内のStarField PrefabをHierarychyにドロップ
3starfieldsane.jpg

 巨大な宇宙と星々が少しずつ流れていくようになりました。
-----------------
 <ご注意>私自身が全くの超初心者ですので、文中まちがいがあるかも知れません。その際はご容赦をお願いします。<(_ _)>
posted by Shindo Izo at 16:23| Comment(0) | Unityのお勉強 Part II | 更新情報をチェックする

Unity HP のチュートリアル II 17

 続きです。
 今回は、3つのアステロイドと敵機が落ちてくるようにします。

<GameControllerの変更>
 1.GameController選択
 2.GameController.csをDone_GameController.csに変更
 3.GameController.csをEdit、加筆修正
 4.Hazardsのサイズを4に変更
 5.Done>Done_Prefabs内のDone_Asteroid 01 PrefabをElement0にドロップ
 6.Done>Done_Prefabs内のDone_Asteroid 02 PrefabをElement1にドロップ
 7.Done>Done_Prefabs内のDone_Asteroid 03 PrefabをElement2にドロップ
 8.Done>Done_Prefabs内のDone_Enemy Ship PrefabをElement3にドロップ
1gameconthenkoudesu.jpg

<スクリプト変更内容>
 緑字が変更、加筆部分です。

using UnityEngine;
using System.Collections;

public class GameController : MonoBehaviour
{
public GameObject[] hazards; //Changed
public Vector3 spawnValues;
public int hazardCount;
public float spawnWait;
public float startWait;
public float waveWait;

      ・
      ・(途中省略)
      ・
      ・

IEnumerator SpawnWaves ()
{
yield return new WaitForSeconds(startWait);
while (true)
{
for (int i=0; i < hazardCount; i++)
{
GameObject hazard = hazards [Random.Range (0, hazards.Length)]; //Add
Vector3 spawnPosition = new Vector3 (Random.Range (-spawnValues.x, spawnValues.x), spawnValues.y, spawnValues.z);
Quaternion spawnRotation = Quaternion.identity;
Instantiate (hazard, spawnPosition, spawnRotation);
yield return new WaitForSeconds (spawnWait);
}

      ・(以下省略)
      ・
      ・
      ・

 で、完成です。

<今後の発展>
 1面、2面と進むうちに段々攻撃が激しくなってくるようにできると面白くなりそう。下から(あるいは横から)エイリアンが攻撃してくるとか...。最後に巨大ボスエイリアンが出てきて猛烈な攻撃が始まるとか...。
 夢のまた夢かも知れませんが...。

 とにかく、隕石とエイリアンがランダムに落ちてくるようになりました。
    おしまい...眠い(睡眠)
-----------------
 <ご注意>私自身が全くの超初心者ですので、文中まちがいがあるかも知れません。その際はご容赦をお願いします。<(_ _)>
posted by Shindo Izo at 18:13| Comment(0) | Unityのお勉強 Part II | 更新情報をチェックする

2014年02月04日

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

 Unity ホームページのチュートリアルプロジェクト:Space Shooterをやり終えましたが、いざ自分用の何か作りたいなぁと思っても、なーーんにも浮かんできませんがく〜(落胆した顔)
 そこで、もう一度最初から復習することにしました。自分の書いたブログをもう一度たどってみようと思います。(2014年1月22日〜2月2日にかけて書いた、Unity HP のチュートリアル II 1 〜 17)

 今回は、1 〜 3 までやりました。ビルドして画面の大きさを決め、プレーヤーのロケットを作り、ライティングまでです。
 ロケットはUnityの基本図形で作りました。

<マイロケットを作る>
 基本図形でロケットの形を作り、それをEmpty Objectに入れ子にしました。各Colliderは削除し、親の方にCapsule Colliderをつけました(これでうまく行くか分からないのですが、やってみます)。それと、Rigidbody(重力抜き)も追加しました。
 ロケットの噴射炎は、Particle Systemをデフォルトの状態からいじくり回して作りました。白とオレンジを二つ作り重ねました。Particle Systemは使い方がほとんど分からないので、何の方針もなくただいじくり倒した結果です。
 あとは適当にMaterialを追加しました。
1myrocketseisakudesu.jpg

<ライティングして完成>
 ライティングはチュートリアルのままです。
 そして、プレイした結果が:
2myrocketdesunen.jpg

 ださーいロケットのできあがり。
 この先うまく行くかどうか分かりませんが、できるだけやってみます。
-----------------
 <ご注意>私自身が全くの超初心者ですので、文中まちがいがあるかも知れません。その際はご容赦をお願いします。<(_ _)>
posted by Shindo Izo at 21:37| Comment(0) | Unity3Dの練習 Part II | 更新情報をチェックする

2014年02月05日

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

 2014年1月22日〜2月2日にかけてブログに書いた、Unity HP のチュートリアル II 1 〜 17を復習しています。
 今回は、4 〜 5 までやりました。バックを作り、プレイヤー(マイロケット)が上下左右に動けるようにスクリプトをつけます。

<バックを作る>
 512×1024の絵を用意し、それをQuadに貼り付けました。
1uchuubaccksaa.jpg

<プレイヤームーブスクリプト追加>
 スクリプトを書いてPlayer(マイロケット)に追加しました。
 スクリプトの意味を自分なりに考えてみました。(まちがっているかも知れません)

using UnityEngine;
using System.Collections;

//x軸、z軸方向の最大値、最小値をインスペクタ内サブプロパティに持つクラス
[System.Serializable]
public class Boundary
{
    public float xMin, xMax, zMin, zMax;
}

public class PlayerController : MonoBehaviour
{
    public float speed; //ロケットの動くスピード
    public float tilt; //ロケットのz軸回転角
    public Boundary boundary;

    void FixedUpdate ()
    {
        //↑↓←→キーにより動く量を決める
        float moveHorizontal = Input.GetAxis ("Horizontal");
        float moveVertical = Input.GetAxis ("Vertical");

        Vector3 movement = new Vector3 (moveHorizontal, 0.0f, moveVertical);
        rigidbody.velocity = movement * speed;

        //x方向、z方向の縛りを入れて位置を指定する
        rigidbody.position = new Vector3 
        (
            Mathf.Clamp (rigidbody.position.x, boundary.xMin, boundary.xMax), 
            0.0f, 
            Mathf.Clamp (rigidbody.position.z, boundary.zMin, boundary.zMax)
        );
//z軸回転角の指定
        rigidbody.rotation = Quaternion.Euler (0.0f, 0.0f, rigidbody.velocity.x * -tilt);
    }
}

<コマンドのことなど>
・Input.GetAxis("〜") は括弧内のキーアクションを受け入れる
・Mathf.Clamp(a,mina,maxa)はaの値をminaとmaxaの間に縛る
・Quaternion.Euler(x,y,z)はx軸、y軸、z軸の回転

 Referenceを読んでもよく分からないので、私の勝手な解釈です。
-----------------
 <ご注意>私自身が全くの超初心者ですので、文中まちがいがあるかも知れません。その際はご容赦をお願いします。<(_ _)>
posted by Shindo Izo at 16:31| Comment(0) | Unity3Dの練習 Part II | 更新情報をチェックする

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

 2014年1月22日〜2月2日にかけて書いた、Unity HP のチュートリアル II 1 〜 17を復習しています。
 今回は、6 〜 7 までやりました。プレイヤーが発射する弾作りと発射システム作りです。

<弾を作る>
 128×128ドットの大きさの中に弾っぽいものを描き、pngファイルで保存して作りました。(弾と言うより花火に近いような...)それに弾を動かすスクリプトを付加。
1mymissyledennen.jpg

<弾を動かすスクリプト>

 速度を指定して物体を前に進める、といった内容だと思います。

using UnityEngine;
using System.Collections;

public class Mover : MonoBehaviour
{
    public float speed; 

    void Start ()
    {
        rigidbody.velocity = transform.forward * speed;
          //物体の速度指定
    }
}

<弾発射システムのスクリプトを加筆>
 PlayerController.csに加筆し、弾産み出し点やPrefab化した弾をドロップしました。
 スクリプトの意味を自分なりに考えてみました。(まちがっているかも知れません)

public GameObject shot; //弾
public Transform shotSpawn; //弾産み出しポイント
public float fireRate; //待ち時間

private float nextFire; //次撃つことができる経過時間

void Update ()
{
if (Input.GetButton("Fire1") && Time.time > nextFire)
 //Fire1ボタン(Ctrlキー)が押されて、かつnextFireより経過時間が多かったら
{
nextFire = Time.time + fireRate; //nextFjre=経過時間+FireRate
Instantiate(shot, shotSpawn.position, shotSpawn.rotation);
 //shotSpawnの位置、角度でshotを産み出す
}
}

<結果>
 弾を発射できるようになりました。花火ですね...ふらふら
2mymissilerennsha.jpg

<コマンドのことなど>
・rigidbody.velocity = transform.forward * speed … speedで指定された速度で物体を前進させる。
・Input.GetButton("〜") … 括弧内のボタンが押されていれば真を返す
・Time.time … 経過時間
・Instantiate(A, B.position, B.rotation) … Bの位置、角度でAを産み出す

 私の勝手な解釈なので、間違っている可能性ありです。
-----------------
 <ご注意>私自身が全くの超初心者ですので、文中まちがいがあるかも知れません。その際はご容赦をお願いします。<(_ _)>
posted by Shindo Izo at 18:07| Comment(0) | Unity3Dの練習 Part II | 更新情報をチェックする

2014年02月06日

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

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

<Box Colliderに触れたらオブジェクトを消去するシステム>
 CubeからMesh Renderer,Mesh Filterを取り去りBox Colliderだけで範囲を指定します。そして、Colliderに触れたら消去するスクリプトを追加します。ほっとおくとオブジェクトが大量になってしまうので、その対策です。

<オブジェクト消去スクリプト>

using UnityEngine;
using System.Collections;

public class DestroyByBoundary : MonoBehaviour
{
//接触検知システム
void OnTriggerExit(Collider other)
{
Destroy(other.gameObject); //破壊(消去)
}
}

<ロック(アステロイド風)の製作>
 Capsuleを3つ作り、それぞれを120度ずつ捻り、Scaleを適当にいじりました。それに岩風なテクスチャーを貼り付けました。(アステロイドにはほど遠いので、ロックです)
1rockdukuridesu.jpg

<ロックにスクリプト(回転、前進、爆発)追加>
 ロックをランダムに回転させるスクリプト(RandomRotator.cs)、上から落ちてくるようにするスクリプト(Mover.cs)、ぶつかったら破壊するスクリプトを追加します。
 さらに、explosion_asteroid,explosion_playerをチュートリアル内からインポートし、それぞれの変数にドロップします。
2rockscriptbakuhatu.jpg

<ランダムに回転させるスクリプト>

using UnityEngine;
using System.Collections;

public class RandomRotator : MonoBehaviour
{
    public float tumble; //回転数

    void Start ()
    {
        rigidbody.angularVelocity = Random.insideUnitSphere * tumble;
 //回転させる 
    }
}

<ぶつかったら破壊するスクリプト>

using UnityEngine;
using System.Collections;

public class DestroyByContact : MonoBehaviour
{
public GameObject explosion; //爆発パーティクル用
public GameObject playerExplosion; //Player爆発パーティクル用

//もしColliderに当たったら以下処理
void OnTriggerEnter(Collider other) 
{
//もしそれがBoundaryならリターン
if (other.tag == "Boundary")
{
return;
}

Instantiate(explosion, transform.position, transform.rotation); //爆発

//もしそれがPlayerなら、player用の爆発
if (other.tag == "Player")
{
Instantiate(playerExplosion, other.transform.position, other.transform.rotation);

}
Destroy(other.gameObject); //当たったものを消去
Destroy(gameObject); //自身を消去
}
}

<パーティクルを一定時間後消去するスクリプト>
 爆発のパーティクルが演算処理にかける負荷対策(だと思います)

using UnityEngine;
using System.Collections;

public class DestroyByTime : MonoBehaviour
{
public float lifetime; //生存時間(秒)

void Start ()
{
Destroy (gameObject, lifetime); //gameObjectをlifetime秒後に消去
}
}

<コマンドのことなど>
・void OnTriggerExit(Collider other){ 〜 } … Colliderに触れた物体は〜する
・Destroy(〜) … 破壊する(消去)
・rigidbody.angularVelocity = Random.insideUnitSphere … ランダムに決めた角速度で回転させる
・OnTriggerEnter(Collider other) … 何かにぶつかったら以下処理する
・Destroy (gameObject,lifeTime) … gameObjectをlifeTime秒後に消去

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

 ExplosionとPlayer Explosionは、チュートリアルのものをそのままドロップするとうまく行きませんでした。それを何とかしたいと思いますが、長くなるので次回にそれをやってみたいと思います。
 しかし、うまく行かないかも知れません。その場合自分で爆発パーティクルを作らないといけないのですが難しそうです...。パーティクルはさっぱり分かりません。
-----------------
 <ご注意>私自身が全くの超初心者ですので、文中まちがいがあるかも知れません。その際はご容赦をお願いします。<(_ _)>
posted by Shindo Izo at 18:43| Comment(0) | Unity3Dの練習 Part II | 更新情報をチェックする

2014年02月07日

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

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

 前回、ExplosionとPlayer Explosionをチュートリアルから持ってくるのに失敗したのですが、Prefabだけ持ってきたのでMaterialが抜け落ちていたのが原因でした。しょうがないので、チュートリアルを見ながらそれぞれにドロップしていくとうまく爆発してくれました。
 最初にMaterial,Texture,Prefabを丸ごとコピーすれば良かったのかも知れません。
1explosionmaterialdana.jpg

 さて、今回は、11 〜 13 までやりました。GameControllerの作成とオーディオ添付です。

<GameControllerの作成>
 GameControllerは何をやっているのか:

 1.障害物(アステロイド、敵など)を動かす
 2.障害物(アステロイド、敵など)の出没コントロール
 3.障害物(アステロイド、敵など)とPlayerとの接触、被弾、爆発
 4.スコア表示
 5.ゲームオーバー時の表示、選択など

で、しょうか。この辺が私にとっては頭が混乱するゾーンです。

<GameControllerのスクリプトの分析>
 スクリプトのことは全然分からないので以下、分析というより推測です。

using UnityEngine;
using System.Collections;

public class GameController : MonoBehaviour
{
public GameObject hazard; //産出するもの(ロック用)
public Vector3 spawnValues; //ロックの出発地点
public int hazardCount; //一回に産出するロックの数
public float spawnWait; //産み出し間隔(時間)
public float startWait; //最初の産み出し待ち時間
public float waveWait; //前回の産出終了と次の開始までの時間

void Start ()
{
StartCoroutine (SpawnWaves ());
}

IEnumerator SpawnWaves ()
{
yield return new WaitForSeconds (startWait); //starWait秒待つ

//繰り返す(永遠に??)
while (true)
{
//hazardCount回繰り返す
for (int i = 0; i < hazardCount; i++)
{
Vector3 spawnPosition = new Vector3 (Random.Range (-spawnValues.x, spawnValues.x), spawnValues.y, spawnValues.z); //spawnPosition(産出点)を決める
Quaternion spawnRotation = Quaternion.identity; //回転しない
Instantiate (hazard, spawnPosition, spawnRotation); //産出点(spawnPosition)にhazardを産み出す
yield return new WaitForSeconds (spawnWait); //spawnWait秒待つ
}
yield return new WaitForSeconds (waveWait); //waveWait秒待つ
}
}
}

 while (true){ 〜 }はよく分からないのですが、falseになるまで繰り返すものと思われます。でも、いつfalseになるのか分かりません。

<オーディオを添付>
 GameControllerにBGM、Playerに弾発射音、ロックに爆発音を添付後、スクリプトに加筆

<コマンドのことなど>
・StartCoroutine(〜)、IEnumerator 〜 の辺りはよく分かりません。
・yield return new WaitForSeconds (秒数) … 括弧内の時間ウェイトを入れるようです。
・Random.Range(a,b) … aとbの間のランダムな数値を返す、でしょう。
・Quaternion 〜Rotation = Quaternion.identity … 回転しない(そのまま)という場合に使うもののようです。
・audio.Play () … Audio Souceを再生する

 以上は私の勝手な解釈なので、間違っている可能性ありです。参考程度でお願いします。
-----------------
 <ご注意>私自身が全くの超初心者ですので、文中まちがいがあるかも知れません。その際はご容赦をお願いします。<(_ _)>
posted by Shindo Izo at 17:46| Comment(0) | Unity3Dの練習 Part II | 更新情報をチェックする

2014年02月08日

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

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

 今回は、14 をやりました。ロックを破壊したときの加点システム作りとスコアーの表示です。

<GUI Textを使ってスコアを表示するシステム作り>
 GameControllerに加点システムを作り、Rockの方には破壊されたときにGameControllerの加点システムに加点するように指示するシステムを作ります。

<GameController.csへの加筆>

using UnityEngine;
using System.Collections;

public class GameController : MonoBehaviour
{

public GUIText scoreText; //GUI Text
private int score; //スコア

void Start ()
{
score = 0; //スコア初期化
UpdateScore (); //スコア表示システムへ
//省略
}

//...
//省略
//...

//スコア加点システム
public void AddScore (int newScoreValue)
{
score += newScoreValue; //スコア加点
UpdateScore (); //スコア表示システムへ
}

//スコア表示システム
void UpdateScore ()
{
scoreText.text = "Score: " + score; //GUITextにスコア表示
}

<DestroyByContact.csへの加筆>

using UnityEngine;
using System.Collections;

public class DestroyByContact : MonoBehaviour
{
// 省略
//
public int scoreValue; //スコアの値
private GameController gameController; //GameController

void Start ()
{
//GameController(タグ)がなかったときのエラー処理(だと思います)
GameObject gameControllerObject = GameObject.FindWithTag ("GameController");
if (gameControllerObject != null)
{
gameController = gameControllerObject.GetComponent <GameController>();
}
if (gameController == null)
{
Debug.Log ("Cannot find 'GameController' script");
}
}

void OnTriggerEnter(Collider other) 
{
//
// 省略
//
//
 
gameController.AddScore (scoreValue); //GameController.cs内の加点システム呼び出し
//
// 省略
}
}

 エラー処理の辺りは何だかよく分かりません。
 以上は私の勝手な解釈なので、間違っている可能性ありです。参考程度でお願いします。
-----------------
 <ご注意>私自身が全くの超初心者ですので、文中まちがいがあるかも知れません。その際はご容赦をお願いします。<(_ _)>
posted by Shindo Izo at 10:56| Comment(0) | Unity3Dの練習 Part II | 更新情報をチェックする

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

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

 今回は、15 をやりました。ゲームオーバー時の処理です。

<ゲームオーバー時の処理スクリプト加筆>

using UnityEngine;
using System.Collections;

public class GameController : MonoBehaviour
{
//省略

public GUIText restartText; //リスタート用
public GUIText gameOverText; //ゲームオーバー用

private bool gameOver; //ゲームオーバー用
private bool restart; //リスタート用

//省略

void Start ()
{
//初期化
gameOver = false;
restart = false;
restartText.text = "";
gameOverText.text = "";

//省略
}

void Update ()
{
//restartが真なら以下処理
if (restart)
{
//Rキーが押されたら以下処理
if (Input.GetKeyDown (KeyCode.R))
{
//最後にロードしたレベルをロードする
Application.LoadLevel (Application.loadedLevel);
}
}
}

IEnumerator SpawnWaves ()
{

//省略

while (true)
{

//省略

//もしgameOverが真なら以下処理
if (gameOver)
{
restartText.text = "Press 'R' for Restart"; //リスタート用テキスト
restart = true; //restartを真に
break; //whileループを抜ける
}
}
}

//省略

//ゲームオーバー
 //DestroyByContact.csからPlayerと衝突した時呼び出される
public void GameOver ()
{
gameOverText.text = "Game Over!"; ゲームオーバー用テキスト
gameOver = true; //gameOverを真に
}
}

<コマンドのことなど>
・Input.GetKeyDown (KeyCode.〜) … 〜(KeyCode)が押されたら真を返す。KeyCode表はこちらにあります。

・Application.LoadLevel (Application.loadedLevel) … 最後にロードされたレベルを最初からロードする。つまり、そのレベルのリセットですね。

 上の二つは大変重要ですね。ゲーム作りには必須ですね。

 以上は私の勝手な解釈なので、間違っている可能性ありです。参考程度でお願いします。
-----------------
 <ご注意>私自身が全くの超初心者ですので、文中まちがいがあるかも知れません。その際はご容赦をお願いします。<(_ _)>
posted by Shindo Izo at 13:27| Comment(0) | Unity3Dの練習 Part II | 更新情報をチェックする

2014年02月09日

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

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

 今回は、16 〜 17の途中まで をやりました。流れるバックスクリーンと敵の作成です。

<流れるバックスクリーンの製作>
 StarFieldは理解するのが大変そうなので、チュートリアルのままコピーしました。また別の機会に勉強したいと思っています。

<流れるバックスクリーンのスクリプト>

using UnityEngine;
using System.Collections;

public class BGScroller : MonoBehaviour
{
public float scrollSpeed; //スクロールスピード
public float tileSizeZ; //スクロールするz方向の大きさ(?)

private Vector3 startPosition; //スクリーンスタート位置

void Start ()
{
startPosition = transform.position; //スクロール開始のスクリーン位置
}

void Update ()
{
float newPosition = Mathf.Repeat(Time.time * scrollSpeed, tileSizeZ); //相対的新スクリーン位置
transform.position = startPosition + Vector3.forward * newPosition; //新スクリーン位置
}
}

<敵機の作成1>
 Unityの基本図形を組み合わせて作ってみました。パーティクル(エンジン噴射)はPlayerで作ったものを色を変えたりして作りました。エイリアンなので怪しい雰囲気が出たかな(?)。
1meenermydesu.jpg

<敵機の作成2>
 Player(自機)を作成したときと同じパターンでやってみました。とりあえず、Rigidbody,Capsule Collider,Mover.cs,DestroyByContact.csをくっつけました。爆発のパーティクルはチュートリアルのものをくっつけました。(エラーが出ます。原因はスクリプトがない、ということのようです。スクリプトなどどこにもないので、プロテクトなのでしょうか、それとも私のミスなのかな...??? プレーヤーと同じパーティクルなら出ませんが)
2myenemyscripttukidesu.jpg

<DestroyByContact.cs加筆>

using UnityEngine;
using System.Collections;

public class DestroyByContact : MonoBehaviour
{
//
//省略
//

void OnTriggerEnter(Collider other) 
{
//相手がBoundaryかEnemyなら何もしない
if (other.tag == "Boundary" || other.tag == "Enemy")
{
return;
}
//explosionがnullでなかったら爆発(よく意味がわかりません)
if (explosion != null)
{
Instantiate(explosion, transform.position, transform.rotation);
}
//
//省略
//
}
}

<コマンドのことなど>
・float newPosition = Mathf.Repeat(単位時間スクロール距離, スクロール総距離) … スクロール総距離を、指定した単位時間距離分スクロールすることを繰り返す、だと思います(多分)。

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

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

2014年02月10日

スペースシューター作りの練習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 | 更新情報をチェックする

スペースシューター作りの練習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 | 更新情報をチェックする

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月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月13日

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 マイプロジェクト | 更新情報をチェックする

次の処理の前に時間待ちを入れる(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 マイマニュアル | 更新情報をチェックする

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月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 マイマニュアル | 更新情報をチェックする

広告


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

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

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