狠狠撸

狠狠撸Share a Scribd company logo
シューティングゲームを作ってみ 
よう 
9/7 金沢Unity勉強会 
にゃるらと
自己紹介 
名前:にゃるらと 
Twitter:@sakura_metal 
所属:金沢大学機械工学類3年 
趣味:モノづくり(アプリ、ゲーム作り?電子 
工作、etc…)、天海春香ちゃん 
Unity歴:1年
まずお詫び 
ハンズオンっていうからには、著名な方が講演 
するんじゃないの?と考えてた方、ごめんなさ 
い。 
Unity歴1年の若造が進めていきます。 
あと、発表者集まるだろうと楽観視してたら見 
事に集まらなかったので
ここからは??? 
_人人人人人人人人人人_ 
> ずっと俺のターン< 
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y ̄ 
こんなですが最後までお付き合いいただけたらなと思いま 
す。
やること 
?鲍苍颈迟测の概要 
?鲍苍颈迟测の用语説明 
?鲍苍颈迟测の操作 
?シューティングゲームを作ってみよう
ん?シューティングゲーム? 
シューティングゲームは作るものが少なく、ゲ 
ームを作る難易度としては低めなのでハンズオ 
ンとしてはうってつけ!
鲍苍颈迟测の概要
Unityとは 
?ゲームエンジン 
?マルチプラットフォーム 
->Windows,Mac,iOS,Android,ウェブブラ 
ウザ,家庭用ゲーム機等 
?ゲーム制作におけるリソースを販売している 
Asset Storeが便利 
?最近2D機能が強化された
Unityってゲームしかつくれないの? 
そんなことはない 
わりと簡単にインタラクティブな3Dコンテン 
ツが作れます! 
お絵かき水族館ミクミク握手fuZe
Unityで使えるプログラミング言語は? 
?C# 
?UnityScript(JavaScript) 
?Boo 
ちなみに、Google検索でUnity ??と調べると 
C#???約1,660,000 件 
JavaScript???約11,500,000 件 
Boo???約642,000 件 
BooとJavaScriptでは18倍の差!
で、結局どの言語がいいの? 
?UnityScript???読みやすい。情報が多い。 
本来のJavaScriptとは少し違うので注意。 
?C#???機能が多い。VisualStudioが使える。 
?Boo???よく分からないが神言語らしい。 
使っている人が少ない。 
ざっくりやるならUnityScript、やりこむならC# 
といった感じ 
今回はC#を使っていきます。
ちなみに 
Asset StoreでplayMakerというAssetを買うと 
(今はセール中で$65)ビジュアルスクリプテ 
ィングができるので、スクリプトを書く手間が 
大きく減るらしい
鲍苍颈迟测の用语説明
Scene 
?ゲームを構成する空間 
?下のスタート画面、ゲーム画面、ゲームオー 
バー画面一つ一つがシーン
GameObject 
?Sceneの中に含まれる物体すべて 
?GameObjectの相互作用によってゲームがで 
きる
Component 
?GameObjectの機能的な部品。 
?GameObjectに貼り付けて使う。
開発の流れ 
1. Sceneを作る 
2. GameObjectをSceneに配置する 
3. GameObjectにComponentをはりつける。 
(場合によっては自作する) 
1. 動かして調整
鲍苍颈迟测の操作
まずProjectを作る 
File → New 
Project… 
を選択
Projectの作成ウィザード 
保存場所を指 
定してCreate 
を押すと新し 
いProjectが作 
られる。
鲍苍颈迟测の画面の説明
各部分の機能 
? Sceneビュー 
? Sceneの様子を表示する。GameObjectを直接、移動 
させたり、大きさを変えたりすることができる。 
? Gameビュー 
? ゲームの実行画面を表示する。 
? Projectビュー 
? ゲーム内で扱うリソースを表示。ファイルエクスプ 
ローラーみたいなもの。 
? Hierarchyビュー 
? そのSceneに配置されたGameObjectを表示。 
? Inspectorビュー 
? 詳細設定画面。
Sceneビューでの操作 
http://docs-jp.unity3d.com/Documentation/Manual/SceneView40.html
シーンを実行する 
下のような再生マークが実行ボタンです。 
ボタンを押すとGameビューで実際に動作します。 
実行中も数値などを変更できますが、停止させると元の数 
値に戻るので注意。(位置とかコンポーネントの値とか)
シューティングゲームを作ってみよう
どんなシューティングゲーム作るの? 
こんな感じ 
番外編
完成したプロジェクト 
Githubに上げました 
https://github.com/nyarurato/kzunity_hands_ 
on 
javascriptのスクリプトも上げました.
必要なものはなにか 
?地面 
?プレイヤー(カメラ) 
?的(敵) 
?弾が出るしかけ(銃) 
?スコア表示
まずシーンを保存しておく 
先述の開発の流れのシーンを作る 
部分。 
メニューからSave Sceneとして名 
前を付けて保存する。
地面を作ろう 
Terrain(地形生成) 
を使って地面を作っ 
ていきます。 
HierarchyのCreateぁ 
らTerrainを選びます
Terrainのコンポーネント 
を見ていきます。 
Terrainに関するドキュメ 
ント 
http://docs-jp. 
unity3d.com/Documentation/Component 
s/script-Terrain.html
Terrainコンポーネント 
Terrain(地形生成)に関 
する設定を変更できる。 
Terrain Width,Lengthが 
2000はちょっと広いので 
1000ぐらいにしておきま 
す 
(1000だと1km四方にな 
るのででかすぎるか 
も???)
Transformコンポーネント 
すべてのGameObjectに必 
ず付加されている。 
位置姿勢を表すコンポー 
ネント。 
Sceneビューを見ると原点 
(0,0,0)にTerrainの中央が 
来てないので(-500,0,-500) 
に変更。
Terrain Collider 
物理演算する上で必要な 
もの 
物理演算する範囲、形状 
指定のような感じ
地形をつくる前に 
Terrainで使う地面 
のテクスチャなど 
をインポートしま 
す。 
ちなみにインポー 
トするのはAssetと 
いうもので機能の 
つまった資産のよ 
うなもの。 
ちょっと時間がか 
かります。
テクスチャなどをインポート 
下のようなものが出るのでインポートを押しま 
す
Terrainコンポーネント 
のブラシのボタンを選 
択、Edit 
Texture→Add Texture 
小さなウィンドウが出 
たらselectから好きな 
テクスチャを選んで 
Apply。
全体が選んだテクス 
チャに染まります。
またさっきと同 
じようにEdit 
exture→Add 
Textureをし別 
のテクスチャを 
選びApply、 
Sceneビューで 
ドラッグすると 
テクスチャを書 
き換えることが 
できます。
地形を作ろう 
左から順に 
?地形の高さを変える 
?平坦化させる 
?滑らかにする 
Opacityでブラシの濃さを 
変更可能
木、草を生やす 
手順は地面のテクスチャ 
を選び貼る方法と一緒。 
木草 
木を追加する場合はPalm 
草を追加する場合はgrassを選ぶ
鲍苍颈迟测勉强会ハンス?オン
プレイヤーを作ろう 
Character 
Controllerをイ 
ンポートします。
プレイヤーをシーンにいれる 
First Person Controllerを 
Projectビューから 
HierarchyビューにD&Dし 
ます。
First Person Controller 
内にもカメラが入って 
おり、今回はFirst 
Person Controller内の 
カメラを使いたいので 
上のカメラは不必要と 
いうことで削除します。
実行してみよう 
再生ボタンを押すと 
実行できます。
ちなみにGameビ 
ューのMiximize 
on Playを押して 
から実行すると最 
大化して実行でき 
ます。 
Statsを押すといろ 
いろな情報が表示 
されます。
うわっ???私のゲーム暗す 
ぎ????
光源を置こう 
光源は4種類ほどありま 
すが、Directional Lightを 
使います。 
Directional Light 
?太陽と同じ役割の光源 
?設置場所によらず全体 
を照らす
明るくなったけど、次 
は空の味気なさが気に 
なる???
Skyboxを設定しよう 
Skyboxesをイ 
ンポートしま 
す。
Edit→Render Settings 
Projectビューの 
Skyboxesを選択し、下 
の赤丸の中からどれか一 
つをInspectorビューの 
Skybox MaterialにD&D
鲍苍颈迟测勉强会ハンス?オン
弾を撃ち出す仕組みをつくる 
FPSだから目の前に弾を撃つもの(銃)を表示 
させたほうがよさそう。 
叠补迟迟濒别蹿颈别濒诲4より
銃をつくる 
HierarchyビューのCreateか 
らCubeを選んで、Cubeの 
GameObjectを作ります。 
変形させて細長くしておきま 
す。 
名前もGunなど分かりやすい 
ものに変えます。
位置関係はこんな 
感じ 
GunのColliderによ 
って動きにくくな 
ることがあるので 
GunのColliderのチ 
ェックをはずす
常にカメラにGunが写っていて欲しいので、カ 
メラに追随して動くようにします。 
HierarchyビューのGunをMain CameraにD&Dし 
ます。(親子関係になる)
弾を発射させる場所を作る 
空のGameObjectを作 
ります。 
GameObject→Create 
Empty 
名前をSpawnerなどに 
かえておきます。
Gunの先あたりにSpawnerを配置します。 
Gunに合わせて動いて欲しいのでSpawnerを 
Gunの子にします(SpawnerをGunにD&D)
発射する弾をつくる 
今回は弾を球にします。 
HierarchyのCreateから球を作り、手頃な大きさにします。 
名前を叠耻濒濒别迟などに変えておきます。
Rigidbodyコンポーネントをつける 
球は物理演算で制御したいの 
で(自由落下、打ち出し)、 
Rigidbodyコンポーネントを 
つけます。 
HierarchyビューでBulletを選 
択し、InspectorビューのAdd 
Component→Physics→Rigidb 
odyを選択します。
Rigidbodyコンポーネント 
をつけるとGameObjectが 
物理特性の制御下で動作す 
る用になります。 
ゲームを実行してみると球 
は地面に落ちます。
Prefab化する 
球を量産して発射した 
いのでprefabという機 
能を使います。 
D&D 
Prefab化した後はもう必要ないので 
Hierarchyにある球は削除します
Prefab 
Prefabは再利用可能なGameObject。 
Prefabをシーンに追加するとPrefabのクローン 
が生成される。 
クローンはすべてPrefabとリンクしており、 
Prefabに変更を加えるとすべてのクローンにも 
変更は反映される。
スクリプトをつくる 
Projectビューで 
Create→C# Scriptを選択 
名前をつける 
スクリプトをダブルクリ 
ックするとMonoDevelop 
というエディタが開きス 
クリプトを編集できます。
spawnerスクリプト 
スクリプトはこ 
ちら 
https://github.com/nyar 
urato/kzunity_hands_on/ 
blob/master/hans_on01/ 
Assets/Scripts/spawner.c 
s 
using UnityEngine; 
using System.Collections; 
public class spawner : MonoBehaviour { 
public GameObject bullet_prefab, camera_obj; 
public float shoot_force; 
private GameObject bullet_clone; 
// Use this for initialization 
void Start () { 
} 
// Update is called once per frame 
void Update () { 
if(Input.GetMouseButtonDown(0)){ 
bullet_clone = Instantiate(bullet_prefab, 
gameObject.transform.position, 
gameObject.transform.rotation) as 
GameObject; 
Vector3 shoot_vector = new Vector3(0,0,1); 
shoot_vector = 
camera_obj.transform.rotation * shoot_vector; 
bullet_clone.rigidbody.AddForce(shoot_force * shoot_vector); 
Destroy(bullet_clone,10f); 
} 
} 
}
スクリプトを貼り付ける 
できたスクリプト 
をD&Dで貼り付け 
ます。
スクリプトを貼り付けたら 
Publicで宣言し 
た変数が表示さ 
れるのでD&Dも 
しくは数値を入 
力するなどしま 
す。 
Shoot_forceは 
1000くらいがい 
いかも
実行してみる 
と、向いた方 
向に飛んでい 
きます
スクリプトの解説 
public GameObject bullet_prefab, camera_obj; 
public float shoot_force; 
private GameObject bullet_clone; 
publicで変数を宣言するとInspectorビュー上で選択、編集 
できるようになります。(ゲーム実行中も直接書き換える 
こともできます) 
privateもしくはなにもつけない場合はInspectorビュー上で 
は表示されません。
スクリプトの解説 
void Start () { 
} 
void Update () { 
} 
Start関数にはオブジェクト起動時に実行するコードを書き 
ます。 
Update関数にはフレーム毎に連続で実行されるコードを書 
きます。(1秒間に複数回実行されます)
スクリプトの解説 
if(Input.GetMouseButtonDown(0)){ 
} 
Input.GetMouseButtonDown()でマウスのクリックしたかど 
うかを取得できます。True,Falseで返ってきます。 
押された瞬間はGetMouseButtonDown、押している間は 
GetMouseButton、離した瞬間GetMouseButtonUPで取得で 
きます。 
キーボード入力はInput.GetKeyDownなどで取得できます。
スクリプトの解説 
bullet_clone = Instantiate(bullet_prefab, 
gameObject.transform.position, 
gameObject.transform.rotation) as GameObject; 
Instantiate(object,位置ベクトル,姿勢)で引数のobjectを生 
成(複製)します。 
Object型で返ってくるのでGameObject型に変換する必要 
があります。 
gameObjectはこのスクリプト貼りついているGameObject 
のことを指します。 
gameObject.transform.positionは位置、 
gameObject.transform.rotationは姿勢を取得できます。
スクリプトの解説 
Vector3 shoot_vector = new Vector3(0,0,1); 
shoot_vector = camera_obj.transform.rotation * shoot_vector; 
bullet_clone.rigidbody.AddForce(shoot_force * shoot_vector); 
Destroy(bullet_clone,10f); 
1行目でz方向に大きさ1のベクトルを作る。 
2行目でカメラの向いている方向に大きさ1ベクトルを作る。(後 
述) 
camera_obj.transform.rotationでcamera_objの姿勢を取得できる。 
(型はQuaternion) 
3行目でAddForce(力のベクトル)でオブジェクトに力を加える。 
AddForce()はrigidbodyコンポーネントがついていないと使えない。 
4行目で10秒後にオブジェクトを削除するように指定している。
クォータニオン 
四元数。難しいのでどういうものかは省略。 
Unityでは姿勢を表すのに使っている。 
クォータニオン×ベクトルをするとベクトルを回転さ 
せることができる。(順番を逆にするとうまく回転し 
ない)
グローバル座標系カメラの向いている方向(姿 
勢)
ちなみにクォータニオン×ベクトルの1行がない 
場合 
グローバル座標のZ方 
向に飞んでいく
Scoreを表示させる 
空のゲームオブ 
ジェクトを作る 
名前をScoreなど 
に変更。 
新しくスクリプ 
トを作り貼り付 
ける。
Scoreのスクリプト 
スクリプト 
https://github.com/nyarurato/k 
zunity_hands_on/blob/master/h 
ans_on01/Assets/Scripts/score.c 
s 
using UnityEngine; 
using System.Collections; 
public class score : MonoBehaviour { 
public GUIStyle score_style; 
private int score_value; 
// Use this for initialization 
void Start () { 
score_value = 0; 
} 
// Update is called once per frame 
void Update () { 
} 
public void AddScore(int value){ 
score_value += value; 
} 
void OnGUI(){ 
Rect rect = new Rect(0, 0, 100, 200); 
string str = "Score : " + 
score_value.ToString(); 
GUI.Label(rect, str, score_style); 
} 
}
スクリプト解説 
public void AddScore(int value){ 
score_value += value; 
} 
スコアの値を増やすために新しく作った関数。他のスクリ 
プトからはこの関数を通してスコアの値を変える。 
score_valueをpublicやstaticで宣言し、他のスクリプトか 
ら直接数値を変更するという手もある。(しかしあまり良 
いやり方ではない。オブジェクト指向ってやつ)
スクリプト解説 
void OnGUI(){ 
Rect rect = new Rect(0, 0, 100, 200); 
string str = "Score : " + score_value.ToString(); 
GUI.Label(rect, str, score_style); 
} 
1行目、Rect(x座標,y座標,横の長さ,縦の長さ)でGUIを描く範囲 
を決める 
2行目、GUIで表示する文字列をつくる。Score : 10な感じで表示。 
3行目、GUI.Label()でGUI表示 
GUIは他にもGUI.Button()などがある。 
GUIのドキュメントhttp://docs-jp.unity3d.com/Documentation/Components/GUIScriptingGuide.html
的を発生させる場所を作る 
空のゲームオブジ 
ェクトを作り名前 
を 
enemy_spawner 
などに変更。 
スクリプトを新し 
く作り、貼り付け 
る。
Enemy_spawnerのスクリプト 
スクリプト 
https://github.com/nyarurato/kz 
unity_hands_on/blob/master/han 
s_on01/Assets/Scripts/enemy_spa 
wner.cs 
using UnityEngine; 
using System.Collections; 
public class enemy_spawner : MonoBehaviour { 
public GameObject enemy_prefab; 
public float area_value; 
// Use this for initialization 
void Start () { 
StartCoroutine("spawn"); 
} 
// Update is called once per frame 
void Update () { 
} 
IEnumerator spawn(){ 
while(true){ 
Vector3 pos = new 
Vector3(Random.value * area_value, 
3, 
Random.value * area_value); 
pos += 
gameObject.transform.position; 
Instantiate(enemy_prefab, 
pos, 
gameObject.transform.rotation); 
yield return new 
WaitForSeconds(3f); 
} 
}
スクリプト解説 
void Start () { 
StartCoroutine("spawn"); 
} 
IEnumerator spawn(){ 
while(true){ 
… 
yield return new WaitForSeconds(3f); 
} 
} 
コルーチンと呼ばれるもの。 
yieldまで進んだら一旦処理を中断し3秒待った後処理を再 
開する。
コルーチン 
コルーチンとは途中で実行を停止してUnity へ制御を戻し、 
また続行するときは停止したところから継続することが出 
来る関数。 
C#では以下のように書く 
IEnumerator hoge(){ 
処理1 
yield return new WaitForSeconds(5.0); 
処理2 
yield return new WaitForSeconds(2.0); 
処理3 
} 
処理1を実行した後yieldがあるので処理を中断。 
5秒後、処理2のところから再開。 
処理2の後、yieldがあるので処理を中断。 
2秒後、処理3から再開。 
終了 
ドキュメント 
http://docs-jp.unity3d.com/Documentation/Manual/Coroutines.html
的を用意する 
またスクリプトから量産したいのでprefabを作る 
適当なオブジェクト(Cube,Cylinderなど)を作り、Rigidbodyと新しいスクリ 
プトをはりつける。名前を别苍别尘测などに変更する。
的をprefab化 
Hierarchyビューから作っ 
た的を選択し、Projectビ 
ューへD&D 
Prefab化したらHierarchy 
の的は不要なので削除す 
る。
的(Enemy)のスクリプト 
スクリプト 
https://github.com/nyarurato/kzun 
ity_hands_on/blob/master/hans_on 
01/Assets/Scripts/enemy.cs 
using UnityEngine; 
using System.Collections; 
public class enemy : MonoBehaviour { 
public int enemyscore; 
GameObject score_obj; 
score score_component; 
// Use this for initialization 
void Start () { 
score_obj = GameObject.Find("Score"); 
score_component = 
score_obj.GetComponent<score>(); 
} 
// Update is called once per frame 
void Update () { 
} 
void OnCollisionEnter(Collision collision){ 
if(collision.gameObject.tag == "bullet"){ 
score_component.AddScore(enemyscore); 
Destroy(gameObject); 
} 
} 
}
スクリプト解説 
score_obj = GameObject.Find("Score"); 
score_component = score_obj.GetComponent<score>(); 
GameObject.Find(名前)でHierarchyからその名前の 
GameObjectを探して返す 
スクリプトからコンポーネントにアクセスする場合は 
GetComponent()を使う。この関数はジェネリックスとい 
うものに対応しているので<>に型を書くと、キャストなど 
を使い型を変換しなくて良くなる。 
GetComponet<コンポーネントの名前>()な感じ
スクリプト解説 
void OnCollisionEnter(Collision collision){ 
if(collision.gameObject.tag == "bullet"){ 
score_component.AddScore(enemyscore); 
Destroy(gameObject); 
} 
} 
OnCollisionEnter()はrigidbodyコンポーネントをつけている 
Gameobjectが他のオブジェクトと衝突した時に呼ばれる関数。 
今回はenemyが地面とぶつかった時、他のenemyとぶつかった時、球 
とぶつかった時に呼び出される。 
球とぶつかった時に点数追加の処理をしたいので球にタグをつけ、そ 
のタグを見て判別する。
タグ付け 
③ ② 
①
値を入れていく 
敵を発生させるエリア 
(10m四方) 
敌一体あたりのスコア
実行してみる 
終了条件がないもののゲ 
ームっぽいものが出来上 
がった! 
終了条件をつけてみる 
→時間? 
→あるスコア以上?
やっていないこと 
● 出力(webplayerやandroid,iosなど) 
● Material 
● Animation 
● 音の再生など 
● Sceneの移動 
● パーティクル 
● 2D 
などなど
番外編 
カプセル形状だったプレイヤーをAsset Storeの 
力で人に変える。 
ついでにTPSにする。
プレイヤーをAsset Storeのものと置き換え 
る 
Asset StoreでAnimated Soldierを検索しダウンロードしイ 
ンポート。 
Projectビューで 
Cartoon Soldier→Prefabs→soldier→soldier3rdPersonを 
選択しHierarchyにD&D 
ペース 
ト
HierarchyビューのFirst Person Controllerは不要になるの 
で削除かInspectorビューでGameObjectそのもののチェッ 
クを外す。 
このまま実行すると銃を撃ってenemyに当たってもenemy 
は消えません。これはソルジャーの銃からはRaycastとい 
う機能を使い仮想的な線を出してぶつかった物などを判定 
しているのでenemyについているOnCollisonEnter()は機能 
していないからです。(OnCollisonEnterは物理的な衝突で 
呼び出される) 
そこでそれらのスクリプトをオフにして今まで使っていた 
球を生成するようにします。
空のGameObjectを作りspawnerとします。 
画像を参考にgunの中にspawnerを入れます。 
spawnerの位置を銃口あたりになるように調節します。
spawnerのスクリプトを貼り 
付けます。 
Bullet_prefabにはBulletの 
prefabを入れます。 
Camera_objにはspawnerオブ 
ジェクトの親であるgunを入 
れます。 
Shoot_forceは適当に。
実行してみる 
なんともいえないダサさですが完成です。
Unityちゃん紹介 
?オープンソース系アイドル 
?かなり自由に使えるようなライセンス 
?UnityだけでなくいろんなソフトでつかってもOK 
ダウンロード方法 
?ホームページ(こちらの方がバージョンが新しい) 
http://unity-chan.com/download/guideline.html 
?Asset StoreでUnity-chanと検索 
Ver1.2で髪やスカート?が揺れ物になった 
Oπはまだ???
参考 
Unity Developper Document 
http://japan.unity3d.com/developer/document/ 
Unity講習会(初級) 
http://www.slideshare.net/torisoup/unity-36096302 
UnityLecture @Kyushu University 
http://www.slideshare.net/PumpkinKaneko/unitylecturekyushu-university 
Unity3dにおけるus c# boo比較 
http://www.slideshare.net/nobukazuhanada/unity3dus-c-boo 
Unity恐くないよ!! 
http://www.slideshare.net/nakamura001/unity-12538949

More Related Content

鲍苍颈迟测勉强会ハンス?オン

Editor's Notes

  1. 今から鲍苍颈迟测触るという人向けの话になるので惯れている人は暇かもしれないです
  2. AR,建築のデモ,医療関係 MikumikuAkushu:Novint Falcon???3次元感触デバイス
  3. 直接的に情报量が18倍とはかぎらない(内容次第
  4. 中间コード化されるので言语による速度差はない
  5. 配置はお好みでどうぞ タブを動かすと配置をいじることができます
  6. 贬颈别谤补谤肠丑测は名前通り阶层など、亲子関係なども表示する
  7. Shiftを押すと下がる(下がらない場合は CPUパワー使うので非力なスペックの人はほどほどにした方がいいかも
  8. しげんすう。复素数に基づいている。直感的に数値を理解するのは难しい