unityチュートリアルSpaceShooterその4「境界と敵」

標準

https://saitottammas.wordpress.com/2016/11/24/unity-spaceshooter3/ の続き

Unity5バージョンでの変更点一覧(Unity提供)
https://oc.unity3d.com/index.php/s/rna2inqWBBysn6l?_ga=1.260994632.411228565.1453178645

3.ゲームエリアの境界作成

ゲームエリアをBoxで作り、弾がその境界外に出たら、削除するように設定する。

1)新規にCubeを追加。実際にはコライダーのみ必要であるが、設置するまで、mesh render等も有効にしておく。名前は Boundaryにしておく。

2) カメラが直交投影に設定されている場合、プレイ画面長さは、カメラのOrthographicサイズの2倍なので、カメラ位置中心に設置するため、場所を0,0,5に置く。x方向にスケール15, y方向にスケール20にする。

3)大きさが設定できたら、mesh renderを無効にする。

4)C#スクリプト DestroyByBoundaryを新規追加。AssetのScriptフォルダなどに格納し、Boudaryにアタッチする。
————

using UnityEngine;
using System.Collections;

public class DestroyByBoundary : MonoBehaviour
{
void OnTriggerExit(Collider other)
{
Destroy(other.gameObject);
}
}


Triggerに関わるマニュアルからTriggerExitを調べると、ちょうどサンプルとして出ているコード。

5)確認してうまく弾が消えるなら、OK。Boundaryから不要なMesh Filter とMesh Render コンポーネントを削除する。

4.障害物(小惑星)の追加

1)空のゲームオブジェクトをAsteroidという名前にし、位置をリセットする。試しに前方(y)に8の場所に置く。

2)3つの小惑星が準備されているので、最初のものを選び、ゲームオブジェクトにドラッグする。場所をリセットする。

3)Asteroidにリジッドボディコンポーネントを追加し、重力を無効にする。

4)カプセルコライダーコンポーネントを追加する。edit collider ボタンをクリックし、シーンビュー上でカプセルの大きさを小惑星にあわせる。

5)C#スクリプト追加 RandomRotater

using UnityEngine;
using System.Collections;

public class RandomRotator : MonoBehaviour
{
public float tumble;
private Rigidbody rb;

void Start ()
{
rb=GetComponent<Rigidbody>();
rb.angularVelocity = Random.insideUnitSphere * tumble;
}
}

tumbleを5に設定し、ゲームプレイごとに違う角度で回転する小惑星を手に入れた。

6)AsteroidのRigibodyのDrag角度(Angular Drag)に初期値0.05が設定されているので、これを 0 にする。

7)弾と小惑星はTrigger同士なので、当たり判定はスクリプトを書く必要がある。
小惑星が何か(おそらく弾)にあたるとDestroyされればよい。

8)DestroyByContactスクリプト

void OnTriggerEnter(Collider other) 
    {
        Debug.log(other.name)
        Destroy(other.gameObject);
        Destroy(gameObject);
    }

として確認してみると、最初にBoundaryにぶつかっていて、Boundaryと一緒に小惑星が消えてしまう現象が確認できた。

それではまずいので、Boundaryには、タグBaundaryをつけて、そのタグのときは、無視されるように変更する。

void OnTriggerEnter(Collider other) 
    {
        if (other.tag == "Boundary") { return; }
        Destroy(other.gameObject);
        Destroy(gameObject);
    }

5.爆発効果の追加

小惑星が破壊された場合と自機が破壊された場合

1)VFXのプレファブを、衝突のタイミングで実体化すればよい。

DestroyByContact に追加

public GameObject explosion;
void OnTriggerEnter(Collider other) 
    {
        if (other.tag == "Boundary") { return; }
        Instantiate(explosion,transform.position,transform.rotation);
        Destroy(other.gameObject);
        Destroy(gameObject);
    }

2)自機が小惑星にぶつかったときにも、同じ爆発になってしまうので、タグPlayerを利用して、そのときは、別のVFXを出す。

public class DestroyByContact : MonoBehaviour
{
 public GameObject explosion;
 public GameObject playerExplosion;

 void OnTriggerEnter(Collider other) 
 {
 if (other.tag == "Boundary")
 {
 return;
 }
 Instantiate(explosion, transform.position, transform.rotation);
 if (other.tag == "Player")
 {
 Instantiate(playerExplosion, other.transform.position, other.transform.rotation);
 }
 Destroy(other.gameObject);
 Destroy(gameObject);
 }
}
Unityシーンに戻り、Playerには、Playerタグをつける。Playerタグは最初から準備されているので、タグの新規追加する必要はない。

Blender フルーツダイブシーン

標準

例によって、アンドリューさんのチュートリアル動画より

http://www.blenderguru.com/tutorials/create-a-realistic-fruit-splash/

オレンジの表面を手続き型テクスチャで作る。

Cycles render利用になっていることを確認し、Node Editorウィンドウに切り替える。

Node Wrangler アドオンを有効にしておくと、簡単に繋げるので便利。

日本語解説

http://www.cgradproject.com/archives/3553

フル機能解説

https://wiki.blender.org/index.php/Extensions:2.6/Py/Scripts/Nodes/Nodes_Efficiency_Tools

1.オレンジの作成🍊

1) UVSphereを追加

2) 周囲一本を選択し、Ctrl EからMark Seamしておく→UVマップに展開するため。

3) 仮照明として、プレーンを一枚、真上に設置し、マテリアルで、Emmisionを選んでおく

4) node editorで作業。オレンジの皮の凸凹を、バンプマップで作る

-1 ボロノイテクスチャを追加。サイズは400程度にする

-2 そのノードの左に(inputカテゴリの)テクスチャコーディネートを追加。UVソケットをボロノイのvectorソケットに繋げる。

-3 ボロノイの右に、mix RGBを追加。下のソケットにつなげ、上の色をピュアホワイトにする。方法はmultiply(掛け算)にする。出力のDisplacementに繋げれば、既にバンプマップが適用されているのがわかる。Multiplyの比率を0.05ぐらいにし、白が多くなるようにする。

-4 mix RGBの左に、Color→invertで、黒白逆転させる

-5 大小の凸凹に変更するため、ボロノイノードを複製し、こちらは数値を140ぐらいに設定する。両方のソケットを、右側に mix RGBを置いてつなぐ。Screenあたりがよい。スライダーの数値は0.3ぐらいにする。

-6 Diffuse BSDF とGlossy BSDFで色とテカリをつける。Glossyはラフネス0.1程度。両者を混ぜるMixShaderの比率は0.1程度で。

-7 色が一色だとリアリティがないので、Diffuseノードの左にノイズノードを出し、その右にmix RGBを出し、下側のソケットにつなげる。上側の色は、明るいオレンジから黄色を選び、両者は、Overlayにする。比率は0.3程度。

-8 全体に凸凹をつけるため、displacementモディファイアをほんの少しかけるのもよい。

-9 他にも何種類かのフルーツを用意する。カット面は、テクスチャ画像を使うと良い

2. 流体シミュレーション

1) ドメインボックスの設定。できるだけ小さい方がいいが、全てのシミュレーションは、このボックス内部で生じる。

2) カメラを設定する。(アンドリューさんは)cannon70のプリセットが好きでそれを選ぶ。レンズ焦点距離は90ぐらいにする。

3) この領域ボックスを複製し、少し小さくして果物が半分程度頭を出すあたりに設置する

4) 小さくした方のボックスに、流体シミュレーションボタンのドメイン指定をする。

5) 解像度が重要。240〜260程度に設定するが、プレビューとして、80ぐらいで試す。

 

 

 

 

 

 

 

 

 

Blenderカーブを使ってソフトクリーム

標準

参考にさせてもらったのは、こちら

1.コーンカップ作成

コーンカップは回転体か、サークルを延長して作成する。

回転体で作成した場合は、オブジェクトモードに戻してから、モディファイアをApply(適用)して、メッシュにしておく。

2.クリーム作成準備

コーンカップの上の縁を編集モードで選択し、Shift-Sで3Dカーソルを選択している部分に移動する(Cursor to Selected)。

3.スパイラルカーブ追加

オブジェクトモードに戻り、Shift-AでカーブからSpiralを選ぶ。これが出てこない場合は、アドオンの設定がされていないので、ファイルメニュー→ユーザー設定→アドオンタブを開き、検索窓にextraと入力して、add extra curveをチェックして有効にする。

4.スパイラル調整

スパイラルの作成オプションから、巻き数(5か6あたりで)、高さ(下絵にあわせて)を選ぶ。

cream01

5.クリームの型作成

クリームの形にあわせ、星型あるいは6角形を作成する

cream02

1)作り方 10角あるいは、12角のサークルを追加。
2)編集モードにしたら、selectメニューのchecker deselectを選択。初期設定で、一つ置きに点が選択されるので、そのままそれを縮小。
3)そこまでの作業のままでもいいが、とんがりを和らげるために、ベベルをかける。点全部を選択してから、Ctrl-B(ベベル)→Vを押し(Vertexオンリー)、数値0.05をいれる。

6.メッシュからカーブにコンバート

星型のメッシュをAlt-Cを使って、カーブにコンバートする。

7.カーブに沿って星型にベベル

クリームの形のスパイラルカーブを選択し、カーブプロパティ設定から、ベベルオブジェクトとして、星型カーブを選ぶ。

8.カーブの裏表方向変換

クリームの色が暗い場合は、星型カーブの方向が裏返しなので、星型カーブを編集モードにし、カーブメニュー→セグメント→スイッチディレクションを選んで、方向を直す。

9.ベベル半径調整

クリームのトップが開いているので、クリームのカーブを編集モードにし、一番上の点だけ選択し、Nで開くプロパティ設定から、radius 1.0となっているところを0.0に直す。

10.カーブのスムース半径調整

クリームの先頭部分を選択しなおし、Wのスペシャルメニューから、スムースカーブラディウスを選んで、なめらかに形が細くなるようにする。

11.クリーム先端のひねり

一番上の点を選び、プロポーショナル編集モード(Oオーで切り替えられる)でひねってクリームの突端部分を形成する

12.クリームのチルト調整

クリームの重ね角度が足りない感じだったので、一番下の点を選び、Tilt(チルト)を720°にする。クリームの先端部分以外を選択しなおし、Wのスペシャルメニューから、スムースカーブチルトを選んで、調整する。

13.クリーム複製

クリームは、複製し、ひとつを別レイヤーに保存しておく(M)。

14.クリームをメッシュにコンバート

使うほうのクリームを選び、Alt-Cでカーブからメッシュにコンバートする。

15.最終調整

3Dカーソルをクリームの中心部に置いて、回転中心を3Dカーソルに直し、カップからはみ出した部分などをS(縮小)して修正する。

icecream-render

Blender ビギナーチュートリアル(アンドリュー・プレイスさんのドーナツ)より

標準

Blender GURU

登録すると数多くのチュートリアルにアクセス可能。

中でもアンドリュー・プライスさんの講義はほとんどの人が必ずお世話になるのでは。

https://www.blenderguru.com/tutorials/blender-beginner-tutorial-series/

1.ドーナツ原型~トーラスで。

画面にトーラスを追加 40角12分割 インナー直径を少し小さくしてドーナツらしい形に。

サブディビジョンサーフェスモディファイアを追加(render viewとも2の設定で)。
objectモードでもsmoothシェーディングをしておく。ポイント照明は、ドーナツの真上に移動しておく。

2.編集モードで上半分の点をすべて選択し(LまたはCtrl-Lで)、Pで別オブジェクトにする。

Solidfyモディファイアを最初に追加する。オフセットは1.00に。これは、サブサーフェスモディファイアよりも上(先)に持ってくる。

3.マテリアル設定

下のドーナッツ本体には、オレンジイエロー、上にかぶせたアイシングオブジェクトに、色を付ける(ピンクなど)。レンダーはcycles renderに変更する。

donut01

4.Nodeエディター

Diffuse BSDFとGlossy BSDFをあわせてマテリアルに設定する、ということがよくある。

Nodeエディターを出し、Glossyシェーダーを追加する(NodeエディターでShift-A)。Mixシェーダーを追加し、両者を同時に適用する。

Nodeのコネクターは、基本的に同じ色同志でコネクトする。例えば、テクスチャノードは黄色なので、そのまま出力ノード(緑)につなげることはできない。

Mixシェーダの比率は、1.0にすると下に接続したシェーダが、0.0にすると上に接続したシェーダが有効になる。調整し、少し照り返しのつく0.1ぐらいにセットする。

Glossyシェーダーのラフネスも調整する。0.3ぐらいに設定した。

5.プロポーショナル編集

ドーナツにかかっているアイシングの淵があまりにも真っすぐなので、プロポーショナルエディットのランダムを利用して表情をつける。淵以外の点は、一度隠しておいて(Hide~H)操作する。

ドーナツとアイシングが分離しているように見える場合は、淵のラインを選んで、少し縮小してみる。

6.マグカップと皿を加えた

donut02

7.テクスチャ

http://www.textures.com/ 3D用テクスチャを提供しているサイト

または

https://www.poliigon.com/ (アンドリューさんの運営サイト)

から机のテクスチャにちょうどいいものを選択してくる。(ノーマルマップを提供していればそれも)

8.テクスチャイメージNode追加

テーブルのNodeエディターに通常のDiffuseとGlossyノードをミックスする。Diffuseノードの前に、テクスチャ→イメージノードを追加。

テーブルはUV展開しておく。

9.ノーマルマップ追加

同じテクスチャノードを複製(Shift-D)し、ノーマルマップをイメージとして選択してから、colorソケットをDiffuseとGlossyの両方のNormalソケットに接続する。

ただ、これだと二重にテクスチャ効果がかかってしまっているので、ノーマルマップを追加し、そこからDiffuseとGlossyのノーマルソケットにつなぐ。

さらに、イメージデータのColorのところをクリックして、Non Color Data に変更する。

Glossyのラフネスは調整し、0.04ぐらいにするとよい。

10.グロスイメージマップ

グロスイメージも手に入った場合は、それを上記、ラフネスの代わりに入力できる。

ただ、色が暗くなるので、リフレクションマップの場合も同じだが、コンバート→カラーランプを間にいれて調整するとよい。

11.リフレクションマップ

リフレクションマップが手に入った場合は、最後の出力の前のMixシェーダーのファンクションのところに入力をつなげる

donut03

12.テクスチャ追加

アイシングをそれらしく見せるため、Poliigonサイトからcamoで検索したカモフラージュ画像をダウンロードする。

Nodeエディターで、アイシングのピンクDiffseイメージの前に、そのテクスチャを追加する。

UV展開が効いていないので、その一つ前に、Inputカテゴリーのテクスチャコーディネートを追加。

ObjectソケットからVectorソケットに接続し、さらにテクスチャのほうは、Boxメソッドを選択することで、カモフラージュ画像がきれいに乗る。

donut04

13.Hairパーティクル

パーティクルを使って、シュガートッピング
8角シリンダーを細長く伸ばして(S-Shift-ZでZ方向以外を縮小)ひとつのシュガーの形を作る。

頭は、一度Eで少しだけ拡張し、それをSで縮小して丸める。Z軸方向のミラーモディファイアなどを使って、上下同じ形にする。

14.Ctrl-A適用

シュガーをドーナツと同じレイヤで比較し、小さく縮小して大きさをあわせる。その後、ObjectメニューからApplyスケールをしておくこと。

donut05

15.法線方向確認

アイシングを選択して、Hairパーティクルをかける。Solidfyモディファイアのせいで、ヘアが裏に出てしまっているので、編集モードでNormalの方向をFlipDirectionして、逆転させる。

donut06

16.パーティクル追加設定

Hairパーティクルでは、Advanced設定ボタンをクリックする。

render設定のところを、Pathではなく、Objectにし、DuplicateObjectの欄に、先ほど作成した、チョコレート棒を選択する。回転やスケール設定などのオプションが出てくるので、設定する。元のチョコレート棒のほうをサイズを変更した場合には、Ctrl-AでスケールをApplyしておく。
donut07

17.グループ利用

違うイメージのパーティクルをミックスさせるためには、グループ化する。元のチョコレート棒を複製し、サイズを小さなものをつくり、両者選んでCtrl-Gでグループ化する。render設定のところ、Objectの代わりにGroupを選び、グループ名で指定する。

18.パーティクルにマテリアル適用

チョコレート棒にマテリアルをつける。

GlossyとDiffuseのMixシェーダーでいいが、Ctrl-Shiftを押しながら数値をマウスで動かすと、きりのいい数字で設定してくれる。

ひとつのマテリアルを設定後、ほかの多くのオブジェクトにも同じマテリアルを設定したい場合、Shiftで全オブジェクトを選択し、最後にマテリアル設定済みオブジェクトを選ぶ。Ctrl-Lを押すと、何をコピーしたいかセレクトできるので、マテリアルを選ぶ。

donut08

19.違うマテリアル追加方法

マテリアルを複製し、色だけ変えていく。

マテリアルのシェア数が表示されている場所をクリックし、単独マテリアルを作成して名前を変える。これをコピーしたチョコレート棒のセットに適用していく。7~8色。

donut09

チョコレート棒が全部まっすぐだと面白くないので、数本選んで、少し曲げたりする。元のチョコレート棒群は、別のレイヤーに移動し、アウトライナーパネルで、レンダリングアイコン(カメラアイコン)を非表示にし、レンダリングに表示されないようにする。

20.ウェイトペイントで密度調整

チョコレート棒の密度が一定だとCGっぽいので、密度を変えるために、ヴァーテックスグループにウェイトペイントする。ちょうど、ヒートマップのように、赤い部分に集中してパーティクルが配置される。

donut10

21.照明について

Pointランプ Node利用にして強さ500ぐらいにしてもよい
Sunランプ  平行光線 強さ500では強すぎる。~5ぐらいでよい
Spotランプ 強さのレンジはPointランプに似ている。特別なビーム光線。
Hemiランプ Cyclesレンダーでは非対応。
Areaランプ 広範囲を照らすことができる。設定の仕方で、窓からの光のようにできる。

Pointランプに戻ると、サイズは大きいほど、スムーズな影になる。

22.World背景の変更

Lamp

World

Mesh

この3つで考えていく。
World環境設定では、Surfaceが初期設定でグレーになっている。これを白にするだけでかなり明るくなる。

また、Node利用にすると、強さを設定できるが、この強さの数値をアップしてもだいぶ変わる。

donut11

日中の戸外などを想定した場合、World光は青色に設定するとよい。影がやや青になるのがわかるであろう。

また、ここでは簡単に説明されていたが、背景に360度画像(HDRI)を持ってきて、その反射を生かす、ということもできる。

23.あらゆるオブジェクトを照明に変更可能

Emissionを適用することですべてのオブジェクトが照明に変わる

24.先にカメラ位置を決定しておく

25.照明設定

1)World 黒で、強さを0.0にする

2)エリアランプを設定する(キーライト)

サイズを大きくし(例えば10)、強さも強くする(例えば5000)

ソフトな影が出来るようにする

窓を想定し、角度を修正する。

朝の光を想定し、少しだけオレンジ色の光にする。

3)その光を複製し、方向を反対にする。こちらは青い光で、キーライトほど強くしない(例えば2000)

平面を壁の位置にたてる

4)もし光量が足りないようなら、真上からエリアランプをもう一つ追加する。

5)キーライトの影が強すぎると思ったら、フィルライトをややカメラ側から照らすとよい

26.GPU計算設定

ユーザー設定のシステムのところを確認。左下の計算デバイス欄に、CUDAというのが出ていない場合は、そのPCはグラフィックボードを持っていない(か、適用外のバージョン)。出ている場合は、CUDAを選択。設定保存。

上記設定だけではだめで、プロパティパネル内、レンダー設定のところにも、計算デバイスを選択する場所があるので、こちらも必ず、GPU計算にする。

27.レンダリングパフォーマンスをあげるために

CPU計算の場合には、レンダー設定パネル中の、パフォーマンス部分にある、タイルサイズを、例えば8×8とか16×16にするとよい。

GPU計算の場合には、上記タイルサイズを大きくすることで時間を短縮できる。128×128や256×256で試すとよい。

サンプルサイズは、プレビューでは低くしておく(50とかせいぜい100とか)が、最終レンダリングは、どういうシーンによるかであるが、800など(時間はかかるが)ノイズが出ないよう大きな数字にする必要がある。

最終レンダリングの場合には、サイズが100%になっているか、確認が必要。

donut12

28.絵作り(構図など)

ドーナツに焦点をあて、カップなどを視線の中心からはずして置く。チョコレート棒の色が多すぎると思えば、赤などを削除するとよい(ここでは採用している)。

フレッシュさを出すために、皿にも少しだけチョコレート棒を散らす。
これは、同じパーティクルシステムを追加後、独立させて、出力数を極端に減らす。

donut13

カメラ設定パネル内で、カメラの深度距離や焦点なども設定し、まわりをぼかす表現なども試すとよい。

donut14

29.コンポジット

最後にレンダリングイメージを保存したら、それを最終仕上げ(コンポジット)で加工しよう。

Nodeエディターウィンドウにし、コンポジット(画像ファイルイメージボタン)をクリック。BackDropにもチェックをいれ、Viewerを追加する。

Photoshopと同じように、グローを追加したり、色味を変更することができる。

donut15

 

unityチュートリアルSpaceShooterその3「攻撃」

標準

https://saitottammas.wordpress.com/2015/11/14/unity-spaceshooter1/

https://saitottammas.wordpress.com/2015/11/16/unity-spaceshooter2/

に続く第三弾

1.shot(弾)を作る。

1)画面上のPlayer(飛行艇)が邪魔になるので、インスペクターのPlayer前のチェックをはずして「非表示」にする。

2)Empty GameObjectを作成し(shift-CTRL-N)、名前を「Bolt」に変更する。リセットして位置を原点に戻す。

3)新規にQuadを作り、名前を「VFX」に変更する。場所をリセットする。

4)このVFXをドラッグしてBoltの下(childとして)に持っていく。

5) シーンビューで見ると、Quadの向きがカメラに水平になっているので、x軸で90度回転し、上から見て表面が見えるようにする。

6) ダウンロードしたアセットのテクスチャフォルダから、レーザーオレンジの画像を出す。

7) 単にテクスチャをドラッグする方法もあるが、今回は、マテリアル作成をしてみる。マテリアルフォルダを選択しておいてから、ヒエラルキーのcreateメニューから、create new materialを選ぶ。

名前をFX Bolt Orangeに変更する。

8)マテリアルのインスペクターウィンドウで、アセットピッカー(右上)を使い、テクスチャを選ぶか、テクスチャフォルダから画像をインスペクターフィールドにドラッグする。

9) 作成したマテリアルを、シーンビューのQuadにドラッグする。

10) このままでは、画面上に黒い四角が見えているので 、Shaderの変更をする必要がある。

デフォルトのDiffuseというのは、色を表示するShaderなので、代わりに、Particle→additiveを選ぶ。これは黒を透明にし、白を強調してくれる。他にも、mobile→particle→additiveでも良い。

mobile Shaderは、モバイルゲームでなくても有効である。

11)さて、Boltには現在何のコンポーネントも付いていないが、衝突計算も必要なため、rigidコンポーネントとコライダコンポーネントが必要になる。

まず、Rigidコンポーネントを追加し、重力を非選択する。

12) VFXオブジェクトを確認すると、mesh コライダーが自動的に付いているが、これは不要なので、removeコンポーネントする。

親のBoltオブジェクトに戻り、カプセルコライダーを追加する。カプセルの軸をy軸でなく、z軸にして弾の向きに合わせる。サイズも合わせて、隙間のないようにする。(真上からみると、半径0.03あたり、高さ0.5あたりが良さそうである)

13)コライダーコンポーネント設定で、Triggerのチェックをオンにする。

14) c#スクリプトを追加し、Moverと名づけて編集する。

using UnityEngine;
using System.Collections;

public class Mover : MonoBehaviour
{
private Rigidbody rb;
public float speed;

void Start ()
{
rb=GetComponent<Rigidbody>();
rb.velocity = rb.transform.forward * speed;
}
}

15)このBoltをヒエラルキーのPrefabsフォルダ(なければ作成する)にドラッグして、プレファブ化する。

16) 初期画面からBoltを削除し、ゲームプレイ中にこのプレファブをヒエラルキーウィンドウにドラッグすると、まっすぐに飛んでいくBoltを確認できる。

 

2.Fireボタンをクリックで発射

1)Shot(弾)は、プレファブ化したのだから、それをゲーム内で実体化する必要がある。

これをするのが、Instantiate(インスタンス化)である。ファイアボタン(マウス左ボタンか左コントロールキーに割り当てられている)
をクリックしたら弾が発射するようにする。これは、単にUpdate()関数の中に記述すればよい。

Instantiateの使い方:
public static Object Instantiate(Object original, Vector3 position, Quaternion rotation);

ここでは、プレファブ化したBoltをVector3の位置とクォータにオン回転角度 で指定する。
これらの情報はどこで確認すればいいかというと、Inspectorの一番上にTransformというコンポーネントに
コンパクトに格納されている。

2)プレファブ化されているのは、Bolt(弾)であるから、それを使うとして、位置については、Player機の子供として
取り付けた、Shot Spawnを指定する。空(から)のGame Objectを追加し、Shot Spawnと名前を変更する。位置回転をリセットしたら、
これをPlayerオブジェクトの子供としてとりつける(Playerにドラッグする)。

3)弾が放出される場所を見つける。Shot SpawnはPlayerとの相対的な位置関係で座標が表示されるので、Z方向(機の前方)へずらし、適切な位置を探る。ここでは、Z位置が1.25ぐらいでちょうどよさそうである。BoltプレファブをShot Spawnの子供として配置して
みるとイメージしやすい(あとで削除するが)。

4)PlayerControllerスクリプトの修正

まず、public gameObject shot; 追加
public gameObject shotSpawn; のかわりに、 public Transform shotSpawn; 追加

void Update(){

Instantiate(shot, shotSpawn.position, shotSpawn.rotation);

}

このまま、Boltをshotの欄に、Shot SpawnをshotSpawnの欄にドラッグしてゲームスタートすると、連続して発射するプレイヤー機が見られる。

5)Fireボタンを押すと発射

コマンドマニュアルを開くと、サンプルコードが見られるので、それをコピペしてもいいのだが、
Input.GetButton(“Fire1”)
というコマンドはUnityに最初から設定済みである。

if(Input.GetButton(“Fire1”)を追加すると、左Ctrlキーかマウス左ボタンを押すと連続弾が発射される。

6)発射間隔を制限する工夫

fireRateという、射撃間隔を導入する。

それから計算すると、次の射撃は、nextFire = Time.deltaTime + fireRate になる。

public float fireRate;
private float nextFire;

void Update () {
if (Input.GetButton(“Fire1”) && Time.time > nextFire)
{
nextFire =Time.time+ fireRate;
Instantiate(shot, shotSpawn.position, shotSpawn.rotation);
}
}

fireRate の初期設定は秒当たり4発ぐらいでよさそうなので、0.25にする。

このままでは、実体化したBoltが山ほど溜まってしまうので、次の章では、境界線を超えたら、削除(destroy)するというプログラムを書く

ーーーーーーーーー

PlayerControllerに追加し、弾を撃てるようにする。

using UnityEngine;
using System.Collections;

[System.Serializable]
public class Boundary
{
public float xMin, xMax, zMin, zMax;
}

public class PlayerController : MonoBehaviour
{
public float speed;
public float tilt;
public Boundary boundary;
private Rigidbody rb;

public GameObject shot;
public Transform shotSpawn;
public float fireRate;

private float nextFire;

void Start () {
rb = GetComponent<Rigidbody>();
}

void Update ()
{
if (Input.GetButton(“Fire1”) && Time.time > nextFire)
{
nextFire = Time.time + fireRate;
Instantiate(shot, rb.shotSpawn.position, rb.shotSpawn.rotation);
}
}

void FixedUpdate ()
{
float moveHorizontal = Input.GetAxis (“Horizontal”);
float moveVertical = Input.GetAxis (“Vertical”);

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

rb.position = new Vector3
(
Mathf.Clamp (rb.position.x, boundary.xMin, boundary.xMax),
0.0f,
Mathf.Clamp (rb.position.z, boundary.zMin, boundary.zMax)
);

rb.rotation = Quaternion.Euler (0.0f, 0.0f, rb.velocity.x * -tilt);
}
}

ーーーーーーー