LoginSignup

This article is a Private article. Only a writer and users who know the URL can access it.
Please change open range to public in publish setting if you want to share this article with other users.

More than 3 years have passed since last update.

unity的あてゲーム

Last updated at Posted at 2018-05-11

目的

初心者のunityに対する苦手意識の克服

用意されたスクリプトを使用することで、ノンコーディングでゲーム製作が可能になり、unityの操作感とunityで何処まで出来るのかを把握していただきます。

初めに

まだunityのインストールをしていない人はこちらからインストールをお願いします。
https://store.unity.com/ja

unityについての情報はこちらのまとめてあるサイトがお勧めです
https://www.sejuku.net/blog/6616#Unity

まず、今回製作するゲームについて紹介したいと思います。

https://gyazo.com/05b8fd1e2b146156ff33dae2c64fdf14

スタートするとまずこのようなスタートボタンのある画面が表示され、

ボタンを押すとこのように的が表示されて

https://gyazo.com/6720723ccf80c6655fbb91ba24432c41

https://gyazo.com/6122246a1278f7d671336a7ff88fe99c

クリックすると弾が発射され、的が消えるようなゲームです。

的は5秒に10個のペースで増えていき、40個消したところでクリア画面が表示されるようになっています。(ここ)

では早速始めていきたいと思います

unityを開いてください

https://gyazo.com/92211f8467362a3fed461e0f5887397f

今回は「shootingGame」と名付けます

https://gyazo.com/79a46a0443c598b6c94ba450b127f844

以下のような画面が表示されたらOKです

スタート画面の作成

まずスタート画面を作っていきます。

  • スタートボタンの作成 まず初めに、スタートボタンを作ります

以下の動画のようにボタンを生成します

生成方法は画面左上のhierarlyビューというところのcreate->UI->Buttonを押すと作成できます。

https://gyazo.com/6bdecc23823a2a5b175f14539a102a81

ここで生成したボタンの名前をスタートに変えます。
以下の動画のようにbuttonを選択した状態で右上のInspecterと書いてあるビュー(今後Inspecterビューと呼んでいきます)の名前の部分を変更すると名前が変更できます。

https://gyazo.com/cb10109e0ee30b4dd8f1fde6794adc08

ここで一度ゲーム画面を見てみると、ボタンの位置が下にずれていると思います
(ゲーム画面は真ん中の大きな画面の「game」タブをクリックすると表示できます)

なので、ボタンを選択した状態で右のInspecterビューのpositionのyのところを0に変更します。

https://gyazo.com/8dac80574c6efa93c75651224765f018

これでボタンの配置ができました

gameシーンの作成

このゲームではスタートボタンを押すと、ゲーム画面に移行しなければならないので新しくシーンというものを作っていきます。

Unityでは
「GameObjectの配置座標」や「GameObjectにアタッチされたコンポーネント」等はScene(.unity拡張子)ファイルに保存されます。

また、任意のSceneを呼びこむことで、そのsceneに含まれているGameObjectを展開することが出来、複数のSceneを用意し適宜切り替えることで、容易に画面遷移を実現することが出来るようになります

詳しいことはこちらのリンクをご覧ください
https://qiita.com/lycoris102/items/bf0a9ec4a653b4dd97b9

シーンの作り方は
Pojectビュー上の[create]ボタン (もしくは右クリック > Create) からSceneを選択
もしくは上部メニューより [Edit] => [NewScene] を選択することで新規Sceneが読み込まれます。

名前はgameにしましょう。

https://gyazo.com/cd79f6b50facf5a0b87d4183fef0c4da

これで遷移先のゲームシーンを制作できました。

今作成したのは空のシーンですが、現在のシーンも別にして保存する必要があります。

ここで、一度ctrl + sキーを押してみてください。

すると以下のような画面が表示されると思います。

これは現在のシーンを保存してくれるための画面なので名前をstartにして保存してておきましょう

一動作ごとにこのように保存しておくと、あとでデータが保存されていないという事故を防ぐことができます。

https://gyazo.com/ed293d2386b9944094c536f123653da0

buttoncontrollerスクリプトの作成

次にボタンの設定を行います。

unityでボタンを扱うとき、ボタン内の設定でスクリプトをセットしてからスクリプト内のメソッドを読み込む形で処理が行われます。

よってまずはボタンを押すと、ゲーム画面に移行するメソッドを書いたスクリプトを作成する必要があります。

スクリプトの生成方法は画面下部のprojectビューというところからCreate > C# Scriptをクリックすると生成できます。

https://gyazo.com/68a3e4b581e4e958d1a36a1092eefcfd

作成したスクリプトをダブルクリックで開いてください。

すると以下のような画面が開くと思います。

それぞれ初期に書かれている内容は消去してかまいませんので

以下の内容をコピー&ペーストで貼り付けてください。

https://gyazo.com/1e9636ed89404a26e77d517948c52a16

buttoncontrollerスクリプト


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

public class buttoncontroller : MonoBehaviour {

    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update () {

    }
    public void gamestart(){
        SceneManager.LoadScene("game");
    }
    public void gamereset(){
        SceneManager.LoadScene("start");
    }
}


ここで1つ注意してほしいのは、クラスの名前とスクリプトの名前が同じになるようにコピー&ペーストしてください。

ここを間違えるとエラーが起きてしまい、ゲームを実行できなくなってしまいます。

では、この出来上がったスクリプトをstartボタンにドラッグアンドドロップで適用します。
(このようにスクリプトをくっつけることをアタッチといいます)

https://gyazo.com/993c201bd2ddcae32d44e58f43604d06

これでbuttoncontrollerスクリプトの適用ができました。

ボタンを押すとスクリプト内のメソッドが呼ばれる仕組みの実装

まず、startボタンのInspectorビューをご覧下さい(startボタンを選択した状態で右側に表示されます)

image.png

このような画面が表示されていると思います

(Source Imageは、ボタンの画像を指定することができるので、今回は関係ありませんが興味がおありでしたら後でいじってみてください)

まずはOn Clickと書かれているところのプラスボタンを押して、新しいイベントを作成して下さい
すると
以下のような画面が表示されると思います

image.png

続いて、Noneと書かれているところにstartボタンをドラッグアンドドロップしてください。

最後にNo Functionと書かれているところをクリックし、先ほど作成したbuttonScript->gamestartを選択して下さい

ここでgameresetを選択してしまうとstart画面からstart画面へ遷移してしまうので注意しましょう

https://gyazo.com/26cad0278bace4ee77528eae2944e6b5

これでシーン遷移の実装はできました。

ビルドセッティングの設定

しかし、この状態でプレイすると実際はエラーが起きてシーン遷移が起きません。
unityではシーン遷移を設定する場合、ビルドセッティングと呼ばれるものの設定を行う必要があります。

Build Settings ウインドウにアクセスするには、ファイルメニューから File > Build Settingをクリックします。

その後、画面下部のprojectビューの中のAssetsタブの中のシーンを

以下の動画のようにstart→gameの順にドラッグアンドドロップしてください

https://gyazo.com/6db0c34971b4375b3a6b8859eaafcb16

ドラッグアンドドロップ出来たらそのままビルドセッティングの画面を閉じてください。

では実際に一度ゲームをプレイしてみましょう!

startシーンを選択していることを確認して画面上の▶のボタンを押します。

https://gyazo.com/69dfe2a24e12fca15f8d4f3be612c692

このようにボタンをクリックしたときにgameシーンに遷移できていたらOKです

これでスタート画面の作成は完了です

ゲーム画面の作成

ゲーム画面の完成系は以下のようになります

https://gyazo.com/6122246a1278f7d671336a7ff88fe99c

では、作成して行きます

まず、現在startシーンにいると思うのでgemeシーンをダブルクリックしてgameシーンを表示しましょう

まず下準備として「plane」と空の「gameobject」を作成します。

空のゲームオブジェクトはcreate->Create Emptyで作成できます。

この名前はenemycontrollerにしてください。

同時にplaneを作成し、名前を「enemyrange」、Inspecter上の座標を以下のように変更します
(スクリプトで指定しているので、このenemyrangeの名前は間違えないようにしてください。)

planeはcreate->3dobject->planeで作成できます。

https://gyazo.com/73b5374b7f7d7a960758641b640ecc77

座標の変更は以下のように行います。

enemyrange
position : x 0、 y 2、 z 3
rotation : x -90、y 0、z 0
scale : x 3、y 1、z 1

https://gyazo.com/8bf74c03576c8911bf8e59c3e8e245b4

https://gyazo.com/e0fc19a39ffb1dff0a503884feb026f5

このようになっていればOKです

しかしこのままだと白い壁が残ってしまいます。

これを透明にするためにmeshrendereのチェックを外します。

unityではオブジェクトの色を表示するためにmeshrendereコンポーネントというものを使用しており、

↓の画像のenemyrangeのInspecterを見てみましょう

するとmeshrendererという項目があると思います。

https://gyazo.com/53ef5ba331d659c8d3a31f3499fce8ba

これのチェックボックスのチェックを外すと白い壁が描画されなくなります。

https://gyazo.com/a6fdacf30684e7f36b5265742b0215c8

target(的)の作成

今回は的はquadで作成します。
quadの生成法はHierarchyビューのcreate->3Dobject->quadで生成できます。

ついでに名前をtargetに変更します。

https://gyazo.com/78b343182c2fd86585a76caf2d0f8a32

今回のゲームはこのtargetを生成範囲内で大量に複製するため、このtargetをprefab化する作業を行います。

prefab化は以下のようにpurojectビューにドラッグアンドドロップすることで行います。

https://gyazo.com/0a8a1578458e8ccd1ba76af2e617b6f4

ここで作成したtargetに対してboxcolliderコンポーネントというものを適用していきます

Collider コンポーネントとは、物理衝突のためのオブジェクト形状を定義するためのものです

これがないとbulletがtargetにぶつかった際、衝突判定が起こらずにすり抜けてしまう可能性があります。

boxcolliderコンポーネントの付け方は以下の動画のようにtargetのInspecterの一番下にあるAddComponentというところをクリックして検索窓にboxcolliderと入力すると選択できます。

https://gyazo.com/7c5efdb4b4e9f37f5ff1525aa1660026

これで的の作成は完了です

bullet(弾)の作成

次は弾の作成です。

弾は3dオブジェクトのsphereを使用します。

sphereの生成法はHierarchyビューのcreate->3Dobject->sphereで生成できます。

これもtargetの時と同様に名前をbulletに変更し、projectビューにドラッグアンドドロップしてprefab化します。

https://gyazo.com/3ba3ec0bc5ae340daf0bacc7ae0c498c

ついでにここでタグの設定をします。
後に説明するスクリプトで的に弾が当たると消える操作を適用するのですが、当たったオブジェクトが弾であることを判定するためにbulletにplayerタグをつける必要があります。

以下の動画の手順でタグの変更を行ってください

タグの変更はInspecter上の名前の下にあるTagというところから選択できます
(以下の動画はこの時点のビューの状況と少し違いますが気にしないで進んでください)

https://gyazo.com/299c40a797449103ed2171a3993f5b5c

bulletとtargetの設定

色の設定

まず、現在の的と弾の色はどちらも白で見にくいので、色を付けましょう

色を付けるためには「material」というものを使用します。
まずは以下の動画の通りにmateralを生成します。

https://gyazo.com/6531c1301b15e4d6a2b1e2f5c06ac2eb

ここではとりあえずblackと名付けましょう

次の手順では以下の動画のように「black」の色を変えていきます。
変える方法としてはまず「black」を選択した状態でInspecterビューのAlbedoという部分に注目します。

https://gyazo.com/25d0399e2d351be9be9dabecd2ed912b

この項目のスポイトの左側にある四角形の部分をクリックすることで画面左側にカラーパレットが出現するので、そこから変更することが可能です。
このmaterialは色以外にも質感などを表すことができ、オブジェクトにアタッチ(ドラッグアンドドロップ)することで適用できます。

試しにbulletとtargetに先ほど作ったmaterialをアタッチしてみましょう

https://gyazo.com/682d6049ee2d54f73c1594ba5db49af3

これで二つに色がついていると思います。

オリジナル性を出したい人は色を変えてみたりすると良いと思います。

bulletに重力を付ける。

クリックした方向にボールが飛んでいき、重力がかかっているようにするとよりリアルなゲームになるため、弾に重力を付与したいと思います

unityにおける物理挙動というのはrigidbadyというコンポーネントで制御します。コンポーネントとはゲームオブジェクトの機能的部品のことです。

これを付けるだけで重力演算が行われるようになります

付け方は以下の動画のようにbulletのInspecterの一番下にあるAddComponentというところをクリックして検索窓にrigidbadyと入力すると選択できます。

動画のようにbulletにrigidbadyを付けてみてください。

https://gyazo.com/9a85dd654d4a38989de3b966c65b1a11

以下の画像のようになっていればOKです。

https://gyazo.com/669500dd04a0e08435de97c83d1757d9

スクリプトの適用

ここまできたら後はスクリプトを適用するだけです。
スクリプトは今回3つあり、
- 弾を飛ばすスクリプト
- 的を発生させるスクリプト
- 的に弾が当たった時に的が消えるようにするスクリプト

の三つを用意しました

それぞれ

  • enemycontroller
  • target
  • raycontroller

という名前のC#スクリプトを3つ作成し、ボタンコントローラーの時のようにコピーしてください。

enemyConyrollerスクリプト

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

public class enemycontroller : MonoBehaviour {
    public GameObject target;
    public GameObject stage;
    float stageX;
    float stageY;
    float stageZ;
    float time;
    // Use this for initialization
    void Start () {
        stageX = stage.GetComponent<Renderer> ().bounds.size.x;
        stageY = stage.GetComponent<Renderer> ().bounds.size.y;
        stageZ = stage.GetComponent<Renderer> ().bounds.size.z;
        generateEnemy ();
        time = 0;
    }
    // Update is called once per frame
    void Update () {
        //GameObject[] enemies = GameObject.FindGameObjectsWithTag ("Enemy");
        time += Time.deltaTime;
        if (time >= 5) {
            time = 0;
            generateEnemy ();
        }
    }
    void generateEnemy(){
        for (int i = 0; i < 10; i++) {
            Instantiate (target, stage.transform.position + new Vector3 (Random.Range (-stageX / 2, stageX / 2),
                Random.Range (-stageY / 2, stageY / 2),
                Random.Range (-stageZ / 2, stageZ / 2)), Quaternion.identity);
        }
    }
}

targetスクリプト


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

public class target : MonoBehaviour {

    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update () {

    }
    void OnCollisionEnter(Collision other){
        if (other.gameObject.tag == "Player") {
            Destroy (gameObject);
            Destroy (other.gameObject);
            raycontroller.score += 1;
            print( raycontroller.score);
        }
    }
}

raycontrollerスクリプト

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

public class raycontroller : MonoBehaviour {
    public static int score = 0;
    public GameObject bullet;
    public float speed = 60f;
    GameObject bullet1 ;
    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update () {
        if (Input.GetMouseButtonDown (0)) {
            Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
            bullet1 = (GameObject)Instantiate (bullet, gameObject.transform.position, Quaternion.identity);
            Vector3 direction = ray.direction;
            bullet1.gameObject.GetComponent<Rigidbody> ().velocity = direction * speed;
        }
            if (bullet1.transform.position.z > 500) {
                Destroy (bullet1.gameObject);
        }
        if (score >= 40) {
            SceneManager.LoadScene ("gameclear");
        }
    }
}

https://gyazo.com/aa1c551f8560abe2a41a67ca85238825

このようになっていたらOKです。

では、これらのスクリプトを適用していきます
それぞれ

enemycontrollerスクリプトはenemycontrollerに
targetスクリプトはtargetプレハブに
raycontrollerスクリプトはmaincameraに

アタッチしてください。

https://gyazo.com/13df1131dec1fac917be2a3196e7e0ba

ここでHierarkyビュー上にあるbulletとtargetは要らないので以下の動画の通りに削除しましょう
削除は選択した状態でデリートキーを押すことで可能になります

https://gyazo.com/c03a6c851a5a988a9c70635a6d9773df

これでスクリプトをアタッチできたのですが、この状態だといくつかエラーが起きます。

今の状態ではprojectビューにあるbulletプレハブとtargetプレハブはスクリプトで読み込めない状態になっているのでセットする必要があります

以下の動画のようにenemycontrollerのenemycontrollerスクリプトにtargetプレハブを、
maincameraのraycontrollerスクリプトにbulletプレハブをアタッチしてください。

https://gyazo.com/7be1bee2569b898ea54bd02ff2487c72

これでプレイすると、見事にtargetがランダムに表示されクリックしたところにbulletが
飛んでいくようなゲームが完成したと思います

https://gyazo.com/55638b883289a67de214d410a88633e7

最後にゲームのクリアシーンを作っていきましょう

以下の動画のように「gameclear」という名前のシーンを作っていきます

この名前もスクリプトから使用しているので変えないようにしてください

Image from Gyazo

このようにクリア画面を作ります

以下の動画のようにビルドセッティングの画面でgameclearのシーンを追加できれば完成です
Image from Gyazo

ここまで完成したら自分のオリジナリティを出していきましょう
例として
1.玉の種類を変える
2.的のオブジェクトを変えてみる
3.当たった時のエフェクトを付ける

これらを自分で調べて作ってみましょう
Asset storeなどを使うとより簡単にきれいなものがつかえるようになります

0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up