DRY

Web関連の技術の事、食事/お酒の事、旅行の事など

UnityでiPhoneゲームを2時間で作る

まずは大前提として、こちらの動画iPhoneゲームを20分間で作る【メダルプッシャー編】を自分でやってみた版です。

私がやったら、2時間掛かったのでタイトルをそうしました(笑)
で事情によりJSではなくC#でやりたかったので、スクリプトの部分だけ自分で解釈してC#にしてあります。

非常に分りやすくて素晴らしい動画でした。Unityのサンプルが自分で作れたのは良かったです。
作者さんに感謝しつつ自分で自分に解説しておきます。

■コイン(Cylinder)の生成

GameObject→Create Other→Cylinder
Component→Physics→Rigidbody を追加


Rididbody
ジッドボディとは

ジッドボディ(Rigid Body)とは NURBS やポリゴンのサーフェスを固い形状にしたものです。
ジッドボディ同士を衝突させて、 貫通しないで跳ね返らせるようにすることができます。

Unity ではオブジェクトに rigidbody を追加することで物理的な意味で個体として扱うことができるようになるそうです。

■ライトの生成

GameObject→Create Other→Directional Light

■床の生成

GameObject→Create Other→Cube

Inspectorビュー
Position (0, 0, 0)
Scale (5, 1, 5)

■カメラやコインの位置を修正

■コインオブジェクトの修正

当たり安定がCapsule Colliderを使っているので丸になってしまっている。
これをコインの形と同じにするために、Colliderを変更
Component→Physics→Mesh Collider に変更

Mesh Colliderの処理は重いので、Convexにチェックを入れる。
凸型の形状の場合は処理速度が改善されるらしい。

Projectビュー
右クリック→Create→Physics Material の生成(名前をCoinに変更)


「Dynamic Friction」
は、動作中の摩擦係数で、0になると氷のように滑ります。逆に1にすると強い力や重力がかからないとすぐに止まってしまいます。

「Static Friction」
は、静止中の摩擦係数で、同じく0にすると氷のように滑り、1にすると動かすのが難しくなります。

参考

Frictionをそれぞれ0.2に、跳ね返り係数 Bouncinessを0.6に設定。
Physics MaterialをD&DでCoinオブジェクトに関連付けてあげる。

コインの色付け
Projectビュー
右クリック→Create→Material
同様にMaterialをD&DでCoinオブジェクトに関連付けてあげる。

■コイン生成の挙動の変更(Prefab)

コインをボタンが押される度に生成したく、そういった大量生産を行うオブジェクトはPrefabに格納するものらしい。
Projectビュー
右クリック→Create→Prefab

コインオブジェクトをPrefabにD&Dし、名称をCoinPrefabに。
Worldにおいてあるコインオブジェクトの削除

■CoinPrefabをWorldに生成する為のオブジェクトを生成

GameObject→Create Empty→Spawnerに名称を変更

Projectビュー
右クリック→Create→C#Script→Spawnerに名称を変更
SpawnerオブジェクトにD&DしてScript制御を行う

SpawnerScriptの修正


using UnityEngine;
using System.Collections;

public class Spawner : MonoBehaviour
{
public Transform prefab;

// Update is called once per frame
void Update ()
{
if (Input.GetButtonDown ("Fire1"))
{
Vector3 offset = new Vector3 (Mathf.Sin (Time.time * 7), 0, 0);
Instantiate (prefab, transform.position + offset, transform.rotation);
}
}
}

※ビデオ途中の位置の修正は込みになってます

そうすると、Inspectorビューに変数Prefabが表示されるので、ProjectビューのCoinPrefabをそこにD&Dする。
実行すると、クリックするたびにコインが生成される。

■Pusherの生成

オブジェクトCubeの名前をWallに変更して、右クリック→Duplicateで生成(Pushreに名称変更)
Pusherっぽい位置に修正して、Pusherはコインとぶつかる(干渉する)のでRigidBodyに変更。
Component→Physics→Rigidbody で変更。

スクリプトで制御をするので、Is Kinematicにチェックを入れる。

マニュアルによると、

Is Kinematic にチェックの入っているRigidbodyオブジェクトは物理学エンジンによって運転されず、そのTransformによってのみ操作することができます。
だそうな。つまり、ScriptでTransformを制御することによって意図する動きができるよ。とかそんな感じ?

Projectビュー
右クリック→Create→C#Script→Pusherに名称を変更
PusherオブジェクトにD&DしてScript制御を行う

PusherScriptの修正


using UnityEngine;
using System.Collections;

public class Pusher : MonoBehaviour
{
private Vector3 origin;

// Update is called once per frame
void Update ()
{
Vector3 offset = new Vector3 (0, 0, Mathf.Sin (Time.time));
rigidbody.MovePosition (origin + offset);
}

void Awake ()
{
// 起点を保存しておく
origin = rigidbody.position;
}
}

これにより実行すると、Pusherが前後に動く。

■壁の生成

Wallオブジェクトを右クリック→Duplicateで壁を生成し、適当に位置に配置

■Remover(コインの削除機能)の生成

GameObject→Create Empty→Removerに名称を変更
当たり判定を付けるため、Component→Physics→Box Collider に変更

Inspectorビュー
Scale (50, 1, 50)
と適当な位置に配置

Is Triggerにチェックを入れる。ぶつかった時(当たり判定の際)に何か処理を入れたい時はチェックを入れる。

Projectビュー
右クリック→Create→C#Script→Removerに名称を変更
RemoverオブジェクトにD&DしてScript制御を行う

RemoverScriptの修正


using UnityEngine;
using System.Collections;

public class Remover : MonoBehaviour
{
// 当たり判定のイベント
void OnTriggerEnter (Collider collider)
{
// オブジェクトの消去
Destroy (collider.gameObject);
}
}

これで実行すると、Removerにぶつかった際にコインが消えるのがわかる。

■Remover2の生成

Removerオブジェクトを右クリック→DuplicateでRemover2の生成
位置・サイズを適当に修正。

※実際は下記のScoreの生成を先にやらないとダメ

Projectビュー
右クリック→Create→C#Script→Remover2に名称を変更
Remover2オブジェクトにD&DしてScript制御を行う

Remover2Scriptの修正


using UnityEngine;
using System.Collections;

public class Remover2 : MonoBehaviour
{
void OnTriggerEnter (Collider collider)
{
Destroy (collider.gameObject);
Score.score += 3;
}
}

■Scoreの生成及びコインの増減制御

GameObject→Create Empty→Scoreに名称を変更
右クリック→Create→C#Script→Scoreに名称を変更
ScoreオブジェクトにD&DしてScript制御を行う
ScoreScriptの修正


using UnityEngine;
using System.Collections;

public class Score : MonoBehaviour
{
public static int score;

void Awake ()
{
score = 30;
}

void Update ()
{
guiText.text = score.ToString ();
}
}

コイン投入時にスコアを減らす為、SpawnerScriptの修正

using UnityEngine;
using System.Collections;

public class Spawner : MonoBehaviour
{
public Transform prefab;

// Update is called once per frame
void Update ()
{
if (Input.GetButtonDown ("Fire1"))
{
Vector3 offset = new Vector3 (Mathf.Sin (Time.time * 7), 0, 0);
Instantiate (prefab, transform.position + offset, transform.rotation);

Score.score--;
}
}
}

■Scoreテキストの表示

Scoreオブジェクト選択状態で、Component→Rendering→GUIText

Inspectorビュー
Position (0, 1, 0)
Text 999
Font Size 30

これで実行すると、スコアの増減が見てとれる。
あとは実行中デバッグっぽい動作できるの凄いよね!

iPhone用にコンパイル

File→Build & Run クリックで暫く待つと勝手にxcodeが起動して開始します。
iPhoneで実行すると、スコアのテキストが小さくて見難いのでFont Sizeを60ぐらいにしても良いかもです。

まあこれで終わりでもいいのですが、せっかくなので背景画象の設定と、コインがRemover2に落ちた時に「チャリン」とか音を鳴らす処理を入れてみました。

■背景画象の設定

適当に背景画象をProjectタブにD&Dします。
GameObject→Create Other→Plane を追加(Bgに名称を変更)

画象をBgオブジェクトにD&Dして位置を調整してあげれば終わりでした。

■サウンドの設定

適当に再生したい音声(mp3でいけました)をProjectタブにD&Dします。
ファイル名はsound.mp3としました。

今回はRemover2に落ちた時(コインを+3する時)に音を鳴らしたいので
Remover2を以下のように修正します。
こちらのサイトを参考にさせて頂きました。


using UnityEngine;
using System.Collections;

public class Remover2 : MonoBehaviour
{
 public AudioClip getCoin;
 void OnTriggerEnter (Collider collider)
 {
Sound (1);
Destroy (collider.gameObject);
Score.score += 3;
}

void Sound (int time)
{
GameObject obj = new GameObject ("sound");
AudioSource sound = obj.gameObject.AddComponent ();
sound.clip = getCoin;
sound.Play ();
Destroy (obj, time);
}
}


一応自分なりに改修を加えてWeb版で実行したキャプチャを。色のセンスは問わないで下さいw

※背景画象を設定したり試したのですが、グレーになってる部分に埋めた素材が無料じゃないかもなので、一旦外しておきます。


それと最後にフォルダなどを整理して、動画の方のマネをした私のUnityの配置です。

すごく分りやすくて本当に良い動画でした。たまたま見つける事ができてラッキーです。
概ねUnityの操作方法とか理解できた気がします。