けいごのなんとか

Unityユーザーとしてのブログ。ギリギリ路線走ってます。

特定のステートのみ実行されるコルーチン

こんな感じになるのかなー

IsDirty

EditorUtility.SetDirtyによってDirtyフラグが立ったかどうかのチェック

internalだけどEditorUtilityクラス内にあった。

static bool IsDirty (int instanceID)
{
    var isDirty = typeof(EditorUtility).GetMethod ("IsDirty", BindingFlags.Static | BindingFlags.Instance | BindingFlags.NonPublic);
    return System.Convert.ToBoolean (isDirty.Invoke (null, new object[]{instanceID}));
}

スクリプトからスプラッシュ画像を設定

SerializedObject経由で設定することが可能です。

プロパティ名

iPhoneSplashScreen
iPhoneHighResSplashScreen
iPhoneTallHighResSplashScreen
iPhone47inSplashScreen
iPhone55inPortraitSplashScreen
iPhone55inLandscapeSplashScreen
iPadPortraitSplashScreen
iPadHighResPortraitSplashScreen
iPadLandscapeSplashScreen
iPadHighResLandscapeSplashScreen
XboxSplashScreen
blackberryLandscapeSplashScreen
blackberryPortraitSplashScreen
blackberrySquareSplashScreen

iPhoneSplashScreen は MobileSplashScreen を指します。

以下のように実装します。

using UnityEngine;
using UnityEditor;

[InitializeOnLoad]
public class NewBehaviourScript
{
    static NewBehaviourScript ()
    {
        foreach (var player in Resources.FindObjectsOfTypeAll<PlayerSettings> ()) {
            var so = new SerializedObject (player);
            so.Update ();
            so.FindProperty ("iPhoneSplashScreen").objectReferenceValue = AssetDatabase.LoadAssetAtPath ("Assets/unitychan.jpg", typeof(Texture));
            so.ApplyModifiedProperties ();

            EditorUtility.SetDirty (player);

        }
        AssetDatabase.SaveAssets ();
    }
}

property-drawer-collectionをモジュール化

こういうのがモジュール化に向いていると思う。

使い方

kyusyukeigoフォルダを下記の場所に置く

Macだと Unity.app/Contents/UnityExtensions

Windowsだと Unity/Data/UnityExtensions <- うろ覚え

anchan828/property-drawer-collection at module · GitHub

monodevelop-code-template-unity Unity4.6対応

もうすぐでUnity4.6対応っぽいのでUnity4.6でMessageに相当する24個を追加しました。

  • UnityEngine.EventSystems

    • OnBeforeTransformParentChanged
    • OnCanvasGroupChanged
    • OnDidApplyAnimationProperties
    • OnRectTransformDimensionsChange
    • OnTransformParentChanged
    • OnFillVBO
    • OnRebuildRequested
    • UpdateGeometry
    • UpdateMaterial
  • UnityEngine.UI

    • OnPointerClick
    • OnPointerDown
    • OnPointerEnter
    • OnPointerExit
    • OnPointerUp
    • OnSubmit
    • OnUpdateSelected
    • OnBeforeSerialize
    • OnDeselect
    • OnDrag
    • OnSiblingGraphicEnabledDisabled
    • OnBeginDrag
    • OnEndDrag
    • OnScroll
    • OnMove

anchan828/monodevelop-code-template-unity · GitHub

Module Managerを使って自作ライブラリを読み込んでみた

[注意1] これはドキュメントに無く、推奨されていない使い方です。 [注意2] DLLを扱う方法しか調べてません。

Module Managerって?

Add-On系のパッケージ(AndroidiOSWebGL...)を今後モジュールとして管理しましょうということで実装された機能

だけどまだ稼働していない。

これ自前で作ったライブラリをModule Managerで管理できないのかな?

自分で作成しているライブラリがModule Managerで管理できれば「プロジェクト単位」でインポートさせていたものが「Unityアプリ(.app .exe)」単位になります。(正しい使い方をしたときはUnityバージョン単位と言った方がいいんですけどね)

Unity4.6ではModule Managerで「UnityEngine.UI.dll」と「UnityEditor.UI.dll」がインポートされています。しかしUnityEditor上のProjectビューではdllファイルは表示されていません。

f:id:anchan828:20141015215706p:plain

ですがソリューションではdllが参照されています。

f:id:anchan828:20141015215836p:plain

自作ライブラリをModule Manager経由でインポートするまでの備忘録

どうやらUnity4.6ではModuleManagerが有効になっている様子(uGUIのためだと思います)

いろいろ試行錯誤してインポートできるようになりました。まだまだ情報不足ですが最低限のことは出来たので満足です。

Macでしか試していないですが多分Windowsでも出来ると思います。

UnityExtensionsフォルダを見る

Macだと Unity.app/Contents/UnityExtensions

Windowsだと Unity/Data/UnityExtensions <- うろ覚え

f:id:anchan828:20141015220525p:plain

GUISystemフォルダがありました

バージョンが4.6.0で、使用するUnityEngine.UI.dllがあって、Standaloneのビルド時?にはStandaloneフォルダの中のUnityEngine.UI.dllを使用している、というのが何となく分かります(ここは予想です。実際に動作確認はしていません。)

ちなみにEditorフォルダの中はUnityEditor.UI.dllがありました。EditorフォルダはUnityプロジェクトの「Assets/Editor」に相当するのだと思います。

f:id:anchan828:20141015220830p:plain

どうやらModule Managerで管理するための設定ファイルはivy.xmlのようです。中身を見てみます。

<?xml version="1.0" encoding="utf-8"?>
<ivy-module version="2.0" e:basepath="/Applications/buildAgent/work/d63dfc6385190b60/Extensions/guisystem" xmlns:e="http://ant.apache.org/ivy/extra">
  <info version="4.6.0" organisation="Unity" module="GUISystem" e:packageType="UnityExtension" e:unityVersion="4.6.0b20" />
  <publications>
    <artifact name="UnityEngine.UI" type="dll" ext="dll" e:guid="f5f67c52d1564df4a8936ccd202a3bd8" />
    <artifact name="Editor/UnityEditor.UI" type="dll" ext="dll" e:guid="80a3616ca19596e4da0f10f14d241e9f" />
  </publications>
</ivy-module>
調べた結果
e:basepath よくわからない。でも私のPCで存在しないパスなので無視します。
version モジュールのバージョン
organisation UnityExtensionsフォルダ配下に作成するフォルダと同じ名前にする
module モジュール名
e:packageType 他にもあるのかな?今のところUnityExtensionのみ
e:unityVersion モジュールが使用できるUnityバージョン。4.6.0b20のように特定のバージョンを指定できるが4.6というように4.6.x系で指定することも可能
name 拡張子なしのファイル名。「Editor/UnityEditor.UI」を見る限りパスの役割もある
type artifactの種類?dllだからdllを指定している?
ext 拡張子
e:guid guid。おそらく適当でユニークになればいい

Hello World的なのを作ってみよう

さて、uGUIのモジュールを大いに参考にして自前のモジュールを作成してみたいと思います。 おそらく、ネット対応(サーバーからモジュールをダウンロードする)のは無理っぽいのでローカルのみです。

HelloWorld.dllファイルを作成

dllの作成は手っ取り早く「Assembly-CSharp-Editor.dll」をリネームしたのを使います。 Assembly-CSharp-Editor.dllは「Library/ScriptAssemblies」フォルダにあります。

dllを作るためにまずこのようなScriptを作成します。実際にはnamespaceを付けたほうが他のライブラリと競合しないのでおすすめです。

using UnityEngine;
using UnityEditor;

public class NewBehaviourScript
{
    [MenuItem("Hello World/Menu")]
    static void Menu ()
    {
        Debug.Log ("Menu");
    }
}

フォルダ構成はこんな感じです。

f:id:anchan828:20141015223126p:plain

そうして作成された「Assembly-CSharp-Editor.dll」を「HelloWorld.dll」にリネームします。

ここまで出来たものはこちらからダウンロードできます。 - HelloWorld.dll

ivy.xmlファイルを作成

まずはテキストエディタを開いて以下のように編集します。

<?xml version="1.0" encoding="utf-8"?>
<ivy-module version="2.0">
  <info version="4.6.0" organisation="kyusyukeigo" module="MyFirstModule" e:packageType="UnityExtension" e:unityVersion="4.6" xmlns:e="http://ant.apache.org/ivy/extra" />
  <publications xmlns:e="http://ant.apache.org/ivy/extra">
    <artifact name="Editor/HelloWorld" type="dll" ext="dll" e:guid="80a3616ca19596e4da0f10f14d241e9a" />
  </publications>
</ivy-module>

一旦保存するか、保存せずにそのままにしておいて上記の情報どおりにフォルダを構成します。 kyusyukeigoは私のニックネームなので自由に変更して構いません。

f:id:anchan828:20141015224157p:plain

ivy.xmlを上の画像の所に配置しましょう。

これでモジュールが完成しました。

モジュールマネージャーに「MyFirstModule」が表示されていて、MenuItemが表示されていて、Projectビューにはなにもないのが確認できますか?

f:id:anchan828:20141015224444p:plain

ここまで出来たものはこちらからダウンロードできます。 - kyusyukeigo.zip

JsonFxをModule Managerで扱えるようにしてみた

ここのJsonFxを使わせていただきました。

こちらをダウンロードしてください。 - TowerOfBricks.zip

ダウンロードしたTowerOfBricks.zipを解凍してUnityExtensionsフォルダ配下に置けば使用できるようになります。

f:id:anchan828:20141015230406p:plain

Unity5からは"Assets/Plugins"フォルダは不要

今までは「PluginsフォルダがAssetsフォルダ直下にないといけない」仕様でした。これにより作成するプラグインのアセットが1つのフォルダ内に収まりきらずに少し残念な気持ちになったものです。

"Assets/Plugins/iOS/SocialConnector.mm" と "Assets/SocialConnector/SocialConnector.cs"のようにAssetsフォルダ配下に2つのフォルダが出来てしまっています。

プラグイン対象のアセット(.mmとか.jarとかもろもろ)」にPluginInspectorが表示され、使用するプラットフォームを選択することが出来ます。SocialConnector.mmiOS専用なのでiPhoneにチェックがついていますね。

f:id:anchan828:20141004003050p:plain

さて、驚いたことにiOSではFrameworkもPluginInspector上で追加することが出来ます。「このプラグインにはFrameworkが必要」という時に必要なFrameworkを一覧から探しだしてチェックを付けましょう。

今までは手動でXcodeプロジェクトにFrameworkを追加しなければいけなかったり、XCodeEditor-for-Unityを使わなければいけませんでした。Unity5からはその手間が必要なくなる、すばらしいです。

f:id:anchan828:20141004003113p:plain

ということで1つのフォルダ内にすべてが収まりました。Pluginsフォルダがありますけど名残というかわかりやすいようにしているだけです。Pluginsフォルダは必要ありません。

f:id:anchan828:20141004003814p:plain

  • Unity5は現在β段階です。仕様が変わる可能性があります。