Unity:skyboxを動かす

Unityでskyboxを動かす方法です。

 

Unityの3dゲームにおいて背景をつけるとすればSkyboxを使うと思います。

ほとんどの場合で使わないと思いますが、Skyboxを動かす方法を解説したいと思います。

 

まず動かすってどういうことかわからない方はここの動画を見ていただければわかると思います。

動画の例では銀河系の背景を動かしていますが、星々が動いているのがわかると思います。

 

ではさっそく解説(と言っても既存のものを使わさせていただくだけですが)始めていきたいと思います。

 

1:動かすために必要なものをそろえる

まずここに行きGalaxyBoxをダウンロードします。ここに動かすスクリプトなどが含まれています。

その後ダウンロードしたものの

・GalaxyBox.shader
・GalaxyBoxUpdater.cs
・RandomRotation.cs

の3つを、使用したいプロジェクトにImportします。

また同時に背景として使用したい、動かしたい画像もImportします。

 

2:背景を動かす

2-1背景画像の設定

まず動かす背景画像の設定です。

2014-05-31_220300

 

まず画像のTexture Typeを上記の画像のようReflectionにします。

mappingはいろいろ試し一番いいのがいいと思います。ここは最後に設定しましょう。

 

2-2マテリアルを作成し、そこに画像を登録する

Editor上でマテリアルを新規作成、shaderをCustom->Galaxy Boxを選び、

2-1で作成した画像マテリアルのTextureにセットします。

 

2-3背景を動かす

EditorのGameObject->Create Emptyで空のゲームオブジェクトを作成し、

1でImportしたGalaxyBoxUpdater.cs、RandomRotation.cs

の2つを作成した空のオブジェクトにセットします。

 

GalaxyBoxUpdater.csのGalaxy Boxに2-2で作成したマテリアルをセットします。

 

以上が完了し再生を押し、背景が動いていたら成功です。

比較的簡単に動かすことができるので、凝った演出をするときに

使うといいかもしれませんね。

 

以上、Skyboxを動かす方法でした。

Unity:Monodevelopで日本語を入力できるようにする

UnityのMonodevelopで日本語を入力できるようにする方法です。

 

Unityの標準搭載のEditorはMonodevelopです。

 

基本的に使いやすくいいのですが、

ただ一つ日本語を入力することができないのが難点です。

 

ですので今日はそのMonodevelopで日本語を使う方法を

解説していきたいと思います。さっそく説明に入ります。

 

日本語を使えるようにするにはいくつか方法があるのですが、

今回は日本語を使うために痛Monodevelopというものを使います。

 

痛MonodevelopとはUnityの中の人が作ったMonodevelopの背景を

変えることができるというものです。

下記のように変えることができます。

 

f:id:anchan828:20140117205400p:plain

 

本来はEditorの背景を変えることができるものなのですが、

これを導入すれば同時に日本語入力も可能になります。

 

導入方法はこちらのリンク先のけいごのなんとかさん(HPの題名)のHPに説明が記載されています。

 

Unityでの使い方ですが、設定をし直さなければプログラムを開く際、

標準でついてくるMonodevelopが起動されてしまうのでここを直します。

 

下の場合では上で作成したMonodevelopの名前を変更し、

痛Monodevelopとし保存しています。ですので人それぞれ違うと思うので、

自分自身がつけた名前で読み替えて設定をしてください。

 

[Windowsの場合]

まずUnityのメニューのEditor->preferenceを開きExternal Toolsを開きます。

そこにExternal Sclipt Editorという項目があるので、そこで上のリンク先で

設定をした痛Monodevelopを選択します。

 

するとしっかり起動時に痛Monodevelopが立ち上がってくれます。

[Macの場合]

Unityメニューから[Unity]-[Preferences]で設定を開き、

そのあとはwindowsの設定で説明したのと同じ要領でできます。

 

日本語を入力することでscliptで動的に日本語メッセージを

変えることができるようになります。

 

この方法でどんどん活用していきたいですね。

 

以上、Unitで:Monodevelopで日本語を入力できるようにする方法でした。

 

Unity:XMLで書かれた外部テキストファイルからテキストを読み込む方法

UnityでXMLを使い、外部からテキストを読み込む方法です。

 

Unityでテキストを外部ファイルから読み取りたい、つまりテキストだけのファイルと

コードのプログラムに分けたい時にはXMLあるいはJsonを使うと便利です。

 

今回はXMLを使う方法を解説したいと思います。

 

さてまず最初にXMLとはマークアップ言語の一つです。

ここでちょっとだけマークアップ言語について説明します。

 

マークアップ言語とは「タグ」と呼ばれる特定の文字列で地の文に情報の意味や構造、

装飾などを埋め込んでいく言語のことで、XMLはユーザが独自のタグを指定できることから

マークアップ言語を作成するためのタグ言語とも言われています。

 

ここではとりあえず任意のタグをつけれうることと構造化出来ることをを押さえておけば大丈夫です。

また後に出てくる例を見ていただければなんとなくわかると思います。

 

さっそくUnityでXMLを使う方法を解説していきます。

 

1:XMLを解析するプログラム

まず今回一番重要となるXMLを解析するプログラムです。

一番簡単な方法としては、ここで提供されているプログラムを使うのが一番簡単です。

 

上記のサイトに飛ぶとプログラムが乗っているのでそれを改良して使うのが一番簡単です。

 

見ていただければなんとなくわかると思うので、重要なとこだけ解説したいと思います。

 

2:コードの簡単な解説

 

  XmlDocument xmlDoc = new XmlDocument(); // xmlDoc is the new xml document.
  xmlDoc.LoadXml(GameAsset.text); // load the file.

まず上のコードはXMLで書かれたtextを読み込むための文です。

一番上で初期化し、2番目コードの引数に読み込みたいtextファイルを指定しています。

XmlNodeList levelsList = xmlDoc.GetElementsByTagName("level");

Levelというタグを読み込み、それ以下の要素をlistに格納しています。

サンプルでのLevelのタグとは

<level>
    <name>Level 1 (xml)</name>

の<level>の部分です。

次にそのリストの各要素を読み込むため、

 foreach(XmlNode levelInfo inlevelsList)

で先ほどのListの要素1つ1つを繰り返しで呼び出しています。

XmlNodeList levelcontent = levelInfo.ChildNodes;

その要素の子供のノードつまり階層が下の要素をlevelcontentに代入しています。

 foreach(XmlNode levelsItens inlevelcontent)

先ほどと同じようにlevelcontentに格納された1つ1つの要素を

繰り返しこれ以降のプログラムをそれぞれに実行しています。

if(levelsItens.Name == "name")
    {
     obj.Add("name",levelsItens.InnerText); // put this in the dictionary.
    }

上のコードでタグがnameである所に書かれている文字列を

objに登録しています。例では

<name>Level 1 (xml)</name>

が最初に呼び出されているので、このコードでLevel 1 (xml)”という文字列がでobjに登録されています。

以下は上と同じようにタグで判別->そこに書かれている文字列をobjに登録を繰り返しています。

以上のようにXMLを使うとタグで構造化し、簡単に外部テキストファイルから

テキストを読み込むことができるのでとても重宝します。

これを使って物語のあるゲームをどんどん作りたいですね。

以上、UnityでXMLで書かれた外部テキストファイルからテキストを読み込む方法でした。

Unity入門:GuiTextを使う、Scriptで文字を変更する

GuiTextの使い方です。

 

ゲームで文字を表示したい場合例えば現在のスコアや、

残機数などを表示したい場合にとても重宝します。

 

さっそく解説に入ります。

1:GuiTextを用意する。

GameObject->CreateOther->GuiTextから作成します。

 

すると中心に(Game画面に)Textが表示されたはずです。

 

2:位置を調節する。

2014-05-25_112634

上の画像のようにGuiTextのpositionを調節して位置を調節します。

注意する点はGui系のpositionは

画面左下が(0,0)右上が(1,1)となる点です。

 

そのためx,yにマイナス、あるいは1以上を入れた場合は

画面から出てしまい表示されないので注意が必要です。

 

以上のことを考慮しながらTextの表示位置を調節します。

Game画面で位置を確認しながらずらすのがいいと思います。

 

FontSizeが初期の場合0になっていると思うので、

自分の好きな大きさに変更します。

 

以上で表示位置、表示設定の変更は完了です。

 

3:Scliptで表示文字を変更する。

コード例を記載します。

public GameObject Score;

private GUIText scoretext;

void Start(){

scoretext = Score.GetComponent<GUIText> ();

scoretext.text=”変更したいText”;

}

上のコードでtextをscliptで変更することができます。

上の場合呼び出されたと同時に表示するtextを変更します。

 

public で宣言されているscoreには上で作成したGUItextの

をEditor上でドラッグアンドドロップで登録します。

 

GetComponent<GUIText> ()はアタッチされているComponentを

取得するコードです。<>内に取得したいComponent名を記述します。

 

一応例を出しておきます。

たとえばゲームオブジェクトTestにアタッチされているコンポーネントTextCOM

をsclipt上で取得したいとします。

 

その場合は以下のコードで取得することができます。

 

private TestCOM testcom;

public GameObject Test;

void Start(){

testcom = Test.GetComponent<TestCOM> ();

}

 

簡単ですね。

 

次に取得したGUITextのComponentを使いTextを変更しています。

 

scoretext.textにtextを代入することで、

画面に表示されるtextを変更することができます。

 

再生を押して表示されているTextが変更されれば成功です。

またScoreが変更されたときにTextが変更されるようにするには、

変更と同時に.textで変更を代入してあげればいいです。

 

このように簡単にできるのでどんどん活用していきたいですね。

 

ただしUnityの標準GUI系は処理が重いので、

もしNGUIが使える方はNGUIを使ったほうがいいです。

 

NGUIについては後日書きたいと思います。

 

以上GUITextの使い方でした。

Unity2D:背景を動かす

Unity2Dでの背景の動かし方についてです。

 

背景を動かすことによって自分がその場にいてもあたかも移動しているように見せ、

疾走感をゲームに追加してあげることができます。

 

基本的にエンドレスラン系のゲームでは、自分自身がフィールドを移動できるようにしてしまうと

マップ上からはみ出さないようにするため、可能な限り大きく作らなくてはいけないという制約ができます。

 

そのため従来のシステムとして自分はその場にとどめ、

代わりに障害物を自分に接近させ通り過ぎた時点で消すという方法が一般的な気がします。

 

そのようにすることでマップ自体は、

自分が見える範囲を作成するだけで済むということです

 

ですがこのままであると自分がその場にとどまっているように見え疾走感に欠けるので、

背景を動かすことによってあたかも移動しているように見せることがとても重要になってきます。

 

では前置きはこれぐらいにして本題に移りたいと思います。

 

背景を動かすにはいくつか方法がありますが、

今回はoffsetを指定する方法を解説します。

 

1:コード、方法の解説

まずはコードからです。

 

private  float speed = 1;
private  float offset;
    void Update () {
        offset += Time.deltaTime * speed;
        renderer.material.SetTextureOffset("_MainTex", new Vector2(offset, 0));
    }

 

こちらの方法は左端に表示される位置を徐々にずらしていき

移動させているように見せる方法です。

 

例としてoffsetが0の画像がこれだとします。

 

2014-05-24_133537 2014-05-24_133617

 

次にoffsetを0.5としたとき、

2014-05-24_133617

 

こうなります。

つまりoffsetとは、表示する開始位置を決定していするものだということです。

 

offsetを0.5としたとき、開始位置がリンゴの真ん中から始まって右に行き、

最終的に真ん中に戻ってくるといった具合です。

 

これを利用し開始位置をずらすことで背景があたかも移動しているように見せるのが、

offsetを使用する方法です。

 

次に具体的な実装方法です。

2:具体的な実装例

まずUnityEditor上でGameObject->Quadを選択し、

Quadに自分の使用したい画像を登録します。

用意する画像はtexture型でimportします。

 

次に作成したQuadに上で記述してあるコードを

アタッチします。

 

以上になります。再生を押して背景がしっかり動けば完成になります。

 

背景を動かすのはとても簡単に実装できるので、

2Dゲーム開発でどんどん使っていきたいですね。

 

以上、Unity2Dで背景を動かすでした。

Unity入門:スクリプトからゲームオブジェクトを生成する

スクリプトからゲームオブジェクトを生成する方法です。

 

ゲームの進行に応じてゲームオブジェクトを増やすことは多々あります。

例えば特定の条件で敵キャラを追加したり、時間に応じて回復アイテムを

フィールド上に出現させたりなどです。

 

ゲームを作っていく際には必ずと言っていいほど必要な知識であると思うので、

どんどん活用していければと思います。

 

ではさっそく解説していきたいと思います。

 

オブジェクトを生成するには以下のコードを使います。

 

public GameObject targetprefab;

Instantiate(targetprefab, Vector3 position,Quaternion rotation);

まず第一引数には作成したいオブジェクトのprefabを指定します。
 

prefabとはオブジェクトの元となる型のようなもので、

Editor上で 右クリック->Crate->prefab から作成し、

作成したprefabに複製したいオブジェクトをドラッグアンドドロップすることで

そのオブジェクトのprefabを作成することができます。

 

わざわざprefabを作成する利点としては、ゲーム上に一つのものを複数置く場合に

(例えばブロック崩しのブロックなど)有効です。

 

わざわざ一つずつ複製し作る代わりにprefabを1つ作ることで、

画面においていけるので作成に手間がかからないということがあります。

 

またパラメータを変えたい場合などに複数のもののパラメータを一つずつ変える代わりに

prefabのパラメータを変えることですべてに反映されることも利点の一つです。

 

今回の場合作成するobjectをpublicで指定してあげているので、

実際に使う際にはEditor上でスクリプトを選択し作成するGameObjectを指定する

欄が作られているので、そこにドラッグアンドドロップしてあげて適応してください。

 

第二引数は作成する場所をVector3型で指定します。

第三引数には作成するオブジェクトの向かせる向きをquaternion型で指定します。

 

このようにして簡単に作成することができます。

これを活用してどんどん要素を追加していきたいですね。

 

以上、スクリプトからゲームオブジェクトを生成するでした。

Unity:オブジェクトに(Lightを使わず)影をつける。

オブジェクトに影をつける方法を解説します。

 

今回はDirection LightなどのLightなどで直接影を作成せず、

Blob Shadowという影の画像を地面にprojecterで投影する方法をとります

 

この方法の利点として、draw callがLightでの影の作成に比べ大幅に

削減できることがあります。

 

スマフォ向けゲームなどのdraw callをなるべく抑えたいゲーム作成に

とても向いてる実装です。

 

さっそく解説していきたいと思います。

 

まず事前準備として必要なBlob shadowですがUnity Editorの

Assets->import package->projectors からインポートします。

 

インポートした後prefabにBlob Shadow Projectorというものがあると思うので、

そちらをHierarchy上で影をつけたいキャラクターの子として追加してあげます。

 

追加してあげたらprojectorがしっかりと影を投影してくれるよう、

位置調節や回転をしてください。

 

また影が適切な大きさになるよう、あらかじめつけてある

projectorコンポーネントの各プロパティを調節してあげてください。

 

プロパティがいろいろあるので解説を載せておきます。

Near Clip Plane クリップ近面前のオブジェクトは投影されません。
Far Clip Plane この距離を超えたオブジェクトは影響を受けません。
Field Of View ビューのフィールド (単位: °)。 これは、プロジェクタが Orthographic でない場合にのみ使用されます。
Aspect Ratio プロジェクタのアスペクト比。 これにより、プロジェクタの高さと幅を調整でいます。
Is Ortho Graphic 有効にすると、景色の代わりに、Orthographic になります。
Ortho Graphic Size 投影の Orthographic サイズ。Is Orthographicがオンになっている時にのみ使用されます。
Materials オブジェクトに投影されるマテリアル。  
Ignore Layers Ignore Layersの 1 つにあるオブジェクトは影響を受けません。 

 

のようにいろいろなプロパティがありますがよく使うものは限られているので

全ては覚えなくて大丈夫です。ここに関しては自分で値を動かし

どこが変更されたかを見るのが一番理解できると思います。

 

設定し終えたら今の状態ではおそらく影が影を映したいキャラクター

自身にも映ってしまっていると思います。

 

これを解消するために上で書かれているIgnore Layersを使います。

ここにセットされたlayerにはプロジェクタが投影しないので、それを利用します。

 

まずキャラクタにlayerを追加します。キャラクターを選択し名前の下にある

Layerをクリックしadd Layerで例えばPlayerというLayerを作ります。

その後もう一度クリックし、先ほど作ったLayerを選択します。

 

次にキャラクターの子のBlob Shadow Projectorを選択し

projectorのプロパティーignore Layerに先ほどキャラクターに

セットしたLayerを選択します。

 

この状態でもう一度再生すると影が下に投影され、

キャラクターには影が投影されていないはずです。

 

キャラクターに影をつけることで現実味がかなり増しますので、

影をつけるかつdraw callを減らしたい場合はぜひこの方法を試してみてください。

 

以上、Unityのオブジェクトに(Lightを使わず)影をつけるでした。

 

Unity:スマフォ向けタッチ判定

Unityでのスマフォ向けタッチ判定方法です。

 

Unityでスマフォ向けにゲームを作るときには、画面タッチを判定

またタッチされた座標を扱うことが多くあります。

 

今回はそれに向けたタッチ判定方法や、タッチ座標の取得方法を解説していきたいと思います。

それではさっそく解説に移ります。

 

1:タッチされているかの判定

if(Input.touchCount == 1){

処理内容

}

 

Input.touchCount でタッチされている画面箇所の個数を数えることができます

それを利用し画面がユーザーにタッチされているかを上のコードで判定しています。

 

2:タッチされている座標を取得する

Input.touches[0].position

 

Input.touches[i]でi番目タッチの情報を取得しています。

その後ろに.positionをつけることで座標を取得することができます。

 

3:現在のTouch状態を判別する

こちらに関しては5つのフェーズを判別することができます。できるのは下記の5つです。

  1. Began 指がスクリーンをタッチしたばかりです。
  2. Moved 指がスクリーン上で動きました。
  3. Stationary 指がスクリーンをタッチしてますが最終フレームから移動してません。
  4. Ended 指がスクリーン上から離れました。これはタッチの最終フェーズです。
  5. Canceled システムがタッチのトラッキングをキャンセルしたとき。

これらの状態を現在の状態と比較し、判別します。

 

使い方の例としてBeginの判別のコードをかくと、

 

if (touch.phase == TouchPhase.Began){

タッチ初めの処理を書く

}

のようになります。こうすることで現在の状態と判別して条件文を実行することができます

 
ここでのtouch.phaseのtouchはTouchクラスのインスタンスです。Touchクラスのインスタンスは

Touch tch = Input.GetTouch(0);

のようにすることで取得することができます。上では最初のタッチの情報を取得しています。

 

Touch型では状態のほかにもタッチした回数などの情報を取得することができます。

取得できる情報については詳しくはこちらをご覧ください。

 

Unityでスマフォ向けゲームを使うときは必ずと言っていいほどタッチの判定は

使うので、常に使えるようにしておきたいですね。

 

以上、UnityでのTouch判定の実装方法でした。