Unityで、コンポーネント内のフィールドを文字列から動的に変更する

こんにちはー!!

Json からUnity2dのステージのデータを取ろうとしています。
その時、コンポーネントの値を変えたいと思い、この方法をやりました。
Reflectionを使ったりして、結構複雑でした。

ReflectionTest コンポーネントの内容は次のようにします。

これを、GameObject1 にアタッチすればできます。

安全性は・・

しかし、コンポーネント内すべてのフィールドにアクセスできるのは
ちょっとセキュリティが・・・なので、
特定の属性(ここではPermitReflection)がついたフィールドのみにアクセスできるようにします。

Reflectionに使ったしたコード(2つ上のコード)を、次のように編集します。

    Type componentType = Type.GetType(componentType);
    Attribute fieldAttribute = Attribute.GetCustomAttribute(componentType.GetField(fieldName), typeof(PermitReflectionAttribute));
    if (fieldAttribute != null)  // 属性が存在する場合のみ
    {
        Component targetComponent = GameObject.Find(gameObjectName).GetComponent(componentName);
        Type fieldType = componentType.InvokeMember(fieldName, BindingFlags.GetField, null, targetComponent, null).GetType();
        object parameter;
        // 汎用性を重視して、型がどんな場合でもstringからParseできるように
        if (fieldType == typeof(string))
        {
            parameter = fieldVal;
        }
        else if (fieldType == typeof(int))
        {
            parameter = int.Parse(fieldVal);
        }
        componentType.InvokeMember(fieldName, BindingFlags.SetField, null, targetComponent, new object[] { parameter });
    }
}

// 属性を追加
[AttributeUsage(AttributeTargets.Field)]
public class PermitReflectionAttribute : Attribute
{
}

ReflectionTest コンポーネントは次のように変更します。

PermitReflectionAttributeですが、属性として指定する場合は、
Attributeを抜いて、PermitReflectionとします。

Webpackで、CSS、Lessをロードする

こんにちはー!

Webpack、知っていますか。
require() などでできた、ファイルの依存関係を、簡単にしてくれます!
Browserify に似ていますが、Webpack はスタイルシート、JSON、画像なども一緒にできます!

CSSを読む

というわけで、スタイルシートをロードしましょう!
うまくいかない場合は、このリポジトリを見てください。

shundroid/webpack-stylesheet-example
Contribute to webpack-stylesheet-example development by creating an account on GitHub.

まず、フォルダー内で、次のコマンドを打ってください。

npm i --save-dev webpack

次に、css を読む、loaderを追加します。
その時、css-loader のほかに、style-loader を入れます!ここでハマった・・

npm i --save-dev style-loader css-loader

ファイルの構成は、次のようになります。

  • main.js
  • style.css
  • webpack.config.js
  • index.html

main.jsは、次のように書いてください。

require("./style.css"); // cssを読み込む

// alertとかをしておくと、読み込まれているかがわかりやすい
// alert("hello");

style.css

body {
  background-color: skyblue;
}

webpack.config.js

module.exports = {
  entry: './main.js',
  output: {
    filename: 'bundle.js'
  },
  module: {
    loaders: [
      { test: /\.css$/, loader: 'style!css' }
    ]
  }
};

index.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <script type="text/javascript" src="bundle.js"></script>
</head>
<body>
</body>
</html>

この状態で、Webpackを実行!

$ webpack
Hash: XXX
Version: webpack 2.0.6-beta
Time: 1009ms
    Asset   Size  Chunks             Chunk Names
bundle.js  12 kB       0  [emitted]  main
    + 6 hidden modules

bundle.jsが生成されます。

index.htmlを開くと、水色のページが表示されます。

Lessを読む

less-loaderを使用します。less もいります。

npm i --save-dev less-loader less

先ほどの style.css を、style.less に変更してください。

style.less

@color: orange;
body {
  background-color: @color;
}

Lessが動いているか確かめるので、変数を使いました。

main.jsを編集します。

// require("./style.css"); となっていたところを
require("./style.less"); // にする。

webpack.config.js も編集します。

// { test: /\.css$/, loader: 'style!css' } となっていたところを、
{ test: /\.less$/, loader: 'style!css!less' } // にする。

webpack を実行!

webpack

index.html を開くと、ページがオレンジ色になります。

まとめ

  • css-loader、less-loader を使うと、スタイルをスクリプトに変換して、js、typescipt などと合体できる!
  • css-loader を入れるときは、style-loader も入れる。
  • less-loader を入れるときは、style-loader、less も入れる。

【感動】VSCodeのTypeScriptで、「Find Usages」相当の機能が使えた!

TypeScriptのIDEをNetBeansにした
こんにちはー。TypeScript、使っていますか?今まで、Visual Studio Code を、エディタとして使っていましたが、作っていたアプリが大きくなってきたので、NetBeansを使...

ここで書いたように、VSCodeでは、TypeScriptで
「Find Usages」という、
WebStormとかで、変数、関数などがどこで使用できるかを
プロジェクト内で検索し、表示してくれる機能がないと思っていました。

しかし、ありました!!!

VSCodeでは、Find All References というらしいです。

検索したい変数、関数などにカーソルを置き、Shift + F12
もしくは、右クリック→「 Find All References 」でもできます。

vscode-ts-find-usages

似ている機能で「Peek Definition」という、定義を吹き出しで表示してくれるものがあります。
こちらのショートカットキーは、Alt + F12 です。
今までは、これを使っていたし、これしかないと思っていましたが、
Shift + F12で、定義も表示されてくれるので、もう使わなくていいです^^

というわけで、また NetBeans から VSCode にもどりました。

【TypeScript】引数が違うメソッド同士をオーバーロード

TypeScriptで、次のようなオーバーロードをしたかったです。

function test(num: number, x: number, y: number): void; // 1
function test(num: number, pos: number[]): void; // 2

function test(num: number, pos?: number[], x?:number, y?: number): void {
  if (typeof x !== "undefined") {
    // 1のとき
  } else if (typeof pos !== "undefined") {
    // 2のとき
  }
}

しかし、エラーが出ました。
次のようにすればできます。

function test(num: number, x: number, y: number): void; // 1
function test(num: number, x: number[]): void; // 2

function test(num: number, x: any, y?: number): void {
  if (typeof x === "number") {
    // 1のとき
  } else if (x instanceof Array) {
    // 2のとき
  }
}

引数名を共通にすればできます。ちょっと違和感はありますが・・

NetBeansで「fontconfig.properties」があるJDKの場所

こちらのサイトを参考に、
fontconfig.properties を編集して、日本語フォントはメイリオ、
英語は Consolas にしようとしていました。

しかし、僕の環境では、なぜかjdkがいくつも入っていて、
どれを変えたらいいのかわかりませんでした。

netbeans.confに書かれていた!

NetBeansで使っているJdkのインストール先は、netbeans.confに書かれていました。
netbeans.confは、(NetBeansのインストール先)/etc フォルダにあります。
僕の環境では、C:\Program Files\NetBeans 8.1\etc にありました。
次のようになっている行を見つけます。改行コードが LF なので、
メモ帳では正しく表示されないかもしれません。

# Default location of JDK:
# (set by installer or commented out if launcher should decide)
#
# It can be overridden on command line by using --jdkhome <dir>
# Be careful when changing jdkhome.
# There are two NetBeans launchers for Windows (32-bit and 64-bit) and
# installer points to one of those in the NetBeans application shortcut 
# based on the Java version selected at installation time.
#
netbeans_jdkhome="C:\Program Files\NetBeans 8.1\bin\jre"

netbeans_jdkhomeが、JDKのインストール先です。

というわけで、fontconfig.propertiesのパスは、

(netbeans_jdkhome)/lib/fontconfig.properties です。

僕の環境では、C:\Program Files\NetBeans 8.1\bin\jre\lib\fontconfig.properties になります。

TypeScriptのIDEをNetBeansにした

こんにちはー。
TypeScript、使っていますか?

今まで、Visual Studio Code を、
エディタとして使っていましたが、
作っていたアプリが大きくなってきたので、
NetBeansを使うことにしました!

TypeScript Editorプラグインを入れる

デフォルトでは TypeScript は使えないので、
プラグインを入れましょう!

https://github.com/Everlaw/nbts/releasesから、
「XXX.nbm」の最新版をダウンロードしましょう。

メニューバーの、ツールからプラグインを開きます。
Netbeans-tsplugin-install

  1. ダウンロード済み タブを開く
  2. プラグインの追加で、ダウンロードしたファイルを選択
  3. インストールし、IDEを再起動

補完を使いやすく

初期設定では、「 . 」を入力するまで、補完されません。
この設定を変えたいと思います。

  • ツールから設定を開く。

Netbeans-ts-setting

  1. エディタを選択
  2. コード補完タブへ
  3. 言語をJavaScriptにする
  4. 可能性のあるすべての状況に変更
  5. OKをクリック

便利な機能

宣言へ移動

これは、VSCodeでもあります。
宣言(定義されている場所)へ移動したい変数、プロパティなどにカーソルを置き、
Ctrl+B!!
もしくは、右クリックからナビゲート、宣言へ移動。
ファイルをまたがってもできます。

Ctrl+マウスポインタ

VSCodeでもあります。
変数名、型を取得できます。

使用状況を検索

これが一番やりたかった!
Visual Studio とかだと、開いてるファイル内でしかできないけど、
NetBeansはプロジェクト内でできる!!
変数にカーソルを置き、Alt+F7もしくは、右クリックから使用状況を検索。

netbeans-ts-usages

わーお!

2016/01/30 追記:
VSCodeでも、同じような機能がありました!

【感動】VSCodeのTypeScriptで、「Find Usages」相当の機能が使えた!
ここで書いたように、VSCodeでは、TypeScriptで「Find Usages」という、WebStormとかで、変数、関数などがどこで使用できるかをプロジェクト内で検索し、表示してくれる...

最後に

こんな感じに、大きなコードとかも楽に扱える便利な機能もあるので、
ぜひ使ってみてください!

【Intel HD Graphics】外部ディスプレイがちらつく

Intel HD Graphics 4000です。
外部ディスプレイで、スクロールしたりすると、
画面がちらつくような感じになります。

解決策

デスクトップの何もないところを右クリック → 画面の解像度
詳細設定をクリック
Display-setting

インテル(R) グラフィック/メディア・コントロール・パネル タブを開いて、
ディスプレイを、内蔵ディスプレイじゃない方、
リフレッシュレートを、59i Hzから、59p Hzにして、
適用する
Intel-Graphics-Control-Panel

これでできました!

Unityで二次元配列のJsonを読む

こんばんはー。

Unityのステージ内容を Yaml で作ろうと思っていました。

UnityでYAMLをパースする
※ UnityYamlMerge のことではありません!Unity で、2D ステージの内容を YAML で作って、それをパースする方法です。yaml-net を入れるhttp://sourceforge.net/project...

しかし、よく考えてみれば、Unity 公式でサポート(5.3から)されている、
Json で十分じゃね?と思いました。
ステージの内容は、次のようなJsonにしました。

{
  "version": 1,
  "stage": [
    ["block1", 2, 4],
    ["block1", 4, 4]
  ]
}

しかし、JsonUtilityでParseしても、うまくやってくれませんでした。

■配列のネストは1つまで

多次元配列、配列内配列(ジャグ配列)、配列のコレクションなどは、JSONにシリアライズしてくれない。
多次元配列(int[,] とか)は、.NET標準のシリアライザも対応してないので仕方ない。
しかし int[][] や List<int[]> 、 List<List>なども、JsonUtilityは華麗にスルーする。

http://ch.nicovideo.jp/ntmi/blomaga/ar927398より)
とのことです。

というわけで、LitJSON というライブラリを使うことにしました。

ダウンロード

http://lbv.github.io/litjson/から、
Download で dll をダウンロードすると楽。
litjson-download-dll

ダウンロードした dll を、Plugins/ ディレクトリにドラッグ&ドロップ。
Drag-litjson-Unity

次のように書く。

using LitJson;

// 省略

void MakeStageJson(string data)
{
    JsonData jsonData = JsonMapper.ToObject(data);
    Debug.Log((string)jsonData["stage"][0]);
}

実行結果:
unity-debuglog-litjson

このように、jsonData["stage"][0] と、ただインデックス(?)をたどるだけで、
二次元配列も使えます!

LitJSON便利です!

UnityでYAMLをパースする

※ UnityYamlMerge のことではありません!

Unity で、2D ステージの内容を YAML で作って、
それをパースする方法です。

yaml-net を入れる

http://sourceforge.net/projects/yaml-net-parser/files/から、
フォルダーをたどっていくと、snapshot.zip があるので、ダウンロードし、展開してください。

Code ディレクトリ内にある、「Yaml.dll」を、Unityの Assets/Plugins に突っ込みます。
yaml-dllunity-plugins-folder-yamldll-import

スクリプトを追加

新しいスクリプトを作成し、次のように書きます。

using Yaml;

// 省略

void Start () {
    Node yamlNode = Node.Parse("- item1\n- item2");
    Debug.Log(yamlNode);
}
  • Yaml 名前空間が見つからない? Plugins/ ディレクトリに Yaml は入っていますか?
  • Node クラスは、Yaml.Node です。

これで、パースができました。
このスクリプトを、シーン内の空のオブジェクトにアタッチして、実行してみましょう。

yaml-unity-parse

成功です!

yaml-net の詳細情報は、公式サイトを参照してください!

Windowsへの「hub」コマンドのインストールでハマった

by Irish Typepad

こんにちは。

hub コマンドを知ってますか。

git + hub = github とのことで、git コマンドを github 用に拡張したものです。

そのインストールでハマりました。

必要となるもの

  • Git (公式だと 1.7.3 or newer)
  • Go (公式だと 1.4 or better)
  • Cygwin、OpenSSH (SSHを登録するとき)
  • Vi、Vim とかの Cygwin 上でファイルを編集できるやつ
  • Github のアカウント

これらをインストールしておいてください。
Cygwin は、alias の登録のほか、鍵を作るときに使いますので、OpenSSH のモジュールも入れておいてください。
Cygwin-OpenSSH
続きを読む →