Unity5あれこれ

Sceneに配置したTextの中身をスクリプトで変更する(uGUI対応)

1. 空のGameObjectを追加
2. 以下のような内容のスクリプトを作成し、UnityのEditor上で1のGameObjectにアタッチする

    public Text hogeText;
    void Start() {
        debugText.text = "hage";
    }

3. UnityのEditorのHierarchy上で右クリックからUI→Textと選択
f:id:hchuno:20150407165124j:plain
4. 1のGameObjectを選択して、3のTextをhogeTextにドラッグアンドドロップして関連付ける
f:id:hchuno:20150407165309j:plain
5. UnityのEditorでプレイボタンを押すとTextの表記がhageに変わる

WebViewプラグインを用いて表示したHTMLから送られてきた値を取得する

    WebViewObject wvo;
    string htmlFilePath;

    void Start() {
        htmlFilePath = Path.Combine(Application.persistentDataPath, "sample.html");
        WriteHTML();

        wvo = (new GameObject("WebViewObject")).AddComponent<WebViewObject>();
        wvo.Init((msg) => {
            hogeText.text = msg;
            if (msg == “hoge”) {
		// Nextという名前のSceneに遷移
                Application.LoadLevel("Push");
            }

        });
        wvo.LoadURL("file://" + htmlFilePath);
        wvo.SetMargins(15, 150, 15, 20);
        wvo.SetVisibility(true);
    }
	

    void WriteHTML() {
        using (var writer = new StreamWriter(htmlFilePath, false)) {
            writer.Write(
                @"<html>
<body>
<ul>
  <li><a href='unity:hage'>callback 'hage'</a></li>
  <li><a href='unity:hoge’>callback ‘hoge’</a></li>
</ul>
</body>
</html>
");
            writer.Close();
        }
    }
}

AndroidManifest.xml

  • Androidのネイティブプラグイン作成等で必要。
  • プラットフォームをAndroidにセットした後、ビルドすると以下の場所に生成される
{プロジェクトルート}/Temp/StagingArea/

Unity5が来た!

AssetBundle関連

“The AssetBundle ‘◯◯◯’could not be loaded because it is not compatible with this newer version of the Unity runtime.
Rebuild the AssetBundle to fix this error.”

やっぱりか…(;´Д`)

Unity5のほうでAssetBundleビルドを行った後、再度AssetBundleのロードを試みるも、再び上記のエラー発生。

WWW.LoadFromCacheOrDownLoad()に渡すversionの引数をインクリメントすると、無事に新しいものがロードされるようになった!
(ローカルにUnity4時代のAssetBundleが残っていて、そちらをロードしようとしていたのが原因)

Unityあれこれ

ローカルのUnityプロジェクトが最新にならない

チーム開発等でUnityのプロジェクトを最新にしても、ローカルのAssetが古くて挙動がおかしいことがあった。
以下の手順で解決。

  1. Unityを終了
  2. プロジェクト直下のLibraryディレクトリを丸ごと削除
  3. Unityを起動

Canvas以下に置いたTestTextというコンポーネントを探して、テキストを変える

int number = 0;
var canvas = GameObject.Find ("/Canvas");
foreach (Transform child in canvas.transform) {
    if (child.name == "TestText") {
        Text target = child.gameObject.GetComponent<Text> ();
        target.text = "hoge" + number.ToString ();
    }
    number++;
}

GameObjectの表示/非表示切り替え

  • SetActive() を使う
  • 非アクティブ化されたGameObjectを取得できるFindDeep() を使う
    • 第二引数にtrueを渡すと非アクティブなGameObjectも検索対象になる
bool isActive = false;

gameObject.FindDeep ("MyChunoText", isActive).SetActive (isActive);

Modelとテーブルを追加する

追加したいテーブル

CREATE TABLE `hchuno_items` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `code` int(11) DEFAULT NULL,
  `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `version` int(11) DEFAULT NULL,
  `created_at` datetime DEFAULT NULL,
  `updated_at` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

手順

Active Recordを使ってModelを生成

$ rails generate model hchuno_items code:integer name:string version:integer

invoke active_record
create db/migrate/20150205000000_create_hchuno_items.rb
create app/models/assetbundle_master.rb
invoke rspec
create spec/models/hchuno_items_spec.rb
invoke factory_girl
create spec/factories/hchuno_items.rb

マイグレーションを実行してテーブルを追加

$ rake db:migrate

(in /Users/hchuno/projects)
== 20150205000010 CreateHchunoItems: migrating =========================

    • create_table(:hchuno_items)

-> 0.0399s
== 20150205000012 CreateHchunoItems: migrated (0.0400s) ================

コルーチン関連

処理内容

  1. ボタンを表示
  2. ボタンを押すと指定したSceneに遷移
  3. 裏で、指定したURLに接続

ソースコード

using UnityEngine;
using System.Collections;

public class Title : MonoBehaviour {
	void OnGUI () {
		if (GUI.Button(new Rect(Screen.width/2 -100 , 100, 200, 50), "GAME START"))
		{
			Application.LoadLevel("particles");
			StartCoroutine("LoadData");

		}
	}

	private IEnumerator LoadData() {
		string url = "http://localhost:3000";
		WWW hoge = new WWW(url);
		while (!hoge.isDone) {
			yield return null;
		}
	}
}

少しハマったところ

↑上記ソースコードの、

WWW hoge = new WWW(url);

の部分で当初、変数hogeの前の型宣言を書かずにビルドしたら、

hoge does not exist in the current context

と怒られた。

日本語配列キーボードなMacBook Proに行った設定

概要

職場で日本語配列キーボードのMacBook Pro(以下、MBP)が支給された。
US配列キーボードのものが欲しかったのだが、あまり贅沢は言えず。
とは言え、普段慣れ親しんでいるのはUS配列のキーボードなので、極力そちらに近づけたほうが良いということで、色々と試してみた。

各種設定

ThinkPadのUS配列USBキーボードを使用

MBPに接続して認識させた後、システム環境設定の「キーボード」にて少々キーバインドを変更する。
f:id:hchuno:20150109210105j:plain

メリット
  • ほぼUS配列キーボードのMBPと同じ挙動
  • トラックポインタが使える
デメリット
  • MBPの占有スペースが無駄
  • MBPのトラックパッドが使えない
  • 持ち運びにくい

キーバインディング変更ソフトを使用

  • Karabiner - OS X用のソフトウェア
    • 以前は「KeyRemap4MacBook」という名で知られていたソフト。OS X10.9から名前が変わった模様。
    • 言語に応じた細かい設定も可能になっており、「For Japanese」→「Change Keyboard Layout」とたどると以下の様な項目があった。「USE Japanese Kyeboard as US Keyboard」という項目もあったのだが、いまいち期待した挙動にならなかったため止めておいた。

f:id:hchuno:20150109210251j:plain

メリット
  • 場所を取らない
  • トラックパットが使える
  • 持ち運びしやすい
デメリット
  • ThinkPadキーボードと比べるとキー配列に違和感が残る
  • 表記と異なる挙動をするキーが存在する(普段の慣れに頼るしかない)
最終的な設定
  • かなりUS配列の挙動に近づいた!
    • 各キーの表記に釣られてしまうので、無刻印キーボードのつもりで慣れるしかない…

f:id:hchuno:20150112193925j:plain


結論

「腰を据えて使うときはThinkPadキーボード、持ち運ぶときはMBP単独」という使い分けができるようになっただけでもデカい。

rails console が動かなかった件

$ rails console
/home/vagrant/.rbenv/versions/2.1.5/lib/ruby/2.1.0/irb/completion.rb:9:in `require': cannot load such file -- readline (LoadError)

readlineが無い」ということなので、rb-readlineをインストール。

$ gem install rb-readline

Gemfileを開いて、

gem ‘rb-readline’

を追記。

その後、bundle installを実行。

$ bundle install

再度、rails console を実行したら無事に動いた。