Unity1 PDF

ゲームクリエーター特訓
夏の集中講義 Unity #1
講師: 尾形 薫
OGATA Kaoru, 2012
Game Programming Summer Special, Unity #1
1/57
Unity
• Unityって?
– 「高性能ゲームツクール」
by ファミ通
– 3Dのゲームをなるべく簡単にそれっぽく素早く作る
ツール
• 万能ではない。よく「Unityあれば何でもOK!」みたいに言
われるけど
• 3Dモデルをレイアウトできて、物理エンジン搭載
• Mayaで作ったアニメーション再生可能
• ちょっとプログラムを追加すればゲームが作れる!
OGATA Kaoru, 2012
Game Programming Summer Special, Unity #1
2/57
大前氏曰く・・・
Unityではプログラムを
書かないのが大事ですね
By 大前氏(ユニティジャパン)
OGATA Kaoru, 2012
Game Programming Summer Special, Unity #1
3/57
まずは起動
• スタート>全てのプログラム>Unity>Unity
• 「最新版のお知らせ」が出てもSkip!
OGATA Kaoru, 2012
Game Programming Summer Special, Unity #1
4/57
起動すると・・・
• 初回起動時は、こんな画面になる
– 「前回終了時」のプロジェクトで始まる
OGATA Kaoru, 2012
Game Programming Summer Special, Unity #1
5/57
画面の見方
3Dシーン
個別オブジェクトの
属性値編集
(インスペクタ)
シーン内オブジェクト
OGATA Kaoru, 2012
プロジェクト内
オブジェクト
Game Programming Summer Special, Unity #1
6/57
Sceneでの操作
• Macの場合
– クリック
• オブジェクト選択
– optionキーを押しながらマウスドラッグ
• シーン内回転
– マウスホイール
• ズーム
– option +
command +
マウスドラッグ
• 上下左右移動
OGATA Kaoru, 2012
Game Programming Summer Special, Unity #1
7/57
いきなり「プレイ」
• プレイボタンを押してみる
– 終るときは再び「プレイボタン」を押す
• 画面が切り替わり、
「ゲームモード」
になる!
– マウスとキーボード
で操作可能
OGATA Kaoru, 2012
Game Programming Summer Special, Unity #1
8/57
iPhoneでも動く!
• Unityで作成したゲームは、
– Mac、Windows、iPhone、Android用に出力可能
• iPhone, Androidは別途有償($350)
– ライセンスがあれば、PS3やWiiにも!
• Sonyや任天堂との契約が前提
• この1年で急速にブームに
– Unity案件も激増
– Unityは個人や少人数制作向けだが、
– 大型案件も増えている(当然求人も)
OGATA Kaoru, 2012
Game Programming Summer Special, Unity #1
9/57
制作に必要な要素
• Unityでのゲーム制作に必要なもの
– 表示データ
・・・FBX
• プリミティブなら内部で生成可能
– スクリプト
・・・JavaScript、C#
• ただし、UnityのJSはやや独自なJavaScript
• C#の方が主流
• スクリプト編集は「MonoDevelop」
– やる気と根性
OGATA Kaoru, 2012
Game Programming Summer Special, Unity #1
10/57
スクリプトの扱い
• 1オブジェクト
=
1スクリプト
– それぞれのオブジェクトが1個のスクリプトを持つ
– オブジェクトにスクリプトをアサインする
– オブジェクト中心の考え方
• 従来のプログラムスタイル:
– 1スクリプト = 多数のオブジェクト
– スクリプトで、オブジェクトを動かす
– スクリプト中心の考え方
OGATA Kaoru, 2012
Game Programming Summer Special, Unity #1
11/57
MyFirstUnity
• 新規プロジェクトを作成
– プロジェクトフォルダ
「MyFirstUnity」
全てのチェックを
外してから、
「Create Project」
OGATA Kaoru, 2012
Game Programming Summer Special, Unity #1
12/57
新規プロジェクト状態
OGATA Kaoru, 2012
Game Programming Summer Special, Unity #1
13/57
シーン保存
• 先ほどは「プロジェクトフォルダ」を作成した
だけ
– プロジェクトには、複数の「シーン」を保存できる
• 改めて、シーンを保存する
– File > Save Scene
– 「MyFirstUnity」として保存
OGATA Kaoru, 2012
Game Programming Summer Special, Unity #1
14/57
オブジェクトを追加
• 「Plane」を追加してみる
• 続いて「Cube」を追加し、Planeの上に配置
OGATA Kaoru, 2012
Game Programming Summer Special, Unity #1
15/57
カメラを移動
• カメラの位置を調整する
– 注意:Sceneのカメラと、Gameのカメラは別
– カメラを選択すると、Sceneの右下にpreviewが出る
– XYZ方向への移動と回転で
見え方を調整
– ※実際にはカメラはプログラムで
位置と方向を制御する場合が多い
• FPSなどではキャラクタと一緒にカメラが動く
OGATA Kaoru, 2012
Game Programming Summer Special, Unity #1
16/57
レイアウトを変更
• このままでは操作しづらいので・・・
– レイアウトを 2 by 3 に変える
– レイアウトは自由に変更することができる
OGATA Kaoru, 2012
Game Programming Summer Special, Unity #1
17/57
光あれ
• Sceneはライティングされているが、
• Gameは真っ暗
• ライトを追加する
– Directional Lightを作成
– 明るく(真っ白に)なった!
OGATA Kaoru, 2012
Game Programming Summer Special, Unity #1
18/57
マテリアル追加
• Planeにマテリアル追加
• Assets > Create > Material
– プロジェクトにMaterialを
追加してから、
– オブジェクトにアサイン
– マテリアルのMain Colorを
変更してみる
OGATA Kaoru, 2012
Game Programming Summer Special, Unity #1
19/57
テクスチャを貼り付ける
• まずProjectに画像を追加
– PNG画像を全て選択して、
Projectにドラッグ&ドロップ
– 「New Material」を選択して
「Alternating...ColorMap」をドラッグし
マテリアルの画像エリアにドロップ
OGATA Kaoru, 2012
Game Programming Summer Special, Unity #1
20/57
Cubeにも・・・
• Cubeにもテクスチャを貼り付けたい
– 1. マテリアルを作成
– 2. マテリアルをオブジェクトにアサイン
– 3. 画像をマテリアルにアサイン
• PyramidVerdigris-ColorMapを
OGATA Kaoru, 2012
Game Programming Summer Special, Unity #1
21/57
物理効果
• 物理効果を適用してみる
– Cubeを選択して、
Component > Phycics > Rigidbody
– CubeにRigidbodyが追加される
• Inspectorで確認
– 「Play」
OGATA Kaoru, 2012
Game Programming Summer Special, Unity #1
22/57
何がどうなった?
• Cubeに「Rigidbody」を追加
– Rigidbody=剛体
– 他と衝突して、跳ね返る
– 跳ね返るには「衝突対象」が必要
• 衝突対象 =
collider
• PlaneのInspectorを
確認すると・・・
– Colliderがある!
OGATA Kaoru, 2012
Game Programming Summer Special, Unity #1
23/57
さらに物理的に
• あんまり跳ね返ってない
• もっとジャンプ!!
– Physic Material
– Asset > Create >
Physic Material
– 「New Physic Material」
をCubeとPlaneに
アサイン
– まだ跳ね返らない・・・
OGATA Kaoru, 2012
Game Programming Summer Special, Unity #1
24/57
はねる!
• CubeのInspectorを確認
– Cubeを選択
– Box ColliderのMaterialに
New Physic Materialがある
• Physic Materialのパラメータ調整
– Bouncinessを0.5に
– 跳ね返り率
OGATA Kaoru, 2012
Game Programming Summer Special, Unity #1
25/57
見た目をよく
• 見た目のディテールを上げる
– ノーマルマップ (normal mapping)
– 凹凸感を出すことができる
– マテリアルのShaderを「Diffuse」から「Bumped
Diffuse」に変更
OGATA Kaoru, 2012
Game Programming Summer Special, Unity #1
26/57
ノーマル画像をアサイン
• 「Alternating...-NormalMap」をNormalmapに
– 「Fix Now」をチェック(Normal Map画像に変更するため)
OGATA Kaoru, 2012
Game Programming Summer Special, Unity #1
27/57
ディテールアップ
• ディテールが良くなった!
←ノーマルなし
ノーマルあり→
OGATA Kaoru, 2012
Game Programming Summer Special, Unity #1
28/57
やってみよう
• Sphereを作成して、床ではねるようにしよう
– CubeとSphereがぶつかると、お互いにも跳ね返る!
• さらにCubeやCapsuleを増やすとか!
OGATA Kaoru, 2012
Game Programming Summer Special, Unity #1
29/57
キーボードで操作
• キーやマウスなどで動かしたい
– スクリプトを書く必要がある!
• スクリプトの考え方
– 各オブジェクトごとに、対応するスクリプトを記述
できる
– スクリプトには、初回の1回だけ実行する部分と、
毎フレーム実行する部分が記述できる
– 毎フレーム、キーの状態を確認して移動すれば!
OGATA Kaoru, 2012
Game Programming Summer Special, Unity #1
30/57
スクリプトAssetの作成
• スクリプトもアセット
– Asset > Create > C# Script
– Inspectorにはスクリプトの中身が表示される
• ここでは見るだけ
OGATA Kaoru, 2012
Game Programming Summer Special, Unity #1
31/57
スクリプトを編集
• Inspectorの「Open...」をクリック
• MonoDevelopが起動し
編集できる
OGATA Kaoru, 2012
Game Programming Summer Special, Unity #1
32/57
スクリプトの中身
• 空の関数が2つ
StartとUpdate
using UnityEngine;
using System.Collections;
public class NewBehaviourScript : MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
}
OGATA Kaoru, 2012
Game Programming Summer Special, Unity #1
33/57
MonoBehaviourクラス
• Unityの基底クラス
– 様々なイベントに対応するメソッドを用意
• Update, Awake, OnMouseEnter, …
OGATA Kaoru, 2012
Game Programming Summer Special, Unity #1
34/57
スクリプトを書く
• 試しに、Start関数の中身を書いてみる
– コンソールに KAIT Unity と表示する
// Use this for initialization
void Start () {
Debug.Log("KAIT Unity");
}
– 保存する
– Unityに戻ると、スクリプトが更新されている
OGATA Kaoru, 2012
Game Programming Summer Special, Unity #1
35/57
何かにアサイン
• Cubeにアサイン
– Projectにあるだけでは実行されない
– スクリプトはシーン内の何かのオブジェクトに
アサインされている必要がある
OGATA Kaoru, 2012
Game Programming Summer Special, Unity #1
36/57
Cubeを確認&実行
• CubeのInspectorを確認
– Scriptがある
• 「Play」
– 特に何も変わらない・・・??
– コンソールの表示が必要!
OGATA Kaoru, 2012
Game Programming Summer Special, Unity #1
37/57
コンソール
• Window > Consoleで表示
– コンソールには unity の文字が!
OGATA Kaoru, 2012
Game Programming Summer Special, Unity #1
38/57
コンソールの利用目的
• 利用目的
– デバッグ用
– 様々な数値が現在どうなっているかはUnity Editorで
も分かるが・・・
– 計算途中、処理途中の値は分からない
– コンソールに表示することで、計算や処理が適切か
正しいかどうか分かる
OGATA Kaoru, 2012
Game Programming Summer Special, Unity #1
39/57
キーで操作
• 新しくCapsuleを作成
– 名前を「Player」に
• 新しくC# Scriptを作成
– 名前を「PlayerController」に
– Playerにアサイン
– Open... で編集へ
OGATA Kaoru, 2012
Game Programming Summer Special, Unity #1
40/57
PlayerController.cs
• つぎのように、Updateの中身を記述
– ←→キーで、X方向に移動(現在位置と相対移動)
void Update () {
float x = 0.0f;
if (Input.GetKey(KeyCode.RightArrow)) {
x = 0.5f;
}
if (Input.GetKey(KeyCode.LeftArrow)) {
x = -0.5f;
}
transform.Translate(x, 0, 0, Space.World);
}
OGATA Kaoru, 2012
Game Programming Summer Special, Unity #1
41/57
やってみよう
• ↑↓キーで、Z方向に移動するには?
– ↑キーは、KeyCode.UpArrow
– ↓キーは、Keycode.DownArrow
OGATA Kaoru, 2012
Game Programming Summer Special, Unity #1
42/57
カメラを制御
• カメラの位置と注視点を変えてみる
• まずは、注視点から
• カメラ制御用スクリプトを新規作成
– 「CameraController」とする
– 「Main Camera」にアサイン
– エディタで開く
OGATA Kaoru, 2012
Game Programming Summer Special, Unity #1
43/57
CameraController.cs
• 変数target(Transform型)を追加
• 自身(カメラ)のLookAt先をtargetに
public class CameraController : MonoBehaviour {
public Transform target;
// 略
// Update is called once per frame
void Update () {
transform.LookAt (target);
}
}
OGATA Kaoru, 2012
Game Programming Summer Special, Unity #1
44/57
スクリプト内変数にアサイン
• Main CameraのInspector
– スクリプトのtarget変数が登場
– Hierarchyリストから、
SphereをTargetに
ドラッグ&ドロップ
OGATA Kaoru, 2012
Game Programming Summer Special, Unity #1
45/57
CameraController.cs
• 新しく「campos」変数を追加
• カメラの位置(position)をcamposのY+2の位置に
public Transform target;
public Transform campos;
/// 略 ///
void Update () {
Vector3 pp = campos.position;
transform.position = new Vector3(pp.x, pp.y + 2, pp.z);
transform.LookAt(target);
}
• camposに、Playerを
アサイン
OGATA Kaoru, 2012
Game Programming Summer Special, Unity #1
46/57
ブロック崩しゲーム
• 3Dブロック崩しゲームを作る!(前編)
– アセットは後から差し替えできるようにする
– まずは、壁とボール、操作できるパドルを表示
– ボールの反射はダイナミクスで
• ではまずNew Project
– プロジェクト名「Blocks」
– シーンを保存「0001」
OGATA Kaoru, 2012
Game Programming Summer Special, Unity #1
47/57
壁を作る
• ホントはMayaで作りたいところだが・・・
• まずはUnityのプリミティブで作ろう
• 右のように、Cubeを
細長くして枠を作る→
– 長さ50くらい
– XZ平面に!(Y=0)
• ついでにDirectinal
Lightも作成
OGATA Kaoru, 2012
Game Programming Summer Special, Unity #1
48/57
球とパドルを作る
• Sphereを作成し、適当に位置合わせ
– とりあえず座標(0,0,0)に
• Cubeからパドルを作る
– 名前をpaddleに変更
OGATA Kaoru, 2012
Game Programming Summer Special, Unity #1
49/57
Rigidbody
• 衝突反射させるために、ボールをRigidbodyに
– Sphereを選択して↓
– Use GravityをOFFに
– Freeze Position YをONに
OGATA Kaoru, 2012
Game Programming Summer Special, Unity #1
50/57
球を動かす
• 球を動かすには?
– 初速を与える
– Start時に速度を設定してみよう
• スクリプトで与えないとならない!
– C#スクリプトを作成し
「BallScript」とリネーム
ボール(Sphere)に
アサインして、Open
– Start関数を↓のように
void Start () {
rigidbody.velocity = new Vector3(15, 0, 2);
}
OGATA Kaoru, 2012
Game Programming Summer Special, Unity #1
51/57
動いたが・・・
• 壁にぶつかるとくっつく!!
– 実際に速度を表示して確認してみたい
• GUI Textで、文字列を表示!
– 見やすい位置に調整する
OGATA Kaoru, 2012
Game Programming Summer Special, Unity #1
52/57
スクリプト修正
• BallScript.csを修正
public class BallScript: MonoBehaviour {
public GUIText text;
void Start () {
rigidbody.velocity = new Vector3(15, 0, 2);
}
void Update () {
float vv = rigidbody.velocity.sqrMagnitude;
text.text = "v: " + vv;
}
}
– InspectorにてGUI Textをアサイン
OGATA Kaoru, 2012
Game Programming Summer Special, Unity #1
53/57
やはり遅くなっている
• ここはPhysics Materialで調整だな
– 物理挙動のパラメータ設定
– 反射するそれぞれにアサイン
OGATA Kaoru, 2012
Game Programming Summer Special, Unity #1
54/57
Physics Material
• Boucinessを1に
– 反射係数。0だと反射しない
– Bouce Combineを「Maximum」にすればボールだけにPhysic
Materialを設定するだけでいいはずだが、現実には速度が落ち
る・・・
OGATA Kaoru, 2012
Game Programming Summer Special, Unity #1
55/57
パドルを動かせるように
• パドルを動かし、球を跳ね返せるように
• やること:
– Physics Materialの適用
– キー操作でのパドル移動
– 先ほどのスクリプトを参考に、各自やってみよう!
OGATA Kaoru, 2012
Game Programming Summer Special, Unity #1
56/57
次回
• 9/5
• 1∼2限
• 3∼4限
OGATA Kaoru, 2012
ブロック崩し(後編)
シューティング
Game Programming Summer Special, Unity #1
57/57