プログラミング”ド素人”のUnity奮闘記

プログラミングが全く分からない超絶初心者がUnityでゲームを作るために日々奮闘している所です

【Unity】uGUIについて① スコア表示編

以前の更新からだいぶ時間が経ってしまいしたが、また書いていきたいと思っています。

今回は、おもちゃラボさんのシューティングゲーム第5回を参考にし、分割して更新していきたいと思っています。

nn-hokuson.hatenablog.com

あくまでも個人用のメモとしての役割に重きを置いていますので、ご了承下さい。

もしかしたら捉え方が間違っているかもしれないのですみません。

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;←uGUIを使用する際は必ず記載しないとエラーが出る。

public class UIController : MonoBehaviour {
    int score=0;←scoreがまず0から開始することを宣言する。
    GameObject scoreText;←scoreTextを格納する為の箱を作成。スクリプトから扱える様にする。

    public void AddScore(){
        this.score += 10;←AddScoreを呼び出す度にscoreの中身を10ずつプラスしていく。
    }

    // Use this for initialization
    void Start () {
        this.scoreText = GameObject.Find ("Score");←開始と同時にscoreTextにHierarchy内のCanvas▻Scoreを代入する。
    }
    
    // Update is called once per frame
    void Update () {
        scoreText.GetComponent<Text> ().text = "Score:" + score.ToString ("D4");←scoreTextのtextにScore:と現状のスコアを代入する。※1

    }
}

※1 ToString関数は数値を文字に変換する。

隕石を破壊する度に更新されているスコアを画面上に文字として表示する為に用いている。

また、カッコ内のD4について、Dは整数で4は4桁という意味。

4の部分を3にすると3桁に変わる。

Dの部分をCにすると通貨を表し、$(ドル)で文字が表示される。

 

下記のサイト様を参考にさせて頂きました。ありがとうございます。

書式を指定して数値を文字列に変換する - .NET Tips (VB.NET,C#...)

 

次は、弾と隕石が衝突した時にスコアが更新されるようにするために追加されたスクリプトを見ていきたいと思います。

下記でいう赤文字の部分になります。

using UnityEngine;
using System.Collections;

public class BulletController : MonoBehaviour {

public GameObject explosionPrefab;

void Update () {
transform.Translate (
0, 0.2f, 0);

if (transform.position.y > 5) {
Destroy (gameObject);
}
}

void OnTriggerEnter2D(Collider2D coll) { // 衝突したときにスコアを更新する
GameObject.Find (
"Canvas"
).GetComponent<UIController> ().AddScore ();←OnTriggerEnter2D※は衝突した時に判定する時に使用。

Hierarch内の"Canvas"に適用したスクリプトの<UIController>の中にあるAddScore関数を呼び起こす。
              
// 爆発エフェクトを生成する
GameObject effect = Instantiate (explosionPrefab, transform.position, Quaternion.identity)
as GameObject;
Destroy (effect,
1.0f);

Destroy (coll.gameObject);
Destroy (gameObject);
}
}

 

※OnTriggeerについて

OnTriggeerEnterは衝突した瞬間

OnTriggeerExitは衝突が終わった瞬間

OnTriggerStayは触れている時に使用する。

【Unity】InvokeRepeatingについて

今回は、InvokeRepeatingについて書いていきたいと思います。

参照記事はおなじみ『おもちゃラボ』様です。

nn-hokuson.hatenablog.com

 

実際に記入したスクリプトを見ていきましょう。

using UnityEngine;
using System.Collections;

public class RockGenerator : MonoBehaviour {

public GameObject rockPrefab;
//rockPrefabをRockGeneratorへ代入するための箱を作成するために宣言する。

箱にprojectビューのrockPrefabをドラッグ&ドロップで入れる事で、適用される。


void Start () {
InvokeRepeating ("GenRock", 1, 1);
}
//InvokeRepeatingは、数秒おきに自動的に物を生成するための関数。

InvokeRepeating("関数名,初回呼び出しまでの秒数,次回呼び出しまでの秒数)

GenRockの部分は、関数名なので自分で自由に設定してよい。


void GenRock () {

//GenRockは先ほど上記で指定した関数名。上記と連動している。

 

Instantiate (rockPrefab, new Vector3 (-2.5f + 5 * Random.value, 6, 0), Quaternion.identity);
}
}

//Instantiateは、Aという物をBの場所に出現させる時に使用する。

Instantiate(出現させたい物,生成位置,回転角)

new Vector3とすることで、(x方向の出現位置,y方向の出現位置,z方向の出現位置)を設定している。

x方向基準の位置を-2.5(Game画面上一番左端)、Random.valueでランダムに取り出した0.1~1.0の数値×5でx方向に出現させる位置を決定している。

5というのは画面全体の幅が5ということ。

基準の値が-2.5を始まりとしているから、Game画面の真ん中を0とすると、5を足すことでx方向Game画面全体に出現させることが出来る。

y方向は、6、z方向は2Dのゲームなので無し。0。

Quaternion.identityは、回転角を表しているのでtransform.rotationでも可。

【Unity】Random.valueについて

更新は私生活の都合上止めておりましたが、Unityのことを考えない日は1日もありませんでした。これって恋か。。。。?♡

 

またまたUnityについて書いていきます。

今回は、Random.valueについてです。

参照記事

nn-hokuson.hatenablog.com

隕石を落とすためのスクリプトについて理解していきたいと思います。

using UnityEngine;
using System.Collections;

public class RockController : MonoBehaviour {

float fallSpeed;//←まず隕石が落ちるスピードを宣言
float rotSpeed;//←続いて隕石の回転スピードを宣言

void Start () {
this.fallSpeed = 0.01f + 0.1f * Random.value;

//fallSpeedは、落下速度という意味。

隕石落下の基準のスピードが0.01。

Random.valueは、0.1~1までの値をランダムに取り出す。

基準スピードの0.01にRandom.valueで取り出した0.1~1.0へ×0.1をした値を足すことで隕石の落下速度としている。

Random.valueを使うことで隕石落下の速度が毎回変化する。

 

this.rotSpeed = 5f + 3f * Random.value;
}
//rotSpeedは回転速度という意味。(rotはrotationの略だと思われる)

隕石の基準の回転速度5へRandom.valueで取り出した0.1~1.0へ×3をすることで、隕石の回転速度としている。

これもまた毎回隕石の回転速度が変化する。


void Update () {
transform.Translate( 0, -fallSpeed, 0, Space.World);

//transform.Translateは、物を動かす時に使用する。

transform.Trasnlate(x方向の速度,y方向の速度,z方向の速度)

Space.Worldと入力しないと、画面から見えない所で動作してしまう。


transform.Rotate(0, 0, rotSpeed );

//transform.Rotateは、物を回転させたい時に使用。

transform.Rotate(x方向の回転速度,y方向の回転速度,z方向の回転速度)


if (transform.position.y < -5.5f) {

//もし物のy方向の位置が-5.5を超えるとという意味。

Destroy (gameObject);

//上記のifが達成された時、その物を削除する。

Destroy(gameObject)と入力すると自分自身を削除。
}
}
}

【Unity】Instantiate関数について

忘れ防止のためちょこちょこ書きなぐっていきます。

今回もまた、おもちゃラボ様の記事を参考に進めていきたいと思います。

第2回へ突入です。

nn-hokuson.hatenablog.com

 

Instantiate関数とは、シューティングゲームで例えると、プレハブ化した物をプレイヤーが発射する時に使用する関数みたいなイメージです。

実際に記入したスクリプト(赤字)

〇プレイヤー

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RocketController : MonoBehaviour {
    // Use this for initialization
    public GameObject bulletPrefab;

    // Update is called once per frame
    void Update ()
    {
        if (Input.GetKey (KeyCode.LeftArrow)) {
            transform.Translate (-0.1f, 0, 0);
        }
            if (Input.GetKey (KeyCode.RightArrow)) {
                transform.Translate (0.1f, 0, 0);
            }
        if (Input.GetKeyDown (KeyCode.Space)) {
            Instantiate (bulletPrefab, transform.position, transform.rotation);
            }
        }
    }

 

〇弾

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BulletController : MonoBehaviour {
    // Update is called once per frame
    void Update () {
        transform.Translate (0, 0.1f, 0);
        if (transform.position.y > 5) {
            Destroy (gameObject);
        }
    }
}

 

〇プレイヤー

public GameObject bulletPrefab;

 if (Input.GetKeyDown (KeyCode.Space)) {
            Instantiate (bulletPrefab, transform.position, transform.rotation);

→bulletPrefabを定義

 スペースキーが押された瞬間、bulletPrefabをプレイヤーの場所から発射する。

Instantiate関数(ゲームオブジェクト,弾を生成する位置,弾の角度)を表す。

transform.rotationの所は、Quaternion.identityと記入しても両者がイコールのようなので、どちらでも良い。

最初のpublic GameObject bulletPrefab;を定義しておかないと弾が生成されない。弾の生成を急ぎ過ぎて、Instantiate関数に注意を向け過ぎないように注意する。

 

〇弾

transform.Translate (0, 0.1f, 0);
        if (transform.position.y > 5) {
            Destroy (gameObject);

→弾をy方向へ0.1fの距離進め、y方向へ進んだ距離が5に達したら弾を消去する。

【Unity】Input.GetKeyによる方向キーでの動かし方

初心者向けのサイト様をまたまた巡りまして、2Dゲーム製作を開始しました。

『おもちゃラボ』様という、はてなブログの記事を参照させていただきながら取り掛かりました。

nn-hokuson.hatenablog.com

 

今回学んだのは、Input.GetKeyを用いた方向キー入力によるプレイヤーの移動の方法です。

 

 

実際に記入したスクリプト

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RocketController : MonoBehaviour {

    // Use this for initialization
    void Start () {
        
    }
    
    // Update is called once per frame
    void Update ()
    {
        if (Input.GetKey (KeyCode.LeftArrow)) {
            transform.Translate (-0.1f, 0, 0);
        }
            if (Input.GetKey (KeyCode.RightArrow)) {
                transform.Translate (0.1f, 0, 0);
            }
        }
    }

 

 

if(Input.GetKey(KeyCode.LeftArrow)){

  transform.Translate(-0.1f,0,0);

→方向キー"左"を押している間だけ、-0.1の距離ずつX方向へ進む

 "LeftArrow"が方向キー"左"を意味する。

 

if(Input.GetKey(KeyCode.RightArrow)){

  transform.Translate(0.1f,0,0);

→方向キー"右"を押している間だけ、0.1の距離ずつX方向へ進む

 "RightArrow"が方向キー"右"を意味する。

 

キーを押して何かアクションを起こす際は、

Input.GetKeyを使う。

物を動かしたい際は、

transform.Translate(x方向の移動量,y方向の移動量,z方向の移動量);

キー入力によって、プレイヤーを動かしたい際には、上記を組み合わせて使用する。

 

Input.GetKeyについて

これまで、unityのゲームを色々な初心者向けのサイト様を巡りながら作っているところなのですが、GetKeyが一向に覚えられない、、(笑)

GetKeyの中にも、「そのキーを押している間だけ」とか「キーを押した瞬間だけ」出力されるという感じに複数あって、毎回初心者向けのサイト様のスクリプトを参照している時に、

『GetKeyDownってなんだっけ??』

『GetKeyUp????wwwwwヒヤホッホホオオオオhhッホオオオwww』

みたいになっちゃうので簡単ですが覚えるためにメモを残しておこうと思います。

 

  1. Input.GetKey

→キー押しっぱなしを検知する

 

if(Input.GetKey("Space")){

   Debug.Log("Spaceキーを押している間だけ");

}

 

 2.  Input.GetKeyDown

→キーが押された瞬間を検知する

 

if(Input.GetKey("Space")){

   Debug.Log("Spaceキーが押された瞬間だけ");

}

  

 3.Input.GetKeyUp

→キーが離された瞬間を検知する

 

if(Input.GetKey("Space")){

   Debug.Log("Spaceキーが離された瞬間だけ");

}

Unity始めた!C#で!

初めまして!Unity初心者のココです!

一週間くらい前から「ゲームをやるだけじゃなくて自分でも作ってみたいな〜」という事で、UnityをJavaScriptで触り出して、ブロック崩しを色んなサイトを巡りながらようやく完成させました。

んで、その後にスーパーマ●オ的な2Dのゲーム製作に乗り出しましたが、

何故か永遠にジャンプし続け、ググりながら修正を繰り返すも、画面から消え去り、天へと召されて行く姿を見て挫折、、。

ググっていて気付いたのですが、ネットでの情報はほぼほぼ「C#」で、「JavaScript」で解説してある記事が圧倒的に少なかった、、。

これらを踏まえ、「C#」でUnityを頑張る事を決意。

本日10/31、ハロウィンの日に記念すべき「C#Unityデビュー」を飾る事が出来ました。

さて、インプットをしたらアウトプットをしなければ自分の中に定着しないので、これからは学んだ事を記していきたいと思います。


備忘録的な感じですのであしからず笑

今日は遅いんでこれくらいにします。

おやしみなさい!