##目的
初心者のunityに対する苦手意識の克服
用意されたスクリプトを使用することで、ノンコーディングでゲーム製作が可能になり、unityの操作感とunityで何処まで出来るのかを把握していただきます。
##初めに
まだunityのインストールをしていない人はこちらからインストールをお願いします。
https://store.unity.com/ja
unityについての情報はこちらのまとめてあるサイトがお勧めです
https://www.sejuku.net/blog/6616#Unity
まず、今回製作するゲームについて紹介したいと思います。
スタートするとまずこのようなスタートボタンのある画面が表示され、
ボタンを押すとこのように的が表示されて
クリックすると弾が発射され、的が消えるようなゲームです。
的は5秒に10個のペースで増えていき、40個消したところでクリア画面が表示されるようになっています。(ここ)
###では早速始めていきたいと思います
unityを開いてください
今回は「shootingGame」と名付けます
以下のような画面が表示されたらOKです
##スタート画面の作成
まずスタート画面を作っていきます。
- スタートボタンの作成
まず初めに、スタートボタンを作ります
以下の動画のようにボタンを生成します
生成方法は画面左上のhierarlyビューというところのcreate->UI->Buttonを押すと作成できます。
ここで生成したボタンの名前をスタートに変えます。
以下の動画のようにbuttonを選択した状態で右上のInspecterと書いてあるビュー(今後Inspecterビューと呼んでいきます)の名前の部分を変更すると名前が変更できます。
ここで一度ゲーム画面を見てみると、ボタンの位置が下にずれていると思います
(ゲーム画面は真ん中の大きな画面の「game」タブをクリックすると表示できます)
なので、ボタンを選択した状態で右のInspecterビューのpositionのyのところを0に変更します。
これでボタンの配置ができました
##gameシーンの作成
このゲームではスタートボタンを押すと、ゲーム画面に移行しなければならないので新しくシーンというものを作っていきます。
Unityでは
「GameObjectの配置座標」や「GameObjectにアタッチされたコンポーネント」等はScene(.unity拡張子)ファイルに保存されます。
また、任意のSceneを呼びこむことで、そのsceneに含まれているGameObjectを展開することが出来、複数のSceneを用意し適宜切り替えることで、容易に画面遷移を実現することが出来るようになります
詳しいことはこちらのリンクをご覧ください
https://qiita.com/lycoris102/items/bf0a9ec4a653b4dd97b9
シーンの作り方は
Pojectビュー上の[create]ボタン (もしくは右クリック > Create) からSceneを選択
もしくは上部メニューより [Edit] => [NewScene] を選択することで新規Sceneが読み込まれます。
名前はgameにしましょう。
これで遷移先のゲームシーンを制作できました。
今作成したのは空のシーンですが、現在のシーンも別にして保存する必要があります。
ここで、一度ctrl + sキーを押してみてください。
すると以下のような画面が表示されると思います。
これは現在のシーンを保存してくれるための画面なので名前をstartにして保存してておきましょう
一動作ごとにこのように保存しておくと、あとでデータが保存されていないという事故を防ぐことができます。
##buttoncontrollerスクリプトの作成
次にボタンの設定を行います。
unityでボタンを扱うとき、ボタン内の設定でスクリプトをセットしてからスクリプト内のメソッドを読み込む形で処理が行われます。
よってまずはボタンを押すと、ゲーム画面に移行するメソッドを書いたスクリプトを作成する必要があります。
スクリプトの生成方法は画面下部のprojectビューというところからCreate > C# Scriptをクリックすると生成できます。
作成したスクリプトをダブルクリックで開いてください。
すると以下のような画面が開くと思います。
それぞれ初期に書かれている内容は消去してかまいませんので
以下の内容をコピー&ペーストで貼り付けてください。
##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ボタンにドラッグアンドドロップで適用します。
(このようにスクリプトをくっつけることをアタッチといいます)
これでbuttoncontrollerスクリプトの適用ができました。
##ボタンを押すとスクリプト内のメソッドが呼ばれる仕組みの実装
まず、startボタンのInspectorビューをご覧下さい(startボタンを選択した状態で右側に表示されます)
このような画面が表示されていると思います
(Source Imageは、ボタンの画像を指定することができるので、今回は関係ありませんが興味がおありでしたら後でいじってみてください)
まずはOn Clickと書かれているところのプラスボタンを押して、新しいイベントを作成して下さい
すると
以下のような画面が表示されると思います
続いて、Noneと書かれているところにstartボタンをドラッグアンドドロップしてください。
最後にNo Functionと書かれているところをクリックし、先ほど作成したbuttonScript->gamestartを選択して下さい
ここでgameresetを選択してしまうとstart画面からstart画面へ遷移してしまうので注意しましょう
これでシーン遷移の実装はできました。
##ビルドセッティングの設定
しかし、この状態でプレイすると実際はエラーが起きてシーン遷移が起きません。
unityではシーン遷移を設定する場合、ビルドセッティングと呼ばれるものの設定を行う必要があります。
Build Settings ウインドウにアクセスするには、ファイルメニューから File > Build Settingをクリックします。
その後、画面下部のprojectビューの中のAssetsタブの中のシーンを
以下の動画のようにstart→gameの順にドラッグアンドドロップしてください
ドラッグアンドドロップ出来たらそのままビルドセッティングの画面を閉じてください。
では実際に一度ゲームをプレイしてみましょう!
startシーンを選択していることを確認して画面上の▶のボタンを押します。
このようにボタンをクリックしたときにgameシーンに遷移できていたらOKです
これでスタート画面の作成は完了です
##ゲーム画面の作成
ゲーム画面の完成系は以下のようになります
では、作成して行きます
まず、現在startシーンにいると思うのでgemeシーンをダブルクリックしてgameシーンを表示しましょう
まず下準備として「plane」と空の「gameobject」を作成します。
空のゲームオブジェクトはcreate->Create Emptyで作成できます。
この名前はenemycontrollerにしてください。
同時にplaneを作成し、名前を「enemyrange」、Inspecter上の座標を以下のように変更します
(スクリプトで指定しているので、このenemyrangeの名前は間違えないようにしてください。)
planeはcreate->3dobject->planeで作成できます。
座標の変更は以下のように行います。
enemyrange
position : x 0、 y 2、 z 3
rotation : x -90、y 0、z 0
scale : x 3、y 1、z 1
このようになっていればOKです
しかしこのままだと白い壁が残ってしまいます。
これを透明にするためにmeshrendereのチェックを外します。
unityではオブジェクトの色を表示するためにmeshrendereコンポーネントというものを使用しており、
↓の画像のenemyrangeのInspecterを見てみましょう
するとmeshrendererという項目があると思います。
これのチェックボックスのチェックを外すと白い壁が描画されなくなります。
##target(的)の作成
今回は的はquadで作成します。
quadの生成法はHierarchyビューのcreate->3Dobject->quadで生成できます。
ついでに名前をtargetに変更します。
今回のゲームはこのtargetを生成範囲内で大量に複製するため、このtargetをprefab化する作業を行います。
prefab化は以下のようにpurojectビューにドラッグアンドドロップすることで行います。
ここで作成したtargetに対してboxcolliderコンポーネントというものを適用していきます
Collider コンポーネントとは、物理衝突のためのオブジェクト形状を定義するためのものです
これがないとbulletがtargetにぶつかった際、衝突判定が起こらずにすり抜けてしまう可能性があります。
boxcolliderコンポーネントの付け方は以下の動画のようにtargetのInspecterの一番下にあるAddComponentというところをクリックして検索窓にboxcolliderと入力すると選択できます。
これで的の作成は完了です
##bullet(弾)の作成
次は弾の作成です。
弾は3dオブジェクトのsphereを使用します。
sphereの生成法はHierarchyビューのcreate->3Dobject->sphereで生成できます。
これもtargetの時と同様に名前をbulletに変更し、projectビューにドラッグアンドドロップしてprefab化します。
ついでにここでタグの設定をします。
後に説明するスクリプトで的に弾が当たると消える操作を適用するのですが、当たったオブジェクトが弾であることを判定するためにbulletにplayerタグをつける必要があります。
以下の動画の手順でタグの変更を行ってください
タグの変更はInspecter上の名前の下にあるTagというところから選択できます
(以下の動画はこの時点のビューの状況と少し違いますが気にしないで進んでください)
##bulletとtargetの設定
###色の設定
まず、現在の的と弾の色はどちらも白で見にくいので、色を付けましょう
色を付けるためには「material」というものを使用します。
まずは以下の動画の通りにmateralを生成します。
ここではとりあえずblackと名付けましょう
次の手順では以下の動画のように「black」の色を変えていきます。
変える方法としてはまず「black」を選択した状態でInspecterビューのAlbedoという部分に注目します。
この項目のスポイトの左側にある四角形の部分をクリックすることで画面左側にカラーパレットが出現するので、そこから変更することが可能です。
このmaterialは色以外にも質感などを表すことができ、オブジェクトにアタッチ(ドラッグアンドドロップ)することで適用できます。
試しにbulletとtargetに先ほど作ったmaterialをアタッチしてみましょう
これで二つに色がついていると思います。
オリジナル性を出したい人は色を変えてみたりすると良いと思います。
###bulletに重力を付ける。
クリックした方向にボールが飛んでいき、重力がかかっているようにするとよりリアルなゲームになるため、弾に重力を付与したいと思います
unityにおける物理挙動というのはrigidbadyというコンポーネントで制御します。コンポーネントとはゲームオブジェクトの機能的部品のことです。
これを付けるだけで重力演算が行われるようになります
付け方は以下の動画のようにbulletのInspecterの一番下にあるAddComponentというところをクリックして検索窓にrigidbadyと入力すると選択できます。
動画のようにbulletにrigidbadyを付けてみてください。
以下の画像のようになっていればOKです。
###スクリプトの適用
ここまできたら後はスクリプトを適用するだけです。
スクリプトは今回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");
}
}
}
このようになっていたらOKです。
では、これらのスクリプトを適用していきます
それぞれ
enemycontrollerスクリプトはenemycontrollerに
targetスクリプトはtargetプレハブに
raycontrollerスクリプトはmaincameraに
アタッチしてください。
ここでHierarkyビュー上にあるbulletとtargetは要らないので以下の動画の通りに削除しましょう
削除は選択した状態でデリートキーを押すことで可能になります
これでスクリプトをアタッチできたのですが、この状態だといくつかエラーが起きます。
今の状態ではprojectビューにあるbulletプレハブとtargetプレハブはスクリプトで読み込めない状態になっているのでセットする必要があります
以下の動画のようにenemycontrollerのenemycontrollerスクリプトにtargetプレハブを、
maincameraのraycontrollerスクリプトにbulletプレハブをアタッチしてください。
これでプレイすると、見事にtargetがランダムに表示されクリックしたところにbulletが
飛んでいくようなゲームが完成したと思います
最後にゲームのクリアシーンを作っていきましょう
以下の動画のように「gameclear」という名前のシーンを作っていきます
この名前もスクリプトから使用しているので変えないようにしてください
このようにクリア画面を作ります
以下の動画のようにビルドセッティングの画面でgameclearのシーンを追加できれば完成です
ここまで完成したら自分のオリジナリティを出していきましょう
例として
1.玉の種類を変える
2.的のオブジェクトを変えてみる
3.当たった時のエフェクトを付ける
これらを自分で調べて作ってみましょう
Asset storeなどを使うとより簡単にきれいなものがつかえるようになります