关于IL2CPP在Xcode下增量编译

关于IL2CPP在Xcode下增量编译

这是第128篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题,建议阅读时间10分钟,认真读完必有收获。

UWA 问答社区:answer.uwa4d.com
UWA QQ群:465082844(仅限技术交流)


编译

Q1:最近在研究加速打包问题,发现IL2CPP生成代码之后每次Xcode都是全量编译(直接Build而不是Clean+Archive),我参考这里看了下,并对比了下,如果C#代码没有变化,生成的CPP代码的内容确实不变。但是重新生成貌似会导致文件修改时间变化或别的属性变化,Xcode依然是所有都编译了一遍,这块有什么经验么?

题主:目前准备用UWA群里大佬说的方法绕开:
“打出的Xcode用svn同步到Xcode打包项目下”—Freshair.
我用dnspy看了下,il2cpp.exe直接修改代价有点大,而且不好维护。用BeyondCompare比较了下,发现其实就> Preprocessor.h和Native文件夹俩修改时间产生了变化...

感谢钱康来@UWA问答社区分享了该问答,欢迎转至社区交流:
https://answer.uwa4d.com/question/5b90ebbb670c1a61c64d6cd3


UI

Q2:我用OnPopulateMesh修改UI的顶点数据,通过Tangent向UGUI的Shader中传递一些数据,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代码:

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。请问下是什么原因,还是代码哪里写的有问题?

见下图:
请输入图片描述

感谢钱康来@UWA问答社区提供了回答
该问答来自UWA问答社区,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5b8f6497f8456e3944031084


崩溃

Q3:请教一下,我使用VideoPlayer的时候,Android端调用Stop会闪退的,Unity 版本是5.6.1,大家有遇到过吗?该如何处理呢?

请输入图片描述

低版本的Unity上VideoPlayer就是不稳定的,容易崩溃。这点我们和Unity官方的技术支持团队确认过,建议升级Unity版本,最好升到Unity 2017,如果不方便可以升到高版本的Unity 5.6 系列。
感谢吴一帆@UWA问答社区提供了回答

该回答由UWA提供,欢迎大家转至社区进一步交流:
https://answer.uwa4d.com/question/5b91f86ba711f261c1677e16


动画

Q4:我想在Animation中无法加入TextMesh.color这个变量,请问该如何实现?需要在动画中修改TextMesh的a值, 但是在mat中修改没法合批。
请输入图片描述

经排查发现这个问题是由无法静态合批所致, 提示“Objects are affected by different forward lights”。经进一步测试,发现差异点为在游戏中,场景部件受到点光源照射, ForwardAdd打断合批过程, 如果把点光源屏蔽掉, 能够正常合批。

该回答由UWA提供,欢迎大家转至社区进一步交流:
https://answer.uwa4d.com/question/5b8f431cf8456e3944031080


脚本

Q5:我用GetComponents的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什么时候改了实现导致顺序变化了并不会知会你。
不知道题主在什么情况下获取的顺序不一致,这个不一致是否是完全相同的状态多次获取结果不一样?总之,我的感觉还是不要让顺序可以影响游戏逻辑为好,毕竟这东西即使当前测试稳定,以后的版本谁知道呢。

感谢贾伟昊@UWA问答社区提供了回答

UWA: 用GetComponents获取的顺序就是Inspector中Component的顺序。如果你在Editor中改变了这个顺序,那么用这个函数API获取的就随之改变了。

该问答来自UWA问答社区,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5b8c0a9f339d267d357c6eb6


今天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题也许都只是冰山一角,我们早已在UWA问答网站上准备了更多的技术话题等你一起来探索和分享。欢迎热爱进步的你加入,也许你的方法恰能解别人的燃眉之急;而他山之“石”,也能攻你之“玉”。

官网:www.uwa4d.com
官方技术博客:blog.uwa4d.com
官方问答社区:answer.uwa4d.com
官方技术QQ群:465082844(仅限技术交流)