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年04月28日

戦車ゲームが作りたい1

 戦車ゲームが作りたいと思っていますが…。

 何分スクリプトに自信がないので、ある程度の形にできるかどうか分かりませんがトライしてみたいと思います。(練習ですのでモデルなどは雑です)

 今日は、本体製作と前後左右に動くようにしてみたいと思います。

<戦車作成と動きのコントロール>
 1.地面の製作…テラインにチェックのテクスチャーを貼り、適当にモコモコさせました。(練習なので雑)
 2.胴体と頭と砲身の製作…設置後、それらのColliderを全て削除しました。(これも練習なので雑)
 3.Rigidbodyの追加…親にくっつけました。
 4.Box Colliderの追加…親にくっつけて適当に大きさを合わせました。
 5.スクリプトの追加…親にくっつけました。
 6.cameraを追跡させる…そのまま親に放り込むとガクガクするので、Standard AssetsのSmoothFollow.jsをくっつけました。
1sennshahontaisa.jpg

<スクリプト>

using UnityEngine;
using System.Collections;

public class TankController : MonoBehaviour {
public float  sokudo ; //前進速度
public float kaitenSokudo;//回転速度

void Update () {
  //前進
  float zenshin = Input.GetAxis("Vertical") * sokudo;
  transform.position += transform.forward * zenshin * Time.deltaTime;
  //回転
  float kaiten = Input.GetAxis("Horizontal") * kaitenSokudo;
  transform.Rotate(0, kaiten, 0);
  }
}

<プレイ結果>
 モコモコ道もモコモコと動いてリアルです。
2sennshaga.jpg

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

戦車ゲームが作りたい2

 前回では戦車がとりあえず動きました。これだけでも動き回れて楽しかったりしますが、ここからがややこしいです。
 戦車の頭が回転するということ、そして砲身が上下するということが絡んできます。

<頭の回転>
 戦車の頭を回転するためのスクリプトをくっつける。左右なので、qとeを割り当てました。


using UnityEngine;
using System.Collections;

public class HeadController : MonoBehaviour {
public float atamaKaitenSokudo;//頭回転速度

void FixedUpdate () {
  //頭回転
  if (Input.GetKey("q"))
  {
    transform.Rotate(0, -atamaKaitenSokudo,0);
  }
  if (Input.GetKey("e"))
  {
    transform.Rotate(0,atamaKaitenSokudo,0);
  }
}
}

<砲身の端を中心に回転させる>
 砲身の中心で回転すると変なことになってしまうので、EmptyObjectに入れ子にし、砲身をZ軸方向にずらしました。
 その時、大事なことはPivotボタンをオンにしておくことです。(Centerでは変なことになってしまいます)
1housindennen.jpg

<砲身のスクリプト>
 砲身のスクリプトを親にくっつけました。回転角の制限をもうけないとぐるぐる回しの大砲になってしまします(笑)。下10°、上60°に設定してみました。
 上下の動きをどのキーにするか迷いました。適当なものが見つかりませんので、rとfにしておきました。

using UnityEngine;
using System.Collections;

public class BarrelController : MonoBehaviour {

  public float houshinKaitenSokudo;//砲身回転速度
  private float kaitenKaku; //砲身角度

void Start ()
{
  kaitenKaku = 0.0f;
}
void FixedUpdate () {
  //砲身上下
  if (Input.GetKey("r"))
  {
    if (kaitenKaku >-60)
    {
      transform.Rotate(-houshinKaitenSokudo,0,0);
      kaitenKaku -= houshinKaitenSokudo;
    }
  }
  if (Input.GetKey("f"))
  {
    if (kaitenKaku < 10)
    {
      transform.Rotate(houshinKaitenSokudo,0,0);
      kaitenKaku += houshinKaitenSokudo;
    }
  }
}
}

<入れ子構造にする>
2barrelhousindesu.jpg

<プレイしてみると>
3sassousensha.jpg

 よく砲身をある方向に向けながら車体は回転し移動していくパフォーマンスを見ますが、そういうこともできました。「おお、戦車ぁ〜!」

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

2014年04月29日

戦車ゲームが作りたい... 3

 前回で戦車らしきものができあがりました。

 今日は弾丸の発射をやってみます。

<弾丸発射システム作成>
 1.砲身(Barrel)にスクリプト添付
 2.砲身の下にEmpty Object(SpawnPoint)を作り、砲身の前に置く
 3.Shpereで砲弾を作り、それをPrefab化
 4.砲弾をShotにドロップ
 5.SpawnPointをShot Spawnにドロップ
1hasshacontrolldesu.jpg

<スクリプト>

using UnityEngine;
using System.Collections;

public class HasshaController : MonoBehaviour {
public Rigidbody shot; //弾Prefab
public Transform shotSpawn; //弾発生ポイント
public float shotPower; //弾の勢い

void Update () {
//スペースバーで弾丸発射
if (Input.GetButtonDown("Jump"))
{
Rigidbody dangan = Instantiate(shot, shotSpawn.position, shotSpawn.rotation) as Rigidbody;
dangan.rigidbody.AddForce(shotSpawn.forward * shotPower);
}
}
}

<プレイすると>
 Cubeを重ねてタワーにし、それを戦車でぶっ壊したところ
2towerhassha.jpg

 「戦車走り回り弾撃ちごっこ」ができるようになりました。
 が、問題はここからなんですよねぇ。もっとスクリプトを勉強しないと...(汗)。
-----------------
 <ご注意>私自身が全くの超初心者ですので、文中まちがいがあるかも知れません。その際はご容赦をお願いします。<(_ _)>
posted by Shindo Izo at 20:12| Comment(0) | Unity3Dの練習 Part II | 更新情報をチェックする

2014年04月30日

戦車ゲームが作りたい... 4

 続きです。

 今日は敵を作り、プレイヤーを追いかけ回すようにしたいと思います。

<敵戦車作成>
 1.前回作った戦車を複製後、スクリプトを全部はずしました。
 2.新たに追いかけ回すスクリプト書き、親(EnemyTank)にくっつけました。
1enemysennshadesu.jpg

<スクリプト>

using UnityEngine;
using System.Collections;

public class EnemyTankController : MonoBehaviour {
  public Transform hyouteki; //標的
  public float sokudo;
  public float kaitenSokudo;

  void Update () {
    //回転
    Vector3 soutaiKakudo =  hyouteki.position - transform.position;
    Quaternion kaiten = Quaternion.LookRotation(soutaiKakudo);
    transform.rotation = Quaternion.Slerp(transform.rotation, kaiten, kaitenSokudo * Time.deltaTime);
    //移動
    transform.Translate (Vector3.forward * sokudo * Time.deltaTime);
  }
}
 (何故か急に、Tabが無視されるようになりました。しょうがないので、スペースに変換してます)

<プレイしてみると...>
 追いかけ回されてます...(汗)。
2oikakerarete.jpg

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

2014年05月02日

戦車ゲームが作りたい... 5

 続きです。

 今日は、敵戦車が攻撃してくるようにしてみたいと思います。

<頭部の回転スクリプト>
 TankHeadにくっつけました。

using UnityEngine;
using System.Collections;

public class EnemyHeadController : MonoBehaviour {
  public Transform hyouteki; //標的
  public float kaitenSokudo; //頭回転速度

  void Update () {
    //回転
    Vector3 soutaiKakudo =  hyouteki.position - transform.position;
    Quaternion kaiten = Quaternion.LookRotation(soutaiKakudo);
    transform.rotation = Quaternion.Slerp(transform.rotation, kaiten, kaitenSokudo * Time.deltaTime);
  }
}

<弾発射スクリプト>
 Barrelにくっつけました。発射間隔を調整できるようにしました。

using UnityEngine;
using System.Collections;

public class EnemyHasshaController : MonoBehaviour {
  public Rigidbody shot; //弾Prefab
  public Transform shotSpawn; //弾発生ポイント
  public float shotPower; //弾の勢い
  private float hasshaTime; //経過時間
  public float hasshaKankaku; //発射間隔

  void Start ()
  {
    hasshaTime = 0.0f;
  }
  void Update () {
    //発射時間調整
    hasshaTime += Time.deltaTime;
    //弾丸発射
    if (hasshaTime>hasshaKankaku)
    {
      Rigidbody dangan = Instantiate(shot, shotSpawn.position, shotSpawn.rotation) as Rigidbody;
      dangan.rigidbody.AddForce(shotSpawn.forward * shotPower);
      hasshaTime = 0.0f;
    }
  }
}

<プレイしてみると...>
 1対1の戦いです。
1sennshataisen.jpg

<戦車ゲームの元ができました>
 リアルからはほど遠いですが、何とか戦車ゲームっぽくなりました。
 本当は弾道計算して、砲身の角度を変えられるようにすればいいのでしょうが、何だか難しい数式なので諦めました。
 戦車の頭の部分も車体に対して平行に回転しないといけないのですが、どうやっていいか分かりません。
 もっと勉強して、いつか実現してみたいなぁと思っています。

<ゲーム風に...>
 今回練習したことなどを使って、ゲーム風にして遊んでみました。題して、


 矢印キーで移動回転、スペースバーで弾丸発射、rとfキーで砲身の上下です。敵戦車を全部外に放り出せば勝利です。

 とりあえず、「戦車ゲームが作りたい...」シリーズこれで終了にします。
-----------------
 <ご注意>私自身が全くの超初心者ですので、文中まちがいがあるかも知れません。その際はご容赦をお願いします。<(_ _)>
posted by Shindo Izo at 18:38| Comment(2) | Unity3Dの練習 Part II | 更新情報をチェックする

2014年10月06日

FPSキットをDLしてみました

 Unityのアセットストアに行って、FPSキット

 FPS Constructor

というのをダウンロードしてみました。
 ダウンロード後、さっそくランしてみたら、何やらいっぱいエラーが出て、どうしていいのか分からないので困りました。
 しょうがなく同梱されているドキュメントpdfファイル(英語)を開くと、オンラインマニュアルのリンクだけがあり、それをダブルクリックするとマニュアル(これも英語)が開きました。
 左にコンテンツのリンクがあるので、上から読んでいくと何となくそれらしきものにぶつかりました。Importing and Configuring>Initial Configuration です。その内容は、

 ランする前に以下のレイヤーとインプットの設定をせよ

と言ったことのようです。

 やるべきことは:

1.Menu>Edit>Project Settings>Tags & Layersに入って、

 User Layer 8: Player
 User Layer 9: IgnorePlayer
 User Layer 10: Enemy
 User Layer 11: Trigger

 と打ち込む。

2.Menu>Edit>Project Settings>Inputに入って、

 ・Axes の中の Sizeを25に変更
 ・以下のInputを作成する

  Aim : Positive Button → "left alt", Alt Positive Button → "mouse 1"
  Crouch : Positive Button → "c"
  Pickup : Positive Button → "tab"
  Reload : Positive Button → "r"
  Sprint :Positive Button → "left cmd", Alt Positive Button → "left shift"
  Escape:Positive Button → "escape"
  LeanLeft:Positive Button → "q"
  LeanRight: Positive Button → "e"
  Interact: Positive Button → "tab"
  Store: Positive Button → "escape"

 下図は、Aimを作成したところ

1inputsetteida.jpg

 これでランするとうまくデモが作動しました。

2fpsfightdesune.jpg

 これを使ってゲームを作る、と言っても、一体何からどうしたらいいのか皆目見当もつきません。

 それにしても、このデモゲームは超ムズイ...
-----------------
 <ご注意>初心者の書く記事ですので、参考程度ということでお願いします。<(_ _)>
ラベル:FPS Unity3d
posted by Shindo Izo at 14:05| Comment(5) | Unity3Dの練習 Part II | 更新情報をチェックする

FPSキットを使ってみる1

 前回、Unityのアセットストアに行って、FPSキット

 FPS Constructor

というのをダウンロードして、デモゲームをやりました。
 英語のマニュアルは説明がいっぱいあって、「やめようかな...」と思いましたが、踏みとどまってもう少しチャレンジしてみたいと思います。(途中で挫折する可能性大)
 コンテンツThe Big Pictureは飛ばして、Getting Started(入門)をやってみたいと思います。まず、

 Setting up a New Scene

から。これはとりあえず0から動かす方法の説明です。手順は:

 1.New Sceneを作る
 2.Hierarchy内のMain Cameraを削除
 3.Project内、Plugins>FPS Constructor V1>PrefabDB>Setup>ManagerをHierarchyにD&D
 4.Project内、Plugins>FPS Constructor V1>PrefabDB>Setup>PlayerをHierarchyにD&D

でゲームがスタートできる、と書いてあったので、さっそくラン。
 結果、真っ暗闇の中をただ落下しました。(床と光がないので)

 デイライトと床(Plane)と立方体(オブジェ)を追加して再びラン。
 動き回れました。が、それだけです。
 「これゲームじゃないよぉ」とつぶやきつつ、次のコンテンツ

 Adding Weapon

に進みました。これは、武器の追加の方法説明です。

 Project内、Plugins>FPS Constructor V1>Demo Assets>Weapon>M1911>M1911をHierarchy内、Player>Weapon CameraにD&D

で武器を装備することができるようになりました。
 ランしてESCキーを押すと、ショップ形式のウィンドウが開くので、武器を買う(buy)と、装備できます。

1bukisoubi.jpg

 かっこよく銃を構えて動けるようになりました。

2bukituketazo.jpg

 次の文章、

If you want the weapon to be equipped at the start, drag that weapon into the weapons array in the PlayerWeapons component. This array holds all of the equipped (accessible by hitting the number keys) weapons.

は、

もし最初から武器を装備したいなら、PlayerWeaponsコンポーネントの中のweapons配列にその武器をドラッグせよ。この配列は装備された武器のすべて(数字を打つことでアクセス可能)を収納している

というような意味だと思われますが、何をどうしていいのか分かりません。配列はスクリプトの中にあるはずなのに、どうやってドラッグするんだろう...???。

 あ〜、しんど...。道は遠い...
-----------------
 <ご注意>Unity初心者の書く記事ですので、参考程度でお願いします。<(_ _)>
ラベル:Unity3d FPS
posted by Shindo Izo at 20:19| Comment(2) | Unity3Dの練習 Part II | 更新情報をチェックする

2014年10月08日

FPSキットを使ってみる2

 続きです。

 前回、

If you want the weapon to be equipped at the start, drag that weapon into the weapons array in the PlayerWeapons component. This array holds all of the equipped (accessible by hitting the number keys) weapons.

の意味がよく分からず放り出してしまいました。
 後で読み直したら理解できました。その手順は、

 Hierarchy内、Player>Weapon Camera にくっつけている Player Weaponsスクリプト内の Weapons配列(Element0 〜 Element3)に任意の武器をドロップする

ということだと分かりました。
 で、Element0やらElement1にドロップしてランしましたが、ダメでした。やはり武器が装備されません。エラーも出ます。
 ひょっとして、StoreControllerを無効にすれば行けるかなと思いやってみましたがダメでした。
 ここでギブアップ

 次の Using Storeはショップの設定ですが、ほとんど意味が分からないので飛ばしますちっ(怒った顔)

 その次の、Setting up the Environment はエフェクトを使用できるようにする方法です。エフェクトをオンにすると、footstep sounds(足音)や弾が壁などに当たったとき破片が飛び散り、弾痕が残るようにできます。手順は、

 1.Hierarchy内、Manager選択
 2.Inspector内、Effects And Penetration Wizardにおいて、EffectプルダウンメニューをUse Effectsにする
 3.その下のそれぞれのColliderにチェックを入れ、材質をプルダウンメニューから決める

1effectdennen.jpg

 ランすると、靴音がし、床やオブジェクトを撃つと弾痕ができ、破片が飛び散るようになりました。

2dankonsamadesu.jpg

 これで、Getting Started(入門)は終わっています。ここで終わられても...。後は自分でやってね、ということなのでしょう。きびしぃーっふらふら
-----------------
 <ご注意>Unity初心者の書く記事ですので、参考程度でお願いします。<(_ _)>
ラベル:FPS Unity3d
posted by Shindo Izo at 17:47| Comment(0) | Unity3Dの練習 Part II | 更新情報をチェックする

2014年10月11日

FPSキットを使ってみる3

 続きです。

 前回で、入門編(Getting Started)を終わりましたが、何にもできません(笑)。ここで終わられても、という感じです。あとはデモを参考にするなり、頑張って下さい、ということなのでしょう。

 その次の、Basic Configuration から下をざっと読んでみましたが、システムの説明を書いてあるのはわかるのですが、何をどうしていいのかよく分かりませんでした。
 その中で、Advanced Configulationがほんの一部分だけ理解できそうなのでトライしてみました。

 まず、Ladders。はしごです。これなら何とかなりそうと思ってやってみました。結果、出来ませんでした。はしごに登れません。色々いじってみましたがどうしても出来ませんでしたもうやだ〜(悲しい顔)
 何度も英文を読み直したけど、きっと私がまちがったことをしているのでしょう。

 しょうがないので、Demo Gameの中のはしごをPrefab化し、「これなら登れるだろう」と思いつつ使ってみました。なんと、...、登れません。位置を動かしたり、角度をつけてみたり、数値を変えてみたりしましたが、...、登れません。えーっ???
 一体、どうなってるんだろうこのシステム。???。がっかりしてしまいました。それともトンチンカンなことをやってるんだろうか...。

 ふと、意味もなくはしごを少し下げてみました(地面にめり込む状態)。結果、...、登れました。わけが分かりません。
 まぁ、結果がオーライなので、納得するしかないですね。下図ははしごを登っているところ。

1hasigonoborideeesu.jpg

 歩き回れて、ピストルが撃てて、はしごが登れるようになりました。うーーんちっ(怒った顔)
-----------------
 <ご注意>Unity初心者の書く記事ですので、参考程度でお願いします。<(_ _)>
ラベル:Unity3d FPS
posted by Shindo Izo at 18:49| Comment(2) | Unity3Dの練習 Part II | 更新情報をチェックする

広告


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

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

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