Unityと数学と音楽の学習帳

Unityと数学、音楽の同時学習を目的としたブログ(個人的メモ帳:勉強中なので正確性はない)

unityチュートリアル 「2D UFO」のメモ

  • テクスチャ画像をシーンにドラッグすると勝手にスプライトレンダーコンポーネントが付加される
  • ソーティングレイヤーは描画順
  • コライダーコンポーネントはひとつのゲームオブジェクトに複数作り組み合わせることができる
  • プレハブは青く表示される。ヒエラルキーからプロジェクトにドラッグすると自動的に作れる
  • ctrl+cとctrl+vでもコピーできるが、ctrl+dでも出来る
  • コライダーの設定で「Is Trigger」をオンにすると物理的な跳ね返りがなくなる(通り抜けてトリガーが発行される)
  • RigedBody2DのBodyTypeを「Kinematic」にするとunity内の物理作用はゼロになり、トランスフォームのみで動くようになる

 これにより処理が軽くなる

  • 以前のバージョンと違ってunityのUIは名前空間 unityengine.UIで拡張されている

 仕様がまるで変っている。textひとつとっても扱い方が変わっているので再学習の必要アリ


UI関連

  • 今までと違いCanvas内のオブジェクトに対してはショートカットtで色々なトランスフォームとは別の操作が可能となる

(posやwidth、heightなど)

  • RectTransformを持つオブジェクトの場合ヒエラルキーウインドウ内で選択した状態で右クリック->CreateEmptyすると

 空のUIの子が簡単に作れる

  • レンダーテクスチャはCreate -> RenderTexture で作成できる。これをカメラに設定すると良い
                                                                                                                                                                                        • -


<カメラ操作tips>
カメラオブジェクトを選択した状態で ctrl+Shift+f で カメラをビューの視点に出来る
ビューはビュー内のどこかをクリックして選択状態にするとカーソルキーが使えるようになる

ゲーム性を向上させる確率の考え方

指数と確率の考え方

>20%の5連撃を1発でも当てれば…なんて時にサクーッと概算できるようになっても
>2の10乗が1000って覚えとくと便利よね

{ 2 }^{ 10 }\quad =\quad 1,024\quad \simeq \quad { 10 }^{ 3 }\\ { 2 }^{ 20 }\quad =\quad 1,048,576\quad \simeq \quad { 10 }^{ 6 }\\ { 2 }^{ 30 }\quad =\quad 1,073,741,824\quad \simeq \quad { 10 }^{ 9 }


>全部外れる確率は
>0.8の5乗 → 2の15乗の上一桁の数字だけほしい → 3
>だから7割くらいは1発当たるはず

0.8^{ 5 }\quad =\quad (0.1\times 8)^{ 5 }\quad =\quad 0.1^{ 5 }\times (2^{ 3 })^{ 5 }\quad =\quad 0.1^{ 5 }\times 2^{ 15 }\quad =\quad 0.32768

この7割ってのは必ず5回連続攻撃して、その内7割の確率でヒットするという考え方
つまり20%、40%、80%、と言う確率は計算しやすい。又、5回攻撃前提でワンパック(大数の法則)になっている点も強く意識しておく事が大事
ワンボタンで一度に5回攻撃が出るRPGの戦闘みたいな場面を想像すると良い

f:id:cqbosinko:20170414134223p:plain

<メモ>
桁と小数点位置の感覚がつかめていないと痛い目にあうので注意

指数関数はネイピア数を利用した指数関数と同相になる。対数関数とは逆関数の関係となる
(このグラフで考えると横軸に対する拡大縮小率で何回試行すれば充分かという考え方ができる筈。つまりネイピア数に対する係数がある筈)

第一回年末ジャンボと第二回年末ジャンボは写像が変わるので同相でなく不連続となる?
この場合、第一回と第二回を一緒にした写像を作れば連続となるが解は変わるか?

一桁のパーセンテージというのは、ほぼ大数の法則に支配されると考える。場の親であるなら
結果を安定させるために試行の単価(ランニングコスト)を安くして試行回数を増やす必要があると予想できる

「同相」という考え方は重要で強力
https://kotobank.jp/word/%E5%90%8C%E7%9B%B8-1189069
http://rikei-index.blue.coocan.jp/syugou/dousousya.html

ゲームで使う数式の原理

座標変換

X軸に関して以下の式を利用する。xが矩形の横幅、x'が座標。Y軸やZ軸に関しても同様の式を利用すると良い
\frac { x'-\frac { x }{ 2 }  }{ \frac { x }{ 2 }  } \quad =\quad \left( x'-\frac { x }{ 2 }  \right) \times \frac { 1 }{ \frac { x }{ 2 }  } \quad =\quad \left( x'-\frac { x }{ 2 }  \right) \times 1\div \frac { x }{ 2 } \quad =\quad \left( x'-\frac { x }{ 2 }  \right) \times \frac { 2 }{ x } \quad =\quad \frac { 2x' }{ x } -\frac { 2x }{ 2x } \quad =\quad \frac { 2x' }{ x } -1



P\left( r,\theta ,\phi  \right) \quad \Leftrightarrow \quad \left( r\sin { \theta \cos { \phi  }  } ,\quad r\cos { \theta \quad ,\quad r\sin { \theta \sin { \phi  }  }  }  \right)

「ゲームアプリの数学」P42の球面座標系とデカルト座標の変換式の考え方
f:id:cqbosinko:20170411155030p:plain

<unityで利用する場合>

球面座標からデカルト座標にする。半径r、方位角\theta、仰角\phiとして
P\left( r,\theta ,\phi  \right) \quad \longmapsto \quad \left( r\cos { \phi  } \sin { \theta  } \quad ,\quad r\sin { \phi  } \quad ,\quad r\cos { \phi  } \cos { \theta  }  \right)

デカルト座標から球面座標にする
r=\sqrt { { x }^{ 2 }+{ y }^{ 2 }+{ z }^{ 2 } } \\ \theta =\arctan { \frac { x }{ z }  } \\ \phi =\arcsin { \frac { y }{ r }  }

f:id:cqbosinko:20170414010533p:plain

簡単な使用例:
P\left( 1,-60,30 \right) \quad \longmapsto \quad \left( 1\times \cos { (30) } \times \sin { (-60) } \quad ,\quad 1\times \sin { (30) } \quad ,\quad 1\times \cos { (30) } \times \cos { (-60) }  \right) \quad =\quad \left( -0.75\quad ,\quad 0.5\quad ,\quad 0.433... \right)

UnityのShader作成用抽斗

Cg/HLSL でシェーダープロパティーを参照する
https://docs.unity3d.com/ja/current/Manual/SL-PropertiesInPrograms.html

成分ごとの演算 (DirectX HLSL)
https://msdn.microsoft.com/ja-jp/library/bb509634(v=vs.85).aspx

tex2D等の組み込み関数 (DirectX HLSL)
https://msdn.microsoft.com/ja-jp/library/bb509611(v=vs.85).aspx

メモ:「ベクトル×行列」等の積の演算は「*」は無理でmul()関数を利用する

UnityObjectToClipPos等のビルトインシェーダーヘルパー機能
https://docs.unity3d.com/ja/current/Manual/SL-BuiltinFunctions.html

_Time等のビルトインのシェーダー変数
https://docs.unity3d.com/ja/current/Manual/SL-UnityShaderVariables.html


Shader Unity Support
VisualStudio2015にインストールすると.shaderファイルに対してコード補完やハイライト表示が利用できるようになる
(VisualStudio2017には現在未対応)

機能:

  • 「.shader」内の「.cginc」ファイルのコード補完(UnityCG.cginc内の宣言や関数のコード補完に対応している)
  • C/C++スタイルのキーワードハイライト表示
  • 「.cginc」 「.shader」「.compute」ファイルをサポート
  • 括弧のマッチング

https://marketplace.visualstudio.com/items?itemName=MarcinODev.ShaderUnitySupport



グラフィックスコマンドバッファ
https://docs.unity3d.com/ja/current/Manual/GraphicsCommandBuffers.html

コンピュートシェーダー
https://docs.unity3d.com/ja/current/Manual/ComputeShaders.html

GPU インスタンシング
https://docs.unity3d.com/ja/current/Manual/GPUInstancing.html

カスタムシェーダー GUI
https://docs.unity3d.com/ja/current/Manual/SL-CustomShaderGUI.html

[Unity] シェーダを書く準備
http://qiita.com/edo_m18/items/b13f6a51f16ec5d72419

用語
https://msdn.microsoft.com/ja-jp/library/ff604996(v=xnagamestudio.40).aspx


単語・用語
Tranforms position 変換座標
homogenous space 均質空間(相同空間)
homology 相同性 共通の祖先を持つ共通の構造。相似の対義語(相似と相同は明確に違う)


リファレンス

Unity - マニュアル: 内蔵のシェーダー include ファイル
Unity - マニュアル: シェーダーのデータタイプと精度

資料

レンダリングパス
https://docs.unity3d.com/ja/current/Manual/RenderingPaths.html
https://docs.unity3d.com/ja/current/Manual/SL-RenderPipeline.html

フレームデバッガ
https://docs.unity3d.com/ja/current/Manual/FrameDebugger.html

サーフェイスシェーダー
ライティングに作用するシェーダーを書く場合
unity独自のあらかじめ用意された組み込みサーフェイスシェーダーのパーツを利用、流用して楽に自作シェーダーを作成出来る
(unityのライティングを利用したシェーダーを1から自分で組むのは大変らしい)
https://docs.unity3d.com/ja/current/Manual/SL-SurfaceShaders.html

リットシェーダー → 自分で作ったシェーダーの事を指すらしい?


頂点シェーダーとフラグメントシェーダーのプログラミング
フラグメントシェーダーは#pragmaステートメントでどのシェーダー関数を使ってコンパイルするかを示す
それぞれのスニペットには最低でも頂点プログラムとフラグメントプログラムが含まれていなければいけない
https://docs.unity3d.com/ja/current/Manual/SL-ShaderPrograms.html


セマンティクス
セマンティクス (DirectX HLSL).
セマンティクスは、シェーダー入力またはシェーダー出力に付加されている文字列で、パラメーターの使用目的に関する情報を伝達します。セマンティクスは、シェーダー ステージ間で渡されるすべての変数に指定する必要が あります
https://msdn.microsoft.com/ja-jp/library/bb509647(v=vs.85).aspx


<要点>
VisualStudioでHLSLファイルに対してインテリセンスやオートコンプリートを利かせるにはdirectXをインストールする必要がある
UnityやVisualSutdioのインストール方法によってインストールし忘れする事があるので注意


入力セマンティックと出力セマンティックがある。出力は"out"として宣言する
必要なセマンティックが足りない場合、シェーダーは異常終了する

セマンティックは、データがどこで生成されたかを識別します。セマンティックは、シェーダーの入力と出力を識別するオプションの識別子です。
セマンティクスは、次のいずれかの位置に記述します。

  • 構造体メンバーの後。
  • 関数の入力引数リスト内の引数の後。
  • 関数の入力引数リストの後。

組み込み関数 (DirectX HLSL)
https://msdn.microsoft.com/ja-jp/library/bb509611(v=vs.85).aspx



成分ごとの演算 (DirectX HLSL)
https://msdn.microsoft.com/ja-jp/library/bb509634(v=vs.85).aspx


フロー制御 (DirectX HLSL)
https://msdn.microsoft.com/ja-jp/library/bb509600(v=vs.85).aspx


POSITION は頂点位置、一般的には float3 か float4 です。
NORMAL は通常の頂点で、一般的には float3 です。
TEXCOORD0 は、第 1 の UV 座標で、一般的に、float2, float3, float4 です。
TEXCOORD1, TEXCOORD2, TEXCOORD3 は、それぞれ第 2、第 3、第 4 の UV 座標です。
TANGENT は、(ノーマルマッピングで使用される)接線ベクトルで、一般的には、 float4 です。
COLOR は、頂点ごとの色で、一般的には、 float4 です。

行列の積

ベクトルは行列で表記すると縦になる。ベクトルや行列は一般的に太字で表される

{\vec { { A } }=\textbf{A} =\begin{pmatrix} 1 \\ 2 \\ 3 \\ 4 \end{pmatrix}}

4次元のベクトルAは4行1列の行列Aと言える
この行列に対し転置行列を行うと下記のような1行4列となる

{\textbf{A}^{ T }=\left( 1,2,3,4 \right)}

変数名の右肩にあるTはTransposeのTを表している


ベクトルを行列として扱い計算した例

{\textbf{A}^{ T }=\left( 1,2,3,4 \right)}

{\textbf{B} =\begin{pmatrix} 2 \\ 3 \\ 4 \\ 5 \end{pmatrix}}

{\textbf{A}^{ T }\textbf{B}=\left( 1,2,3,4 \right) \begin{pmatrix} 2 \\ 3 \\ 4 \\ 5 \end{pmatrix}=1\times 2+2\times 3+3\times 4+4\times 5=40=\textbf{B}^{ T }\textbf{A}}

{\textbf{BA}^{ T }=\begin{pmatrix} 2 \\ 3 \\ 4 \\ 5 \end{pmatrix}\left( 1,2,3,4 \right) =\begin{pmatrix} 2\times 1 & 2\times 2 & 2\times 3 & 2\times 4 \\ 3\times 1 & 3\times 2 & 3\times 3 & 3\times 4 \\ 4\times 1 & 4\times 2 & 4\times 3 & 4\times 4 \\ 5\times 1 & 5\times 2 & 5\times 3 & 5\times 4 \end{pmatrix}=\begin{pmatrix} 2 & 4 & 6 & 8 \\ 3 & 6 & 9 & 12 \\ 4 & 8 & 12 & 16 \\ 5 & 10 & 15 & 20 \end{pmatrix}}

<行列の積の計算例>

─□ = ─

□| = |

|─ = □

─| = ・

─□| = ・

─□□| = ・

─□□□| = ・

□|─□|─ = (□|)(─□|)─ = |・─ = ・|─ = □

行列の積は計算順を変えると結果が変わる点に注意。カッコでくくる場合でも計算順は変更できない。但し ・ は「数」であり行列の積計算に対して順番的に自由な位置に再配置できる点に留意

|□ = NG

||= NG

─ ─ = NG

行列の積を考える場合、左から順番に二項演算で計算していく。その際、各次数が重要になってくる。まず左項の列数と右項の行数の次数が合致しない場合、計算そのものが成立しない。以下、LaTexで書くのが大変なのでPocketCasによる出力で例を並べてみる

f:id:cqbosinko:20170312110022p:plain