【Unity】iOSアプリ仕様の3Dジャンプアクションゲームを制作してみる。【開発】(その9)
【スポンサーリンク】
Unityでios用3Dジャンプアクションゲームアプリ制作【第9回】
今回はballオブジェクトを数秒毎に出現(スポーン)させるスクリプトを書いていきます。
前回生成したスクリプト「ballspawn」をダブルクリックしてMonoDevelopを開いて下さい。
以下のコードを書いて下さい。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
using UnityEngine;
using System.Collections;
public class ballspawn : MonoBehaviour {
public GameObject ball;
// Use this for initialization
void Start () {
ballSpawn();
}
// Update is called once per frame
void Update () {
}
void ballSpawn(){
Instantiate(ball,transform.position,transform.rotation);
StartCoroutine("waitTime");
}
IEnumerator waitTime(){
yield return new WaitForSeconds(7f);
ballSpawn();
}
}
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
書いたらビルドしてUnity側に戻って下さい。
「ballspawn」スクリプトをクリックしたまま、ヒエラルキー内にある「ballSpawn」オブジェクトにドラッグ&ドロップしてスクリプトを入れて下さい。
そして「ballSpawn」オブジェクトをクリックし、右に表示された(インスペクター)から「ballspawn」スクリプトが入っているのが確認できます。
そしてこのスクリプトにBallgと書かれた横にNone(Game Object)と書かれ、オブジェクトを入れれる場所があります。
このNone(Game Object)の場所にAssets内にある「ball」オブジェクトをドラッグ&ドロップで入れて下さい。
ballオブジェクトを入れると下のようになります。
そして再生ボタンを押して「ball」オブジェクトが毎秒時に出現するか確認して下さい。
上から「ball」オブジェクトが出現し、右の方向に転がっていきます。
なぜこのような事が起こったのか確認してみましょう。
「ballspawn」スクリプトをダブルクリックしてコードを見てみます。
まず、
public GameObject ball;
↑はballオブジェクト を入れる為の変数です。
次に、
void Start () {
ballSpawn();
}
↑の細かい説明は
と言う意味です。
次の、
void ballSpawn(){
Instantiate(ball,transform.position,transform.rotation);
StartCoroutine("waitTime");
}
↑の意味は
ballSpawn()が指名されたら
void ballSpawn(){
出現させる(オブジェクト生成)
Instantiate
ballオブジェクト 「ballSpawn」オブジェクトの位置に 「ballSpawn」オブジェクトの角度で
(ball ,transform.position, transform.rotation);
waitTime()を実行して下さい。
StartCoroutine("waitTime");
}
最後の文の意味は、
waitTime()が指名されたら
IEnumerator waitTime(){
7秒間、待ってください。
yield return new WaitForSeconds(7f);
ballSpwn()の部分を実行して下さい。
ballSpawn();
}
と言う意味です。日本語に直すとこう言う感じで大体捉えてもらえればいいと思います。
次は再生ボタンを押してずっとヒエラルキーを見ておくと分かるのですが、ballが生成されたのはいいのですが、どんどん膨大な量になりヒエラルキーが埋まっていきます。
このままでは何百個のballオブジェクトがあった場合、処理が重くなる為(全体の動きがカクカクしてくる)、ballが落ちて大体の場所から削除するようにさせます。
まずメニューからGameObject→3D Object→Cubeを生成します。
そして名前を「deadObject」に変更します。
位置のPositionXを0、PositionYを-30、PositionZを0にします。
大きさをScaleXを1000、ScaleYを1、ScaleZを1000にします。
スクリプトを生成します。
ProjectからCreateボタンを押してC# Scriptを生成して下さい。
名前を「ball」にし、ダブルクリックしてMonoDevelopを開きます。
そして以下のコードを書いて下さい。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
using UnityEngine;
using System.Collections;
public class ball : MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
void OnCollisionEnter(Collision col){
if(col.gameObject.name == "deadObject"){
Destroy(gameObject);
}
}
}
ーーーーーーーーーーーーーーーーーーーーーーーーーーーー
書いたらビルドしてUnity側に戻って下さい。
そしてAssetsフォルダー内にある「ball」オブジェクトをクリックして「ball」スクリプトをクリックしたまま、ballオブジェクトにドラッグ&ドロップして下さい。
スクリプトを入れたら再生ボタンを押して下さい。
するとballオブジェクトは「deadObject」オブジェクト(白い地面)に当たると削除されます。
では何故このような事が出来たのか確認してみましょう。
「ball」スクリプトをダブルクリックしてMonoDevelopを開きます。
void OnCollisionEnter(Collision col){
if(col.gameObject.name == "deadObject"){
Destroy(gameObject);
}
}
↑の細かい意味は、
何かのオブジェクトに接触したら実行します。
void OnCollisionEnter(Collision col){
もし 接触したオブジェクトの名前 が deadObjectなら
if (col.gameObject.name == "deadObject"){
削除 このオブジェクト
Destroy (gameObject);
}
}
と言う意味です。
なので「deadObject」オブジェクトに当たるとballオブジェクトは削除されているのです。
次は「deadObject」オブジェクトが白く見えており、これを透明にして見えないようにさせます。
「deadObject」オブジェクトをクリックして右に表示された情報(インスペクター)の下にMesh Rendererと書いてある横にチェックがついてます。
このチェックを外してください、以下のようになります。
これで透明になって見えなくなりました。
忘れていた事が1つ。
Playerをクリックして右の情報からRigidbody内にあるConstrantsの逆三角のボタンを押して開きFreeze RotationのXYZに全てチェックを入れて下さい。
これはPlayerのRotation(回転)を使用しない為という事と、カメラがグルグル回転する場合がある為です。
次回は舞台の完成とPlayerを追従しくる敵の生成と色付けを行いたいと思います。