Unity Editor実行時にbatを走らせてみる

Unity Editor実行時にUnity外で何か処理を走らせたい!ということがありますよね?🤗(ほんまか?
そこで今回はProject外で何かしらのファイルを操作したいときについての話を書いていこうと思います!(備忘録もかねて

基本的には流れとしては、EditorScriptからbatを起動させるだけです。
が、Unity起動後にUnity以外からProject内のファイルを操作すると何かと面倒です。

そこで、Editor起動直後、Unityが動き出す前に何かする方法はないのかと探し回るわけですが、なんと!!
ありがたいことにUnityさんがInitializeOnLoadという属性を用意して下さってます🙏

https://docs.unity3d.com/ja/2019.4/Manual/RunningEditorCodeOnLaunch.html

というわけで

using System;
using System.IO;
using System.Diagnostics;
using UnityEditor;
using UnityEngine;

namespace Hogehoge
{
    [InitializeOnLoad]
    public class Startup
    {
        private static readonly string batPath = Application.dataPath + "/hoge.bat";
        private static Process p;
        
        static Startup()
        {
            if (canDo)
            {
                ExecuteBat();
                AssetDatabase.Refresh();
            }
        }
        
        private static void ExecuteBat()
        {
            p = new Process();
            p.StartInfo.FileName = batPath;
            p.StartInfo.Verb = "RunAs";
            p.StartInfo.UseShellExecute = true;
            p.Start();
            p.WaitForExit();  //これを忘れると処理終了を待たずに何回も実行されることになるので注意
        }
    }
}

これだけでbatをEditor起動直後に実行させられます。バンザイ
注意点は、WaitForExit()を入れることぐらいですかね。これ忘れると悲惨です。

以上です!


UnityのAnimatorを利用する際に気を付けるべきこと

クラスター Advent Calendar 2020 にVRライブなどの非インタラクティブ分野でUnityのAnimatorを利用する際に気を付けるべきことについての記事を書きました。

非ゲーム分野でUnity Animatorの想定外の挙動を避けるために

想定外の挙動を避けるために
1. Rootを配置しよう
2. Apply Root MotionはONにしよう
3. Remove Start OffsetはOFFにしよう
ぐらいのことが書かれています。


Shader Forgeでcluster用のShaderを作る

Shader Forgeでclusterに対応したすべての端末で使用できるShaderをつくりたいという場合は
基本的には以下、二点にチェックを入れるだけで大丈夫です。

「Compile to all platforms」でMetal対応に
「Force Shader Model 2.0」で古いAndroid端末にも対応できます

ただし、上記二点にチェックを入れたとしても軽量化がされるわけではありませんので、重いShaderは重いままです。モバイルで使うShaderは処理を軽くしておきましょう。


自作のUnityPackageを作ってみる

重要なことはここに書かれているので補足をつらつらと書いていきます
https://docs.unity3d.com/Manual/CustomPackages.html

C#スクリプト(.cs)はAssembly Definition Filesがないと読み込まれない

.asmdefがないとcan not be loadedとなります。作り忘れないようにしましょう。
MyCompany.MyFeature.Runtime.asmdefとかと書くのがよさそうです

(Assembly Definition Filesについては↓
http://tsubakit1.hateblo.jp/entry/2018/01/18/212834

ssh接続にすればプライベートリポジトリでもPackageにできる

ssh接続にすればgithubのプライベートリポジトリでもPackageにできるようです。

注意点としては、パスの通ってるGitクライアントからgithubへssh接続できるようにしておかなければいけないということです。SourceTreeなどのGUIクライアントを利用していて、なおかつパスを通してるGitが別にある方は注意


GrabPass {}が便利

clusterやVRChatといったサービスではC#のスクリプトが利用できませんが、Standard Assetsに入っているような

ちょっとリッチなWaterを手軽に利用したいんじゃ~ということがあると思います。(Asset Storeからよさげなヤツ探すのすらめんどくさいときとかありますよね?)

そんなときにGrabPassを使うとShaderだけでSSR(Screen Space Reflection)的なことや屈折表現が簡単にできるよというお話です。

Subshader {
	GrabPass {}
	Tags {"Queue"="Transparent" "RenderType"="Transparent"}
	Pass {
CGPROGRAM

~

#include "UnityCG.cginc"

sampler2D _GrabTexture

実際にStandard AssetsのWaterを魔改造すると↓のようになります

Unityに感謝


UnityHDRP+MMDBridgeで動画を作ってみた

https://youtu.be/xRwXb1ULnlk

タイトルの通りなんですが、何点か引っかかった点があるためご紹介します。

今回の構成

Unity 2018.4.22f1
・Alembic 1.0.6
・High-Definition RP 4.10.0
・Shader Graph 4.10.0
・Unity Recorder 2.2.0


WaterShaderの挙動がおかしい!

今回は、ShaderGraphで作成したオリジナルのWaterShaderを利用していたのですが、WaveOffsetをTimeNodeのTimeを利用して行っていました。

ところが!
なんとこのTimeはDeltaTimeでは無いようで(DeltaTimeもTimeNodeにあるのですがこちらも機能せず…

UnityRecorderで撮影を行うと、水が高速で波打つなんてことになってしまいました。
今回はC#⃣ScriptからNodeへ直接DeltaTimeを渡してあげることで解決しました。こちらが参考になると思います。
https://forum.unity.com/threads/recorder-writting-exr-files-with-time-based-shader-are-wrong.662551/

基本的には↑のまま、少しだけ処理速度改善

using UnityEngine;

public class FunctionRenderTime : MonoBehaviour
{
[SerializeField] Material waterOffset;
[SerializeField] float timingValue;
[SerializeField] float timer;
static string vectorNodePropertyName = "Vector1_8A6A3EC4";

private static readonly int vectorNodePropertyID = Shader.PropertyToID(vectorNodePropertyName);

// Start is called before the first frame update
void Start()
{
waterOffset.SetFloat(vectorNodePropertyID, timer);
}

// Update is called once per frame
void Update()
{
timer += timingValue * Time.deltaTime;
waterOffset.SetFloat(vectorNodePropertyID, timer);
}
}

なんか出力結果おかしくない?

なんか黒い部分がありますね

こりゃなんだ、というわけで…
実際は黒いわけではなくRGBにはノイズ、Aチャンネルは黒よりのグレーになっています。

結局こちらの問題の原因はいまいちわかりませんでした。
HDRPのBugでしょうか?最新のバージョンでは直っていることを願うばかり

とりあえず今回はゴリゴリpngそのものを修正していきました…


おまけ HDRPだと簡単にきれいに作れて良いですね~


Unity Asset Storeにアセットを出品してみた

Unity Asset Storeにアセットを出品してみたのでその記録です

まず、パブリッシャー登録をどっからすればいいんだい?となります
結論から言えば以下
https://publisher.assetstore.unity3d.com/
のCreate a new Unity Asset Store Publisher.という文字リンクから(アイコンもないとは…

あまりにも分かりにく過ぎて… Asset Storeから行けるのかと思っていたよ(リンク自体は Asset Storeページのどこかに書いてあったはず

で、ゴリゴリ必要事項を記入していきます。
Tax関係の書類もなんかいろいろ書かされます。

アセットそのものはUnityから https://assetstore.unity.com/packages/unity/asset-store-tools-115
を利用してアップロードします。

その後、説明やらサムネイル(最低5枚)やらを用意して審査に移りますが

審査結果が届くまでにそこそこ時間がかかります
それもタイミングによって早かったり遅かったり
三週間ぐらい待たされることもあります!あきらめずに待ち続けよう!!

で、機械的な定型文で「Modelのアセットなら説明文に頂点数とメッシュ数書いて、テクスチャの枚数と解像度もかけな?」などという文章が送られてきます。

それらを無事クリアすると
晴れて公開!!

https://assetstore.unity.com/packages/3d/props/interior/modular-catwalks-asset-pack-162943

なんだかんだ一か月半ぐらいかかった…