ソースに絡まるエスカルゴ

貧弱プログラマの外部記憶装置です。

【Unity】備忘録#8 Awake、Start、Updateについて

UnityでScriptを作成した際、ソース中に空のStart関数とUpdate関数が自動的に生成されます。
今回はそれらにAwake関数を加えた三つの関数について説明兼メモ書きです。

■Awake関数
Awake関数はScriptをアタッチしているオブジェクトが実体化した一番最初に呼び出される関数。

■Start関数
Start関数はScriptをアタッチしているオブジェクト及びそのオブジェクトについている
他のコンポーネントの初期化(Awake関数の実行)が終了した際に呼び出される関数。

■Update関数
Update関数はStart関数が呼び出された後、毎フレーム呼び出される関数。

つまりは、
1:Awake
2:Start
3:Update(毎フレーム呼び出される)
という順番で実行されます。

[参考資料]
スクリプトリファレンス: Awake関数とStart関数・Update関数の用途の違い · SpriteStudio/SS5PlayerForUnity Wiki · GitHub

【Unity】備忘録#7 Planeに表示させた画像(Texture)を上下・左右反転させる方法

Planeという平たい面のオブジェクトがUnityにはあります。
過去の記事でPlaneに画像を表示させる方法を書きました。
rikoubou.hatenablog.com

今回はこのPlaneに表示した画像を上下・左右反転させる方法を説明していきます。

■いじるのはScaleの値のみ

結論から言うと「Scaleの値をマイナス値に変更する」のみで実現できます。

ここで言うScaleとはオブジェクトが持っているTransformのScaleの値です。
要は、以下の画像にあるScaleの値です。

f:id:rikoubou:20160206225956p:plain

このScaleのx値をマイナスにすると左右反転、
y値をマイナスにすると上下反転させた画像が表示されます。
(ここでの上下左右はカメラの座標によっては違う場合があります)

ちなみにScriptで変更する場合は以下のようにします。

// 対象のオブジェクトを取得
GameObject obj = GameObject.Find("Plane");
// オブジェクトのスケールを取得
Vector3 scale = obj.transform.localScale;
// ここではx軸をマイナスにしている 
scale.x = -scale.x;
// スケールを再設定
obj.transform.localScale = scale;

【お絵描き】絵本っぽい? 色塗り方法

今までとは全く関連はありませんが、
落書きしていた時に思いついた色塗り方法をメモしておきます。
(ちなみにツールClip Studio Paintを使っています)

f:id:rikoubou:20160205232052g:plain

上記のような色合いを作るには、

  1. 普通に線画を描く
  2. 線画部分を範囲選択して白色で塗り潰す
  3. ツール -> 筆(B) -> 墨 -> 薄墨で色を塗る

これで背景の上に対象のレイヤーを重ねても問題なく表示できます。

ちなみにキャラ全体の範囲選択よりもちょっと少し大きめの範囲を白で塗り潰し
背景とキャラとの間に隙間を作っています。

【Unity】備忘録#6 オブジェクト親子関係について

オブジェクトの親子を設定する方法についての説明です。

■親を設定する方法

オブジェクトの親子関係を設定する際は以下の方法で設定します。

GameObject parentObj; // 親にするオブジェクト
GameObject childObj;  // 子にするオブジェクト

// 通常のオブジェクトの場合
childObj.transform.parent = parentObj.transform;

// RectTransformを持つオブジェクトの場合
//(setParentを使わないと警告がログに出る)
childObj.transform.SetParent(parentObj.transform);

■オブジェクトから親または子を取得する方法

オブジェクトから親を取得する場合は「childObj.transform.parent」を使います。

GameObject parentObj = childObj.transform.parent;

オブジェクトから子を取得する場合は以下の記述で取得します。

GameObject parentObj; // 親となるオブジェクト

foreach (Transform n in parentObj.transform) {
	GameObject childObj = n.gameObject;
	// 以下childObjに対する処理
}

子に対して親は一つのオブジェクトしか設定できませんが、
親は子を複数持つことができるためforeachでループさせます。

特定の子に対して処理を行う場合は、オブジェクトの名前で判定するなどの処理が必要となります。

【Unity】備忘録#5 Unityプロジェクト共有について

Unityプロジェクトを別のPCでも開発するという場面があると思います。
MacWindowsの両方で開発する等の場合に、案外つまづくのがビルド時の設定引き継ぎになります。

プロジェクト毎zipで固めて共有すればよくね? という考え方ももちろんありますが
とりあえずのメモ書きです。(ネタが無いともいう…)

■Assetsフォルダ以下を共有する方法
Assets内の全てのファイルをパッケージ化する機能がUnityにあります。
f:id:rikoubou:20160202212550p:plain
Macでの画面です

上記の画像のように Assets -> Export Package... を選ぶとパッケージに含めるファイルを尋ねられるので
含めるファイルにチェックを入れてExport...ボタンを押下するとパッケージ化できます。

逆にパッケージをインポートしたい場合は Assets -> Import Package... からインポートできます。

ただしAssets内のファイルをインポートしただけではビルド時の設定は共有できないので
ビルド時の設定も共有する場合はもう一つ手順が必要になります。

■ビルド時の設定を共有する方法
結論から言えば、とあるフォルダ内にある全ファイルをコピーして同じ共有したいプロジェクトの同じフォルダ内にコピーするだけです。

そのとあるフォルダとは「ProjectSettings」フォルダです。

場所はプロジェクトフォルダの直下にあります。
このフォルダを丸ごとコピーして上書きするとビルド時の設定も共有することができます。

(どのファイルがどの設定と関係しているかまでは調査できていません…)

【Unity】備忘録#4 画像読み込みについて

前回でファイルアクセスが出来るようになったので、今回は画像読み込みについてになります。
rikoubou.hatenablog.com

手順としては以下の通りになります。

1:対象の画像ファイルをバイナリとして読み込む
2:読み込んだバイナリをTextureにする

■1:対象の画像ファイルをバイナリとして読み込む
FileStreamで読み込み、バイナリに変換してその値を返します。

public byte[] readPngFile(string path) {
	using (FileStream fileStream = new FileStream (path, FileMode.Open, FileAccess.Read)) {
		BinaryReader bin = new BinaryReader (fileStream);
		byte[] values = bin.ReadBytes ((int)bin.BaseStream.Length);
		bin.Close ();
		return values;
	}
}

■2:読み込んだバイナリをTextureにする
1のreadPngFileで取得したバイナリをTextureに変換します。

public Texture readByBinary(byte[] bytes) {
	Texture2D texture = new Texture2D (1, 1);
	texture.LoadImage (bytes);
	return texture;
}

new Texture2D (1, 1)の引数はそれぞれ縦横の画像サイズなのですが、
LoadImageでバイトを読み込むと元の画像サイズになるので問題はありません。


2でTextureにした後は前に書いた記事のように設定すれば表示されます。
rikoubou.hatenablog.com


これで外部にある画像ファイルをスクリプトで読み込み、Unity内で扱うことができます。

【Unity】備忘録#3 スクリプトからのファイルアクセスについて

スクリプトからのファイルアクセスについてです。

■パスについて

Unityでは一時ファイルやAssets内のファイルなど様々なパスを扱うことができます。
以下のブログ様に一覧としてまとめられています。

unityでplatformによって取得できるパス - Qiita

絶対パスで参照することもできますが、現実的には相対パスを利用することになると思うのでそれについて説明します。

よく使うことになるのはApplication.dataPathです。(多分)

このApplication.dataPathは先のパス一覧にあるように、MacOSWindowsでビルドした時やUnity開発時で微妙に変わっていたりします。

そこで自分がよく使っているパスを取得する関数が以下になります。

public string getPath() {
	string result = Application.dataPath;
	if (Application.platform == RuntimePlatform.OSXPlayer) {
		// MacOSでビルドした場合のパス(.appファイルの同階層のパス)
		result = result + "/../../";
	} else if (Application.platform == RuntimePlatform.WindowsPlayer) {
		// Windowsでビルドした場合のパス(.exeファイルの同階層のパス)
		result = result + "/../";
	} else {
		// それ以外の場合(Assets/Resourcesフォルダのパス)
		result = result + "/Resources/";
	}
	return result;
}

例として以下のようなフォルダ構成の場合、

hogeフォルダ
 |--image.png
 |--ビルドした.exeまたは.app

image.pngファイルへは getPath() + "image.png" でアクセスできます。