【スポンサーリンク】

【Unity5.3】JsonUtility使い方まとめ

JsonUtilityとは?

オブジェクトをJSON形式の文字列にしたり、JSON形式の文字列をオブジェクトにしたりできるJSONパーサ。今までMiniJSON、SimpleJSONなど外部ライブラリがあったが、Unity5.3で公式にJSONパーサが実装された。

変換メソッドについて

オブジェクト → JSONにしたい場合は、
string json = JsonUtility.ToJson(myObject);

JSON → オブジェクトにしたい場合は、
MyObject myObject = JsonUtility.FromJson(json);

サンプルコード

変換対象クラスのサンプル
using UnityEngine;
using System.Collections;

[System.Serializable]
class MyObject {
	public Vector3 vector;
	public int[] intArray;
	[SerializeField]
	private float privateFloat;

	public float PrivateFloat {
		get {return privateFloat;}
		set {privateFloat = value;}
	}
}
確認用コード(適当なゲームオブジェクトに貼り付ける)
using UnityEngine;
using System.Collections;

public class JSONTest : MonoBehaviour {

	void Start () {
		MyObject myObject = new MyObject();
		myObject.vector = new Vector3(1, 2, 3);
		myObject.intArray = new int[3];
		myObject.intArray[0] = 4;
		myObject.intArray[1] = 5;
		myObject.intArray[2] = 6;
		myObject.PrivateFloat = 1.23f; /* private変数は[SerializeField]がないと保存されない */

		/* オブジェクトからJSONへの変換 */
		string json = JsonUtility.ToJson(myObject);
		Debug.Log(json);

		/* JSONからオブジェクトへの変換(その1) */
		MyObject obj1 = JsonUtility.FromJson<MyObject>(json);
		Debug.Log(
			obj1.vector + ", [" +
			obj1.intArray[0] + ", " + obj1.intArray[1] + ", " + obj1.intArray[2] + "], " +
			obj1.PrivateFloat
		);

		/* JSONからオブジェクトへの変換(その2) */
		MyObject obj2 = new MyObject(); //初期化が必要
		JsonUtility.FromJsonOverwrite(json, obj2); //obj2が初期化されてないとエラーになる
		Debug.Log(
			obj2.vector + ", [" +
			obj2.intArray[0] + ", " + obj2.intArray[1] + ", " + obj2.intArray[2] + "], " +
			obj2.PrivateFloat
		);
	}

}

実行結果

きちんと変換できてます。
f:id:Phalusamil:20151210200117p:plain

その他メモ

変換対象クラスの4行目にある[System.Serializable]はあってもなくても動作する。が、あったほうが高速らしい。

JSONに変換される変数はpublic変数、または[SerializeField]がついている変数だけ。なのでprivate変数を変換したい時はサンプルにあるように[SerializeField]をつける。

JSON → オブジェクトにする方法としてFromJsonOverwriteメソッドもある。
公式では、すでにインスタンス化されてるオブジェクトに入れたい時はこっちを使うと書いてあったが、FromJsonメソッドでも正しく動作した。
もしかしたら、メモリ効率や速度などに利点があるのかもしれないので、一応FromJsonOverwriteメソッドを使ったほうがいいかもしれない。

参考文献

docs.google.com

【CodeIgniter】Hostingerのレンタルサーバで.htaccess設定

Hostingerのレンタルサーバは.htaccessが使えると公式で言っているので、CodeIgniterのindex.phpを消すためにいつもの.htaccessを使ってみたがうまくいかなかった。

いろいろと探してみたところ、次の.htaccessを使えばうまく動作することが分かった。

RewriteBase /
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/system.*
RewriteRule ^(.*)$ index.php?/$1 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ index.php?/$1 [L]

【Unity5】Standard Assetsで三人称視点のキャラクターをコーディングなしで作成する

準備

メニューのAssets → Inport Packageから下記をインポートする。

  • Cameras
  • Characters
  • Prototyping(動作確認用)

f:id:Phalusamil:20151014061806p:plain

次にProjectのAssets → Standard Assets → Characters → ThirdPersonCharacter → PrefabsからThirdPersonControllerをシーンに追加する。

f:id:Phalusamil:20151014061832p:plain

そして動作確認用に床が必要なのでAssets → Standard Assets → Prototyping → PrefabsからFloorPrototype64x01x64を設置する。

f:id:Phalusamil:20151014061843p:plain

最後に、カメラを設置するのでmain cameraをシーンから消して準備完了。

(以下視点操作の方法で実装が分岐します。)

マウスによる視点操作の場合

Assets → Standard Assets → Cameras → PrefabsからFreeLookCameraRigをシーンに追加する。

f:id:Phalusamil:20151014061941p:plain

そしてFreeLookCam(Script)コンポーネントのパラメータを次のようにする。

f:id:Phalusamil:20151014061901p:plain

TargetをThirdPersonControllerにし、Move Speed、Turn Speed、Turn Smoothingの三つを調整する。
Move Speedはカメラの追従速度。
Turn Speedはマウスを動かした際のカメラの回転量。
Turn Smoothingはカメラの回転速度。大きな値、または0にすればマウスを動かした分だけ瞬時に回転する。

なおLock Cursorにチェックを入れれば、実行中はマウスカーソルが動かなくなる。(※下記のサンプルはチェックなし)

サンプル

f:id:Phalusamil:20151014061917g:plain

自動的に視点変更する場合

Assets → Standard Assets → Cameras → PrefabsからMultipurposeCameraRigをシーンに追加する。

f:id:Phalusamil:20151014062158p:plain

そしてAutoCam(Script)コンポーネントのパラメータを次のようにする。

f:id:Phalusamil:20151014062633p:plain

TargetをThirdPersonControllerにし、Move Speed、Turn Speed、Spin Turn Limitの三つを調整する。
Move Speedはカメラの追従速度。
Turn Speedはカメラの回転速度。
Spin Turn Limitはカメラが一度に回転する角度の上限。360にしておけばスムーズに動く。

サンプル

f:id:Phalusamil:20151014062223g:plain

参考文献

Standard Assets全般について以下のサイトを参考にしました。tsubakit1.hateblo.jp

はてなブログのSEOが強すぎて驚いた話

※注意書き

色々なブログシステムで検証を行ったわけではありません。

私の体感で「はてブロのSEOすげぇ」と思っただけです。

本題

前日、こんなタイトルの記事をはてなブログに投稿しました。

【Unity 2D】あるオブジェクトを指定オブジェクトの方向に向ける - 備忘録

この記事を投稿してから5分後くらいに、なんとなくタイトルをコピペしてgoogle検索したところ、

すでに一番上に表示されていた

という事件(?)が発生しました。

ブログ初心者の私は、

「おー最近のブログシステムはすごいんだなぁ。」

くらいにしか思いませんでしたが、5時間後くらいに

「・・・普通に検索しても上位にくるのか?」

と気になったので検証してみました。

まずはこんな感じに検索。

「unity 2d オブジェクト 向ける」

結果は・・・

f:id:Phalusamil:20151003113740p:plain

おーすごい。(母数たったの11000件ですが。)

あとは単語削ったり変えたりしてみました。

「unity オブジェクト 向ける」 → 6位
「unity 2d 向ける」 → 3位
「unity 向ける」 → 8位
「unity 2d オブジェクト 向きを変える」 → 10位

ヒットしたページの母数は数万件程度ですが、なかなかの結果です。

やはり、

記事を投稿した日に上位にくる

ってところが良いですね。

ただし、
単純に私がブログとかSEOに詳しくないだけでこんなの当たり前
という可能性も十分にあるので悪しからず。

【Unity 2D】あるオブジェクトを指定オブジェクトの方向に向ける

要約

下記のメソッドを使えばOK

Vector2 Aim(GameObject rotationObject, GameObject targetObject, float angleOffset) {
	Vector3 posDif = targetObject.transform.position - rotationObject.transform.position;
	float angle = Mathf.Atan2(posDif.y, posDif.x) * Mathf.Rad2Deg;
	Vector3 euler = new Vector3(0, 0, angle + angleOffset);
	
	rotationObject.transform.rotation = Quaternion.Euler(euler);
	
	return posDif.normalized;
}

仕様

引数
  • rotationObject: 回転させたいオブジェクト
  • targetObject: ターゲットとなるオブジェクト
  • angleOffset: 角度補正値 ※1

このメソッドの効果

rotationObjectがtargetObjectの方向に向く

返り値について

rotationObjectからtargetObjectへの単位方向ベクトルが返される。
このベクトルはrotationObjectからtargetObjectに向けて何かを動かしたいときに使える。

※1 角度補正値(angleOffset)について

例えば下記二つのSpriteオブジェクト(矢印の画像)に上記のメソッドを適用することを考える。

f:id:Phalusamil:20151001160443p:plainこちらの画像は角度補正値を0にすると正しい方向に向く

f:id:Phalusamil:20151001160447p:plain一方こちらの画像は角度補正値を−45にする必要がある

角度補正値をこれらの値に設定する理由は、角度の基準が次のようになっているためである。

f:id:Phalusamil:20151001160400p:plain

なので、0度に合わせる必要がある。

f:id:Phalusamil:20151001160345p:plain

その昔、デザイナーが描いた弓矢の画像が135度くらいを向いていたが、このメソッドのおかげで元画像を修正する手間が省けた記憶がある。

【スポンサーリンク】