WindowsでminicondaとJupyterを導入する方法

前書き

miniconda と Jupyter を入れるときのメモです。


環境

Windows 10


導入方法

Minicondaを入れる

docs.conda.io

好きなバージョンをインストール。
f:id:EorF:20220401025355p:plain

再起動して環境変数にパスを通す。
ユーザー環境変数ならエクスプローラーを再起動するだけで良い。

コンソールを開く

Anaconda Prompt (miniconda3)を開く

パッケージの一覧を見る

conda listで一覧を見られる。

パッケージを入れる

conda install xxxxxを使って好きなパッケージを入れる。
xxxxxはパッケージ名。
個人的にはnumpymatplotlibは必須。


Jupyterを入れる

Jupyterをインストール

Anaconda Prompt (miniconda3)pip install jupyter notebookでインストール。

ipykernelをインストール

そのままでは python にアタッチされないのでconda install notebook ipykernelでインストール。

Jupyterを開く

Anaconda Prompt (miniconda3)からjupyter notebookと打って起動。


おまけ

minicondaを入れたけど直接 python 起動させる場合、pythonと打ち込むと windows store が開くのでpyで開く。


UnityのEntitiesプロジェクトをビルドする方法

前書き

Entities 0.50.0を使用したプロジェクトのビルド方法のメモです。


注意点

今後のアップデートで方法が変わる可能性があります。


環境

Entities 0.50.0-preview.24
Platforms 0.50.0-preview.4


前準備

プロジェクト設定でプレビューなパッケージを有効にするよう設定します。
Edit > Project Settings > Package Manager のEnable Preview Packagesにチェックを入れます
f:id:EorF:20220324013550p:plain


Entities Platforms Pacage をインストール

Entitiesを使用したプロジェクトは専用ビルドツールが必要でPackageManagerからインストールします。
PackageManagerAdd package from git URL...を選択し、com.unity.platformsと入力するとインストールが始まるので少し待ちます。
f:id:EorF:20220324012052p:plain


ビルド方法

ビルドには専用アセットが必要なため作成します。
Assets > Create > Build Configuration > Empty Build Configuration を選択するとアセットが作成されます。
f:id:EorF:20220324014511p:plain

作成したらビルドしたいシーンを追加しビルドします。
ビルドのボタンはインスペクタウィンドウの右上にあります。
f:id:EorF:20220324021434p:plain


Build Configurationの説明

このアセットはBuild SettingsPlayer Settingsの一部のパラメータをオーバーライドして変更します。
BuildConfigurationAddComponentでオーバーライドしたいパラメータを選択します。
f:id:EorF:20220324014929p:plain
f:id:EorF:20220324015005p:plain

Shared Configurationsに別のビルドアセットをアタッチすることで設定を共有することができます。
変更箇所は Prefab のように青線が表示されます。
f:id:EorF:20220324015252p:plain

プロファイラに接続したい場合はClassicBuildProfileConfigurationDebugもしくはDevelopにします。
f:id:EorF:20220324020107p:plain


おまけ

platformsのパラメータ詳細はドキュメントに記載されていないため全てアタッチした状態の画像を載せておきます。
黄色い三角マークはThis component is not used by the build pipeline.と表示されるので設定しても使われないかもしれません。(未検証)
f:id:EorF:20220324030406p:plain


Riderでdllの依存関係を見る

この記事はCalendar for Unity | Advent Calendar 2021 - QiitaUnityゲーム開発者ギルド2 Advent Calendar 2021 - Adventarの23日目です。

前書き

UnityではAssembly Definitionをフォルダに追加すると、そのフォルダ別にdllが分割される機能があります。
クラスの循環参照が抑えられコードが綺麗に保てたり、コンパイル範囲が小さくなり変更時のビルドが早くなったりします。
そのdllを依存関係を図で見る機能をご紹介します。


環境

Rider2021.3 (2020.2 over)


方法

Tools > Architecture > Show Project Diagram で表示されます。
f:id:EorF:20211220010629p:plain


開発中の個人ゲームのdllを表示してみた図
f:id:EorF:20211220011711p:plain
(依存関係がかなり怪しいですね・・・)


最後に

クラスのダイアグラムはまだ実装されてません。そちらを見たい方はVisualStudioで見るのが良さそうです。


爆発風エフェクトを作ってみた

前書き

一昔前のロボットたちが遠目でいっぱい爆発するときのエフェクトを作ってみました。
https://user-images.githubusercontent.com/10098082/128212844-aeedffcb-9b72-4747-83b9-a98b60f55279.png


サンプルはGitHubに上げています。
github.com


環境

Unity 2020.3.14f1
High Definition RP 10.5.1


実装方法

VFX Graphでパーティクルを生成

Projectビューを右クリック -> Create -> Vidual Effects -> Visual Effect Graph でグラフを生成できます。
最終的なVFX Graphの全体像です。(画像がデカいです)
f:id:EorF:20210821092130p:plain

Spawn

ConstantSpawnRateブロックを使用し、生成量を外部から変えられるようにしています。
f:id:EorF:20210821092404p:plain

Initialize Particle

パーティクル数のキャパシティ、座標、生存時間、スケールを設定しています。
スケールはすべて同じ大きさだと味がなかったので0.5~1.0倍の割合でバラつかせるようにしてます。
f:id:EorF:20210821092701p:plain

Update Particle

Set Color over Lifeブロックを使用し、生成から破棄までの色の変化を設定しています。
f:id:EorF:20210821093113p:plain

Set Color over Lifeブロックの中はHDRで、アルファをなくし、白→黄→赤に変化させています。
f:id:EorF:20210821094009p:plain

Output Particle Quad

ShaderGraphVFX Shader Graphを設定することで独自のシェーダーを適用できます。

BlendModeAdditiveに設定していますが、見栄えが良ければ何でも良いです。
Tex0は円形のテクスチャを設定しています。くり抜かれる前の円になります。
ColorGet Attribute: color (Current)ノードを使うことで、VFXGraph内で設定した色をShaderGraphに渡すことができます。
Thresholdは0~1の間でくり抜きを制御しています。1になるほどくり抜きが大きくなり、円→三日月→消滅のようになります。
Center Adjustはくり抜きを行う位置を設定します。X,Y方向をランダムにすることにより、三日月状で消えたりします。*1
Smooth Edgeはくり抜きの速度に使っているSmoothstepのEdge1のパラメータになります。
f:id:EorF:20210821100955p:plain


ShaderGraphで円をくり抜く

Projectビューを右クリック -> Create -> Shader -> VFX Shader Graphでグラフを生成できます。
最終的なVFX Shader Graphの全体像です。
f:id:EorF:20210821215148p:plain

くり抜く円を作る

distance(uv, float2(0.5, 0.5))でテクスチャの幅いっぱいの円が表現ができるので、それをShaderGraphで書きました。
CenterAdjustは円の中心をずらすパラメータです。
f:id:EorF:20210821224755p:plain

Stepノードを使うことで円の大きさを変えることができます。
また、Smoothstepノードを使い、円を大きくするスピードを制御しています。
f:id:EorF:20210821233723p:plain


Stepノードの値は内側が1なのでOne Minusノードを使用し、出力を反転することでAlpha値が0の円にします。
そして、円形のテクスチャをサンプルし、反転した値とかけることでくり抜きを行います。
f:id:EorF:20210822000021p:plain

これで円がくり抜かれる、爆風のようなアニメーションが出来上がりました。
f:id:EorF:20210822014339g:plain


色味を変更する

出来上がったものを見ても少し味気ないように思います。爆発したらもう少し光ってほしいです。
そういうことでPostProcessingを使って加工します。

ブルームを使う

Hierarchyビューを右クリック -> Volume-> Global Volumeを選択するとオブジェクトが生成されます
生成されたオブジェクトにVolumeコンポーネントがあり、Profileという項目にNEWと書かれたボタンがあるので押します。
するとAdd Overrideと書かれたボタンが出現します。
f:id:EorF:20210822012929p:plain

Add Overrideを押し、Post-processing -> Bloomを選択します。
Bloomの項目が出るのでIntensity0.4前後に設定します。
f:id:EorF:20210822013446p:plain

すると、いい感じに光るようになりました。
f:id:EorF:20210822014857g:plain



最後に

VFX GraphVFX Shader Graphを使うことで幅広い表現ができるパーティクルが作られました。


スペシャルサンクス

UGDGのかもそばさんVFX Graphで現在の色を取得するノードを教えていただきました。
ありがとうございます!

*1:x:0.0, y:0.0になることもあるので必ず三日月形になるわけではないです

URPで歪みシェーダーの実装

前書き

URPで背景のバッファの取得とその使用方法をまとめました。

サンプルはGitHubに上げています。
github.com


環境

Unity2020.3.14f1
Universal RP 10.5.1 (ForwardRenderer)
Shader Graph 10.5.1


実装方法

描画されたバッファを取得する

Universal Render Pipeline AssetOpaque Textureにチェックを入れます。
f:id:EorF:20210820205913p:plain

ShaderGraphではSceneColorノードでOpaqueTextureを取得できます。
入力はUV、出力はColorです。
f:id:EorF:20210820233741p:plain

歪ませる

歪みはテクスチャをサンプリングする際のUVをずらすことで表現できます。
サンプルではGradient Noiseノードを使用してUVをずらしています。
f:id:EorF:20210821010619p:plain
出力結果
f:id:EorF:20210821005549p:plain

おまけ:ノイズテクスチャをUVに適用する

ノイズテクスチャをスクロール

タイリングやオフセットは専用のTiling And Offsetノードがあり、OffsetTimeノードのTimeを入れると時間経過でスクロールします。
f:id:EorF:20210821015436g:plain

ノイズをUVに加算する

ノイズテクスチャは白黒で表現されており、値としては0~1になっています。
このまま使っても良いのですが、UVが全体的にずれることになり、実物と見える位置が大きく異なります。
そこで使うのがRemapノードです。
このノードは与えられた数値を指定した数値範囲にマッピングしてくれる優れものです。
今回では0~1-0.01~0.01の範囲にリマッピングしています。
f:id:EorF:20210821020019p:plain

あとは出力された値をScreenPositionと足し合わせることでUVがずれ、歪みとして表現されます。


最後に

URPではGUIでチェックを入れ、ShaderGraphでテクスチャが取得ができるので非常に簡単でした。


参考文献

すでに作ったUnityプロジェクトをGithubに追加するバッチを作ってみた

前書き

Unityでいろいろ試した後にGithubに追加したいけど、フォルダ名がリポジトリ名と被ってしまいリネームして中身を移動させてプッシュするのが手間でした。
なので、ドラッグ&ドロップしたらGithubリポジトリを作って、コミットまでしてくれるバッチファイルを作りました。
フォルダ名がリポジトリ名になります。

バッチファイルのサンプルはGithubにも上げています。



環境


Github CLIをインストールする

対応したOSのものをインストールします。
github.com


Github CLIをセットアップする

コマンドプロンプトgh auth loginと打ち、認証を行います。

どのアカウントでログインするか聞かれます。
Github.comGithub Enterpise Serverの選択肢があります。
今回はGithub.comを選びます。
f:id:EorF:20210725152745p:plain

次にGithubとやりとりをするプロトコルの選択肢が出ます。
今回はHTTPSを選びます。
f:id:EorF:20210725153333p:plain

Githubの認証情報でGitを認証するか聞かれます。
今回はYesを選びます。
f:id:EorF:20210725153535p:plain

どのように認証するか聞かれます。
今回はブラウザでしたいのでLogin with a web browserを選びます。
f:id:EorF:20210725153930p:plain

Enterを押すとブラウザにワンタイムパスを打ち込むページが表示するので、コマンドプロンプトに表示されているワンタイムパスを入力します。
f:id:EorF:20210725154206p:plain
f:id:EorF:20210725154450p:plain

入力したら認証画面が出るので、Authorize githubを押して、認証します。
f:id:EorF:20210725154629p:plain
f:id:EorF:20210725154804p:plain

コマンドプロンプトに戻るとAuthentication complete. Press Enter to continue...と表示されるので、Enterキーを押して終わらせます。
f:id:EorF:20210725154838p:plain
f:id:EorF:20210725155113p:plain

これで認証は終わりです。


バッチを作る

.batファイル作成し、以下のサンプルを張り付けて保存します。
サンプルではRider用に.gitignoreを追記してるので、注意してください。

:: 設定
set GITHUB_ID=eorfeorf
set REPO_TYPE=public
set IGNORE=Unity
set LICENSE=MIT
set DESCRIPTION=""
set ISSUES=false
set WIKI=false

::@echo off
setlocal
popd %~dp0

:: フォルダ名を取得.
:: なぜか末尾が消えるので\をつけ足してる.
set THIS_PATH=%1\
echo %THIS_PATH%
for %%1 in ("%THIS_PATH:~0,-1%") do set REPO_NAME=%%~nx1
echo %REPO_NAME%

:: ローカルを初期化.
pushd "./%REPO_NAME%"
git init -b main
popd

:: Githubのリポジトリを作成.
gh repo create %REPO_NAME% --%REPO_TYPE% -g="%IGNORE%" --license="%LICENSE%" -d=%DESCRIPTION% --enable-issues=%ISSUES% --enable-wiki=%WIKI% -y

:: リモートを追加.
set REPO_URL=https://github.com/%GITHUB_ID%/%REPO_NAME%.git

pushd "./%REPO_NAME%"

:: 生成されたファイルをローカルに.
git remote add origin %REPO_URL%
git pull origin main

:: Rider用に.gitignoreを修正.
echo # Rider>>.gitignore
echo .idea/>>.gitignore

:: 全部をプッシュ.
git add .
git commit -m "First commit"
git push -u origin HEAD:main

基本いじりたい設定を上に持ってきました。
GITHUB_ID

REPO_TYPE

  • リポジトリの公開範囲です。
  • publicとprivateがあります。

IGNORE

  • .gitignoreの種類です。

LICENSE

  • ライセンス設定です。

DESCRIPTION

  • リポジトリのDescriptionです。バッチの都合上、改行が入れられません。

ISSUES

  • issueを有効にするか指定。

WIKI

  • wikiを有効にするか指定。


使い方

リポジトリにしたいフォルダをこのバッチにドラッグ&ドロップします。
Unityの場合はプロジェクトのフォルダになります。


お願い

バッチで現在のフォルダ名を取得する際におまじないみたいなことをしているので、上手く解決できる方はご一報いただけると助かります。


最後に

欲しかった。


URPのShader変数_Timeの実装について

追記

2021/06/30:Time.realtimeSinceStartupの説明を変更しました。
2021/07/01:HDRPの定義を追加
2021/09/10:ShaderGraphのTimeの参考資料と説明を追加

前書き

Built-in Render PipelineUniversal Render PipelineでShaderで使用できる_Timeの実装が違うらしいので調べてみました。


注意点

今回HDRPの_Timeの実装は見ていません。
追記しました。


環境

Unity 2020.3.12f1
Universal RP 10.5.0
High Definition RP 10.5.0


Built-in Render Pipelineの_Time

ドキュメントを見てみると、ステージ(レベル)のロードからの時間と書かれています。
ここで言うステージはたぶんシーンのことを指すと思うので、シーンをロードすると毎回0から始まるようです。
docs.unity3d.com


Universal Render Pipelineの_Time

ここに自動生成される際の実装コードのサンプルがあるでこちらを見たほうが早いです。
docs.unity3d.com

URPで_Timeを設定している箇所はRuntime/ScriptableRender.csSetShaderTimeValues関数で行っており、呼び出し元はExecute関数です。
そこに設定するためのtime変数の定義があります。
github.com
定義は以下の通りです。

#if UNITY_EDITOR
    float time = Application.isPlaying ? Time.time : Time.realtimeSinceStartup;
#else
    float time = Time.time;
#endif
    float deltaTime = Time.deltaTime;
    float smoothDeltaTime = Time.smoothDeltaTime;
    ...
    SetShaderTimeValues(cmd, time, deltaTime, smoothDeltaTime);

コードを見ると、エディタ上ではプレイ中だとTime.time、非プレイ中だとTime.realtimeSinceStartupを入れています。
エディタ上でない場合はTime.timeを入れています。

確かに_Timeの実装が異なっているが確認できます。

おまけ:Time.realtimeSinceStartupって何?

名前の通りですが、アプリケーションを起動してからの時間です。
Time.timeScaleに影響しないのでゲーム中に一時停止に時間を計りたい、アニメーションさせたい場合は良さそうかもしれません。
ただ、プラットフォームやハードウェア依存なので気を付ける必要がありそうです。
docs.unity3d.com


High Definition Render Pipelineの_Time

HDRPはRuntime/RenderPipeline/Camera/HDCamera.csUpdate関数で定義されています。
github.com
定義は以下の通りです。

#if UNITY_EDITOR
    newTime = Application.isPlaying ? Time.time : Time.realtimeSinceStartup;
    deltaTime = Application.isPlaying ? Time.deltaTime : 0.033f;
#else
    newTime = Time.time;
    deltaTime = Time.deltaTime;
#endif
    time = newTime;
    lastTime = newTime - deltaTime;

time変数が_Timeに代入されている値です。
実装自体はURPと変わらないようです。


最後に

実装が異なっていましたが、あまり影響はなさそう雰囲気でした。