In medio stat virtus

雰囲気研究者です。

オブジェクトが落ちてくるところの実装と当たり判定:初歩編

Unityで落ちてくるものを避けるゲームを実装中。

まだまだよくわかんねえ

当たり判定は↓とか本を参考にしたので割愛

Unityの2Dゲームで「当たり判定」の基本を30分で理解するコツ!(前編) - Unity不定期便

 

参考文献:

Amazon.co.jp: Unityではじめる2Dゲーム作り徹底ガイド スマートフォンでも遊べる本格ゲーム開発に挑戦: 大野 功二: 本

 

ボルコフに教えてもらったことをまとめながら書きます

ボルコフありがとう

 

今回の目標:設定したものがランダムに落ちてくる、あたったら消える

 

f:id:redbuller:20150204022629p:plain

↑ロケットがプレイヤー。横移動する。☆と青い鳥が障害物、あたったら障害物が消える

(フォルダにあった適当な素材を使ってるから見栄えは気にしないで)

 

今回メモする概要

・作るべきスクリプトの種類と使い道
→プレイヤーの横移動など

・Prefabつかって落ちてくる素材を作る

 

1.作るべきスクリプトの種類と使い道について

最低限作らないとダメなスクリプト

*プレイヤー操作に使うスクリプト("Player"とする)

*空のゲームオブジェクトに使うランダムに落ちてくるように障害物を呼び出すスクリプト(”CreateEnemy”とする)

*でてくる障害物に使われるどういう動きをするかのスクリプト(”ControlEnemy”とする)

 の3つ。

 

キャラクターコントローラーとかクラス構造したほうがいいらしいけどまだよくわかんないから今回はパス

 

Player.cs

今回実装する内容はプレイヤーの横移動。

 

>|C#|

public class Player : MonoBehaviour {

    // GlobalVariable for Inspector

    public Vector3 acceleration;
    public float threshold;
    public float power;



    // Use this for initialization
    void Start () {
    }

    // Update is called once per frame
    void Update () {
    
        acceleration = Input.acceleration;
        float x;

            x = Input.GetAxis ("Horizontal");

        if (x > threshold) {
            rigidbody2D.velocitynew Vector2(1,0)*power;
            //            rigidbody2D.AddForce (new Vector2 (power0));
        } else if (x < -threshold) {
            rigidbody2D.velocity=new Vector2(-1,0)*power;
//            rigidbody2D.AddForce(new Vector2 (-power,0));
        }

||< 

 

プレイヤーキャラの横移動だとInput.GetAxis("Horizontal")だけでInputマネージャーに登録されたデバイスがどんなデバイスなのか気にせずに値だけを利用することが可能。

ゲームコントローラーでもカーソルキーでもOKだけど一度傾けた時に得る値はデバイスによって違うっぽい

※Inputマネージャーは入力機器を扱うところ

 

Axesの種類に二種類あるから違いを。

*GetAxisRaw:スムージングなしで取得。アナログスティックを動作させたような値を取得する。キャラの速度変化が離散的。

*GetAxis:スムージングありで取得。速度変化が連続的だから立つ、歩く、走るなど使い分けたいときによい。

 

今回はGetAxisをつかう。

次にAxesのプロパティについて

Edit>Profect Settings>Input

を選ぶとInspectorにAxesがでてきてSnap、Gravity、Sensitivity等がいじれる

*Snap:反対方向に行くとき一度減速してから移動を始めたいときはOFFに、アクションゲームとかですぐに切り替えたいときはONにするとよいらしい

*Gravity:ボタンを話した時0に戻る速度。大きすぎると反応が遅いと感じる

*Sensitivity:MAX速度に向かうための単位速度。精密な操作の時は大きく(大き過ぎたらつるつるする印象…)大雑把なら小さく設定。(小さ過ぎたらかくかくってかんじ)

 

これでどっちに移動したいかがわかったから、次は加速させていく

rigitbody2D.AddForceかrigidbody2D.velocityを使う。

thresholdは閾値。こだわらなかったら0で場合分けでもよさそう

 

*AddForce:速度変化が連続的だからリアルな変化をする。一瞬だけ踏み込んだように最初加速してその後減速して停止する

 *velocity:ある速度を指定するとずっとそれで走り続けようとする。減速しないから単純な動きをするときよさそう

 

コメントアウトしているけどどっちも使える〜。

それぞれでGravityとかをいじってすべり過ぎないように調整は必要そう。

 

これで横移動はOK〜

必要に応じてヒットポイントとか足していくとか付け加えたりする。

 

 CreateEnemy.cs

>|C#|

public class CreateEnemy : MonoBehaviour {

    public float interval;
    private float DeltaTimer;
    public GameObject[] copyEnemy;
//    private int Stage;

    // Use this for initialization
    void Start () {
        DeltaTimer = 0f;
    }
    
    // Update is called once per frame
    void Update () {
        DeltaTimer += Time.deltaTime;

        if (DeltaTimer > interval) {
                        int enemyType = Random.Range (04);
                        switch (enemyType) {
                        case 0:
                                Instantiate (copyEnemy [0], new Vector3 (Random.Range (-3f3f), 50), Quaternion.identity);
                                break;
                        case 1:
                                Instantiate (copyEnemy [1], new Vector3 (Random.Range (-3f3f), 50), Quaternion.identity);
                                break;
                        case 2:
                                Instantiate (copyEnemy [2], new Vector3 (Random.Range (-3f3f), 50), Quaternion.identity);
                                break;
                        case 3:
                                Instantiate (copyEnemy [3], new Vector3 (Random.Range (-3f3f), 50), Quaternion.identity);
                                break;
                        }

                        DeltaTimer = 0f;
                }
    }
}
<||

 

ゲームオブジェクトの配列を宣言することで落ちてくる敵を後でInspectorから設定できる

ランダムで得た数で場合分け、switchで4種類の敵が落ちてくるように設定。

Instantiateはインスタンス(プレハブをシーンに追加するときに生成されるもの)を作成する意味らしい。へえ〜

 

intervalで障害物の発生速度を調整できるようにしてある。0にするとどばどば出てくるから注意。(それはそれで面白いけど)

 

これで降ってくる仕組み完成!

空のゲームオブジェクトを作ってこのスクリプトをいれる。

 

ControllEnemy.cs

>|C#|

public class ControlEnemy : MonoBehaviour {

    public float  Loop_Speed;
    public float down_length;
    private float DeltaTimer;


    // Use this for initialization
    void Start () {
        DeltaTimer = 0f;
    }

    // Update is called once per frame
    void Update () {
    
        DeltaTimer += Time.deltaTime;

        if(DeltaTimer > Loop_Speed){
           transform.position += new Vector3(0,-down_length,0);
        DeltaTimer = 0f;
    }
    }

    void OnTriggerEnter2D(Collider2D Coll){
        Destroy (gameObject);
        }
}

<||

 

Loop_Speedで障害物が一回分落下するのにかかる時間を調整

down_lengthで一度に障害物が落下する距離を調整

あたったら消える設定はOnTriggerEnter2Dで。

 

最低限これだけあれば大丈夫なはず。。

 

2.Prefabを使う

 プレハブはUnity - プレハブにある通りらしい。

BoxCollider2Dとかの物理エンジンスクリプトを付け加えたオブジェクトをまるまる素材として扱うときの単位ってかんじぽい

 

リンク先ではごにょごにょあるけど、素材をHierarchyに置いて色々調整して、できあがった素材をAssetsに戻すだけ!

 落下物にControllEnemyとか物理エンジン調整したものをいれてプレハブを作ったら

CreateEnemyをいれた空のゲームオブジェクトを選択、Inspectorからsizeをいじって配列数を変える。

その後Ellementからプレハブの素材を選ぶとふってくるインスタンスが選択されたことになる。(日本語あってんのかなこれ。。)

 

f:id:redbuller:20150204050949p:plain

 

 

 

 とりあえずこれで今回の目標はできるはず〜

IsTriggerにチェックし忘れてぶつかってんのにコロコロ転がられてあぁ〜〜ってなったから今度から気をつけよ〜

 

 

これからの目標は

 

プレイヤーの向きが変わる

あたった時のエフェクト

障害物の多様性ブラックホールに吸い込まれそうになる)

ステージの拡張

 

てかんじで。。まだまだ初歩的だなあ