手元から別の球を打って、赤球を弾き飛ばす。
どんどん赤球が、転がってくる。
マウスクリックで、別の球が飛んでいく。
Prefabとは?
設計図のような物
大きさ:10
Sphere(玉)の作り方
色:赤
摩擦係数:0.5
Prefab(プレハブ)
ゲーム世界
Sphere①
Sphere③
Sphere②
Prefabを元にして、同じ玉を作りだす。
大きさ:10
Sphere(玉)の作り方
色:赤
摩擦係数:0.5
Prefab(プレハブ)
Prefabの場合
クラスの場合
クラス
オブジェクト①
オブジェクト①
Prefab
オブジェクト①
オブジェクト①
※補足
Prefab自体も、内部的にはクラスとオブジェクトで出来ています。
Prefabとは言わば、クラスをより抽象度の高いレイヤーで扱えるようにした機能と言えます
(つまりは、使いやすくしたということ)
ゲーム世界
Sphere
実際の”玉”を元にして、Prefab(プレハブ)を作ります。
大きさ:10
Sphere(玉)の作り方
色:赤
Prefab(プレハブ)
摩擦係数:0.5
コッチにほり込む
これが作られたPrefabです。
球(Sphere)の「設計図」が作られたという事です。
(この超絶ラクチンなところがUnityの長所ですね)
Prefabというのがわかるように、末尾に「Pre」を追加しました。
※ほんとは何でも良いですが、ここではこのルールでいきます。
名前がPrefabと同じになっています。
Delete(デリート)を選択
Prefabからオブジェクトを作りたい時は、
Project(プロジェクト)のSpherePreをHierarchy(ヒエラルキー)ビューにマウスで移動させるだけです。
ちなみにUnityでは、以下のプログラミング言語が使えます。
この内、どのプログラミング言語を使うかは自由ですが、現在、企業などのUnity開発では、C#が主流になっています。
また、C#以外はUnity独自ルールの部分が多く、一言でいうと「クセが強い」のでC#で進めていきます。
名前を変更しておきましょう。
ここではSphereCreate(スフィアクリエイト)にしておきます。
※ファイル名によって、スクリプトの中身(コード)も変わります。
間違いの元なので、今は同じファイル名にしておいてください。
※なんか最近、Windowsだと[Visual Studio(ビジュアルスタジオ)]が開くようなので、画像と少し違うかも知れませんが、気にせず進めてください。基本一緒です。
using UnityEngine;
using System.Collections;
public class SphereCreate : MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
}
using UnityEngine;
using System.Collections;
public class SphereCreate : MonoBehaviour {
//省略
}
public class SphereCreate : MonoBehaviour {
//省略
}
public class SphereCreate : MonoBehaviour {
//省略
}
public class SphereCreate : MonoBehaviour {
//省略
}
子クラス
親クラス
サブクラス
スーパークラス
言い方は色々
(親と子が一番わかりやすいかな?と思う)
MonoBehaviour
(モノ・ビヘイビア)
SphereCreate
(スフィア・クリエイト)
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
Start
メソッド
Update
メソッド
パラパラ漫画と仕組みは同じ!
using UnityEngine;
using System.Collections;
public class SphereCreate : MonoBehaviour {
void Update () {
}
}
using UnityEngine;
using System.Collections;
public class SphereCreate : MonoBehaviour {
float time;
void Update () {
time += 0.01f;
if(time >= 3.0f){
//ココに②オブジェクトを作る処理を書く
time = 0;
}
}
}using UnityEngine;
using System.Collections;
public class SphereCreate : MonoBehaviour {
float time;
void Update () {
time += 0.01f;
if(time >= 3.0f){
//ココに②オブジェクトを作る処理を書く
time = 0;
}
}
}using UnityEngine;
using System.Collections;
public class SphereCreate : MonoBehaviour {
public GameObject pre;
float time;
void Update () {
time += 0.01f;
if(time >= 3.0f){
Instantiate(pre);
time = 0;
}
}
}public GameObject pre;Instantiate(pre);[Instantiate(pre)]というメソッドは、()内のインスタンス(今回はpre)を作る、というメソッドでしたね。
public GameObject pre;
float time;time += 0.01f;time += Time.deltaTime;フレーム
フレーム
フレーム
フレーム
Time.deltaTime
Time.deltaTime
Time.deltaTime
つまり【Time.deltaTime】は、フレームが終わるごとに、毎回違う値が入る
フレーム
フレーム
フレーム
フレーム
フレーム
フレーム
フレーム
フレーム
30fps
60fps
フレーム
フレーム
フレーム
1秒
スタート
[Time.deltaTime]をUpdateメソッド内で足していくと、
60fpsの場合は60回(60フレーム)足さないと1にならないが、
30fpsの場合は30回(30フレーム)足すだけで1になる、
つまり1秒になるタイミングは同じになります。
逆の言い方をすると、今回の作ったtime変数は1秒で、ちょうど1増える事になります。
そのため、3になった時(玉が出る時)は必ず3秒間隔になります。
+
+
+
+
+
+
+
+
+
public float time;※この問題を終わらせないと、次以降のプログラムが出来ませんので、必ず終わらせ、そして答え合わせをしてから進んでください。
手元から別の球を打って、赤球を弾き飛ばす。
どんどん赤球が、転がってくる。
マウスクリックで、別の球が飛んでいく。
撃つ玉
転がる玉
ちなみに、今回は使いませんが先ほどの[Input.GetMouseButtonDown()]に似ているメソッドとして、下記があります。
GetMouseButtonUp()(ゲットマウスボタンアップ):ボタンが離れたか?
GetMouseButton(ゲットマウスボタン):ボタンが押されているか?(現在進行系)
この三種はそれぞれ、条件に当てはまる時にtrueの値を返します。
「ボタンが押されたか?」と「押されているか?」の違いは単純に「ボタンが押されたか?」は押した瞬間だけを判定するのに対し、「押されているか?」は押されている状態を、ずっと判定する時に使います。
【押しっぱなしで玉を出し続けたい場合は、[GetMouseButton]】にするって感じです。
public class SphereCreate : MonoBehaviour {
public GameObject pre;
void Update () {
if(Input.GetMouseButtonDown(0)){
GameObject bullet = Instantiate(pre);
}
}
}ゲーム世界(Scene)
ゲーム画面
画面の手前はココ
※if文以外の場所は省略してます。
if(Input.GetMouseButtonDown(0)){
GameObject bullet = Instantiate(pre);
bullet.transform.parent = transform;
bullet.transform.localPosition = new Vector3(0, 0, 0);
}if(Input.GetMouseButtonDown(0)){
GameObject bullet = Instantiate(pre);
bullet.transform.parent = transform;
bullet.transform.localPosition = new Vector3(0, 0, 0);
}if(Input.GetMouseButtonDown(0)){
GameObject bullet = Instantiate(pre);
bullet.transform.parent = transform;
bullet.transform.localPosition = new Vector3(0, 0, 0);
}if(Input.GetMouseButtonDown(0)){
GameObject bullet = Instantiate(pre);
bullet.transform.parent = transform;
bullet.transform.localPosition = new Vector3(0, 0, 0);
}2Dを
3Dに
yは◯◯
xは◯◯
zは??
クリックした座標はココ!!
クリックした先
はドコ?
ゲーム世界
Rayを飛ばすイメージ
クリックした座標へ、カメラから光線を飛ばす!!
ゲーム世界
クリックした座標
その光線がそのまま飛んでいった先で、オブジェクトとぶつかった座標をゲット!!!
if(Input.GetMouseButtonDown(0)){
GameObject bullet = Instantiate(pre);
bullet.transform.parent = transform;
bullet.transform.localPosition = new Vector3(0, 0, 0);
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
Vector3 dir = ray.direction;
}public class BulletCreate : MonoBehaviour {
public float power;
public GameObject pre;
void Update () {
if(Input.GetMouseButtonDown(0)){
GameObject bullet = Instantiate(pre);
bullet.transform.parent = transform;
bullet.transform.localPosition = new Vector3(0, 0, 0);
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
Vector3 dir = ray.direction;
bullet.GetComponent<Rigidbody>().velocity = dir * power;
}
}
}using UnityEngine;
using System.Collections;
public class Destroy : MonoBehaviour {
void OnBecameInvisible(){
Destroy(gameObject);
}
}OnBecameInvisible()で受け取って、
Destroy()で破壊
撃つ玉の方は、MainCameraの子オブジェクトなので、画像のように、一段下にあります。
転がる玉は、そのまま一番上の階層に表示されてます。
それぞれの玉オブジェクトが、画面から消えた後に減っていく事を確認してください。
ちなみに[Destroy(gameObject, 5.0)]のように、2個めの引数としてfloat型の値を指定すると、[5秒後に消す]など時間を指定して消す事もできます。
UI(ユーアイ)とは【ユーザーインターフェイス】の略で、ゲームやWEB業界などでは、非常に良く使われる言葉です。
ユーザー(使う人)とゲーム(またはWEBサイト等)の間で、情報をやりとりするものの事を言いますが、単純にゲームなどの【操作画面の事】だと思えば良いです。
どんなに内容が面白いゲームでも、「UIがクソ」であればユーザーは【面白い】とは感じません。
UIは非常に重要なので、覚えておきましょう。
文字の内容
文字の大きさ
文字の色
現在の画面
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class Score : MonoBehaviour {
public static int score;
Text text;
void Start () {
}
void Update () {
}
}using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class Score : MonoBehaviour {
public static int score;
Text text;
void Start () {
text = GetComponent<Text>();
}
void Update () {
text.text = "Score : " + score.ToString();
}
}using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class Score : MonoBehaviour {
public static int score;
Text text;
void Start () {
text = GetComponent<Text>();
}
void Update () {
text.text = "Score : " + score.ToString();
}
}撃つ玉
撃たれる玉
目には見えない、透明なカベオブジェクトを用意
カベにぶつかれば得点
ぶつからない(ちゃんと飛ばせてない)なら得点なし
どっちでもOK
Collider(コライダー)とは?
コライダーはオブジェクトの「当たり判定」の事で、Unityで新しく作ったオブジェクトに関しては最初から設定してくれています。
(今まで設定しなかったのはそのため)
Unity外で作られたキャラクターなどを持ってきて使う場合などは、このコライダーを設定しなければいけません。
詳しくは、また別の機会にやります。
public class Hit : MonoBehaviour {
void OnTriggerEnter ( Collider co ){
}
}public class Hit : MonoBehaviour {
void OnTriggerEnter ( Collider co ){
if(co.gameObject.tag == "scoreUp"){
Score.score++;
}
}
}