強火で進め

このブログではプログラム関連の記事を中心に書いてます。

iOS向けPNGを通常のPNGに戻す方法とPNGの最適化、xcrun

iOS向けのプログラムを作る時にアプリに同梱するPNGはデフォルトの設定だと最適化が行われます。このPNGをどの環境でも見れるPNGに戻す方法の書かれたブログ記事を見かけました。変換方法自体は公式のドキュメントなども有るのですがパスが長くて結構記述が面倒なので簡単に使える様にシェルスクリプトなども紹介されていました。

Technical Q&A QA1681: Technical Q&A QA1681
https://developer.apple.com/library/ios/#qa/qa1681/_index.html

Red Sweater Blog – Fixing PNGs
http://www.red-sweater.com/blog/2517/fixing-pngs?utm_source=iOS+Dev+Weekly&utm_campaign=89112a407f-iOS_Dev_Weekly_Issue_45&utm_medium=email

ここだけでもまぁ、参考になるのですがその後に書かれていた2点も興味深い内容でした。

まず1点目、xcodeがビルド時に行う圧縮より、ImageOptimで圧縮した方が30〜40%サイズを削減できるそうです。

2点目としては xcrun というコマンドです。
これは該当のフォルダにパスを通さなくてもSDKの中に有るツールを実行可能にしてくれるツールみたいです。

例えば以下の様に記述すると pngcrush のフルパスを指定したのと同じ扱いになります。

xcrun -sdk iphoneos pngcrush -revert-iphone-optimizations

以下の記述と同等。

/Applications/Xcode.app/Contents/Developer//Platforms/iPhoneOS.platform/Developer/usr/bin/pngcrush -revert-iphone-optimizations

xcrun(/usr/bin/xcrun) はファイルを開いてみるとただのシェルスクリプトみたいです。内部では /usr/share/xcode-select/xcrun に投げてるみたいです。

関連情報

xcrun の使用例として参考になりました。

Q: Xcodeアーカイブビルドが完了してもオーガナイザのウィンドウに遷移しないのでipa ファイルが作れない問題の解決 - laiso - iPhoneアプリ開発グループ
http://iphone-dev.g.hatena.ne.jp/laiso/20120124/1327383808

UnityでiOSデバイスのデバイス情報を取得する方法

こんなAPIで取得出来ます。

プロパティ 意味 例(iPhone 4S[iOS 5.1.1]のとき)
iPhoneSettings.generation 世代 iPhone4S
iPhoneSettings.uniqueIdentifier UDID
iPhoneSettings.name 名前 iPhone4S
iPhoneSettings.model モデル iPhone
iPhoneSettings.systemName システム名 iPhone OS
SystemInfo.operatingSystem OSのバージョン iPhone OS 5.1.1

JavaScriptで実機で情報を表示するプログラムはこんな感じ。

#pragma strict

private var info: String;

function Start () {
	info = "";
#if UNITY_IPHONE && !UNITY_EDITOR
	info += "iPhoneSettings.generation : " + iPhoneSettings.generation + "\n";
	info += "iPhoneSettings.uniqueIdentifier : " + iPhoneSettings.uniqueIdentifier + "\n";
	info += "iPhoneSettings.name : " + iPhoneSettings.name + "\n";
	info += "iPhoneSettings.model : " + iPhoneSettings.model + "\n";
	info += "iPhoneSettings.systemName : " + iPhoneSettings.systemName + "\n";
	info += "SystemInfo.operatingSystem : " + SystemInfo.operatingSystem + "\n";
#endif
}

function OnGUI () {
	GUI.TextArea(Rect(10, 10, Screen.width-20, 300), info);
}

システム名が iOS じゃなくて iPhone OS だったのがちょっと意外(昔、iPhone OSにしてそれから変更してないのかな?)。

ProjectビューやHierarchyビューを拡張する


C#のプログラムの場合、こんな記述で拡張可能です。 MyClass という名前で作成し、 Editor フォルダに置いて下さい。

using UnityEditor;
using UnityEngine;

[InitializeOnLoad]
class MyClass
{
    static MyClass ()
    {
		EditorApplication.update += Update;
		EditorApplication.projectWindowItemOnGUI += ProjectWindowListElementOnGUI;
		EditorApplication.hierarchyWindowItemOnGUI += HierarchyWindowListElementOnGUI;
    }
	
	static void ProjectWindowListElementOnGUI (string guid, Rect selectionRect)
	{
		GUI.Label(new Rect(10, Screen.height-100, Screen.width-20, 30), "projectWindowItemOnGUI");
		if (GUI.Button(new Rect(10, Screen.height-75, Screen.width-20, 30), "test")) {
			Debug.Log("hoge");
		}
	}
	
	static void HierarchyWindowListElementOnGUI(int instanceID, Rect selectionRect)
	{
		GUI.Label(new Rect(10, Screen.height-100, Screen.width-20, 30), "HierarchyWindowListElementOnGUI");
		if (GUI.Button(new Rect(10, Screen.height-75, Screen.width-20, 30), "test")) {
			Debug.Log("fuga");
		}
	}
	
    static void Update ()
    {
		if(EditorApplication.isPlaying) {
	       Debug.Log("isPlaying:" + Time.time);
		}
    }
}

関連情報

Unity - Running Editor Script Code on Launch
http://unity3d.com/support/documentation/Manual/RunningEditorCodeOnLaunch.html


/UnitySVN/branches/MultipleBackends/Assets/Editor/GUI/VCSStatusIcons.cs のコードが参考になりました。

Kjems / UVersionControl / overview — Bitbucket
https://bitbucket.org/Kjems/uversioncontrol