XcodeでのIL2CPPインクリメンタルコンパイル

今回の主な話題：XcodeでのIL2CPPインクリメンタルコンパイル、OnPopulateMeshでUIの頂点データを変更します、AnimationにTextMesh.color変数を追加できません。

---
###コンパイル
Q1: 最近、加速パッケージングの問題を勉強しています。毎回IL2CPPがコードを生成した後、Xcodeが完全コンパイル（Clean + Archiveではなく直接Build）であります。[「こちら」](https://forum.unity.com/threads/incremental-builds-for-il2cpp.365470)を参照して比較しました。C#コードが変更されない場合、生成されたCPP コードの内容は確かに変更されません。ただし、再生成するとファイルの変更時間や他の属性が変更されるようです。Xcodeは依然をして全てをコンパイルします。この分野での経験はありますか？
>「出力されたXcodeがsvnを使用してXcodeパッケージプロジェクトに同期されます」—Freshair。
dnspyで調べました、il2cpp.exeで直接に変更するのは費用がかかり、維持しにくいです。BeyondCompareで比較しました、Preprocessor.hとNative二つのフォルダだけの変更時間が変更されていることがわかりました。

---
###UI
Q2: OnPopulateMeshでUIの頂点データを変更し、Tangentを介してUGUIのShaderにデータを渡します。
C#コードは次とおります。

```ruby:C#
public class MyRawImage : RawImage 
{
    protected override void OnPopulateMesh(VertexHelper vh)
    {
        base.OnPopulateMesh(vh);

        UIVertex vert = new UIVertex();
        int vertCount = vh.currentVertCount;
        for(int i = 0; i <vertCount; ++i)
        {
            vh.PopulateUIVertex(ref vert, i);
            vert.tangent = new Vector4(1,0,0,1); // tangentを介してデータを渡す -----------------
            vert.color = new Color(1,0,0,1); // colorを介してデータを渡す -----------------
            vh.SetUIVertex(vert, i);
        }
    }
}
```

Shaderコード：

```ruby:Shader
struct appdata_t
{
    float4 vertex   : POSITION;
    float4 color    : COLOR; // color データ -----------------
    float2 texcoord : TEXCOORD0;
    float4 tangent : TANGENT; // tangent データ -----------------
    UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct v2f
{
    float4 vertex   : SV_POSITION;
    fixed4 color    : COLOR; // color データ -----------------
    float2 texcoord  : TEXCOORD0;
    float4 worldPosition : TEXCOORD1;
    float4 tangent : TEXCOORD2; // tangent データ -----------------
    UNITY_VERTEX_OUTPUT_STEREO
};

v2f vert(appdata_t v)
{
    v2f OUT;
    UNITY_SETUP_INSTANCE_ID(v);
    UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(OUT);
    OUT.worldPosition = v.vertex;
    OUT.vertex = UnityObjectToClipPos(OUT.worldPosition);

    OUT.texcoord = v.texcoord;
    OUT.tangent = v.tangent; // tangent データ -----------------

    OUT.color = v.color; // color データ -----------------
    return OUT;
}

fixed4 frag(v2f IN) : SV_Target
{
    return IN.color; // color データ -----------------
    return IN.tangent; // tangent データ -----------------
}
```

Colorデータは正しく取得できますが、Tangentは常に0です。UGUIがTangentデータをShaderに渡さなかったようです。 原因は何ですか、またはコードに何か問題ありませんか？
>下図をみろう。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/40ed5df3-a385-7452-6aa0-d903cfae6972.png)

---
###クラッシュ
Q3: VideoPlayerを使用すると、Android端末でStopをコールするとアプリがクラッシュします。Unityバージョンは5.6.1です。みなさんはこのような状態に遭いましたか？どうすればいいでしょうか？
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/ee2d44f7-6856-a536-24b2-e2a5e2249bbf.png)
>下位バージョンのUnityのVideoPlayerは不安定で、クラッシュしやすいです。この点について、Unity公式テクニカルサポートチームに確認済みです。Unityバージョンを、できればUnity 2017にアップグレードすることをお勧めします。都合が悪い場合は、Unity5.6シリーズの上位バージョンにアップグレードできます。

---
###アニメーション
Q4: AnimationにTextMesh.color変数を追加できないようにしたいですが、どうすれば実現できますか？アニメーションにTextMashのaの値を変更する必要がありますが、matでの変更はバッチ処理できません。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/f2f70292-bb87-b998-a790-462512d8bd3d.png)
>確かにTextMeshのcolorは、Animationで直接変更できませんが、colorはスクリプトで変更できる。ですから、Textコンポーネントを追加する必要はありません。スクリプトで一つのColor変数をpublicし、AnimationでこのColor変数を変更させ、スクリプトでTextMeshに割り当てます。但し、実にはAnimationを使わず、スクリプトを直接使用してTextMesh.colorを制御することもできます。

>こちらを参照できます：https://stackoverflow.com/questions/37426522/unity-how-to-animate-a-flashing-textmesh-so-varying-the-alpha-when-the-player

---
###スクリプト
Q5: Get CompaonentのAPIでGameObjectのコンポーネントを取得する時に、時々に取得する手順は違う場合があります。この順序は何によって決まりますか？

①
>前にこの問題に気づいていませんでしたが、面白いと感じで、GetComponentsとorderの二つのキーワードを使用して検索を行いました。
https://answers.unity.com/questions/1293957/reliable-order-of-components-using-getcomponents.html
https://answers.unity.com/questions/556932/does-getcomponents-return-the-components-in-the-or.html
https://stackoverflow.com/questions/42375242/unity-getcomponentsinchildrent-return-order
大意は、順序はInspectorに見た順序と同じですが、この順序はundocでありため、Unityがいつ実現を変更して順序を変更させても私たちはわかりません。

>問題主はどのような状況で取得した順序が違うのが知りません、この不一致は、全く同じ状況で複数回取得した結果ですか？とりあえず、順序がゲームのロジックに影響できないようにする方がいいと思います。何となく、現在のテストが安定していても、将来のバージョンにはわかりません。

②
>GetComponentsによって取得される順序は、Inspector内のComponentの順序です。Editorこの順序を変更すると、それに応じてこの関数APIで得られるものも変わります。

---
UWA Technologyは、モバイル/VRなど様々なゲーム開発者向け、**パフォーマンス分析**と**最適化ソリューション**及び**コンサルティングサービス**を提供している会社でございます。

UWA公式サイト：https://jp.uwa4d.com
UWA公式ブログ：https://blog.jp.uwa4d.com