U3D杂记

1,点击UI上的登录按钮,从脚本发出ioo.netmanager.SendConnet->进入CS->soketclient.sendconnet...
->netmanager调用 callfunc("onsoket")又将网络通信回调到脚本,脚本通讯一切都是从OnSocket开始的。
解包时如果前后两端的协议配置文件MD5不一致则重新下发,如果一致直接取本地
2,RPC调用流程:分为后端调用和前端调用。
后端调用:rpc_client_xxxx,这是后端向前端发起的调用。过程是:
建立连接后,前端OutStream o = TCPClient.BeginRead(...)读取得到后端的数据。读完后将获得的字节数据通过
netmanager回调到脚本 onsocket中,onsocket调用protocolmanager.onsocket -> rpc.onpacket对服务端的字节包进行解包,包的第一个short是functionId,就是rpc_lua_table中的function_cfg的key,根据它取得函数名。
然后再解包出后面的字节(函数的调用参数),然后调用该函数,如果我们按照该函数的名字在cprotocol中实现了该函数(参数也要对应),那么该函数就会被调用。
这就实现了一个远程调用,RPC,实际是封装了网络底层的通信细节,让前端调用后端及后端调用前端都像本地调用。
前端调用:rpc_server_xxxx,这是前端向后端发送相关信息。
过程是:前端使用protocolmaager.rpc_server_xxx()的函数形式发起调用。这些rpc_server_xxx其实都是同一个LUA函数proxy_func,可在GenServerProxy中看到。proxy_func中执行封包,将基本类型及结构类型全以字节数据封到一个BUF中,然后通过ioo.networkManager:SendMessage(buff)发到CS中,进而调入socketcliet中通过tcpclient返回的Outstream向服务端发送数据 Outstreeam.BeginWrite,完成发送
3,
public class PlaySimulator : MonoBehaviour{
    public static PlaySimulator Create(){
        GameObject go = new GameObject("PlaySimulator");
        PlaySimulator ins = go.AddComponent<PlaySimulator>();
        return ins;//因为此时ins可以使用 ins.gameobject,就是说ins有一个对go的引用,因此可以像这样创建一个Gameobject,然后添加一个组件,然后返回该组件,而不须返回创建的GameObject
    }

}
3,rootmotion一点新体会:
它是在美术动画中做死的,比如一个跑步动画,美术做跑步动画时它本身是一边跑一边有位移的。
U3D自带的演示角色跑步动画有位移。WOW的角色跑步动画都没位移。
根动画在导出成FBX时,存储在动画集中,如跑步动画中。只要美术在3DMAX中做的时候角色不滑步,那么在游戏中也不会滑步。
这就是根动画的好处。它是U3D自动处理的。
4,U3D中图集打包很简单,只需要为sprite在属性中指定 packing tag,然后打开sprite packer,点击pack就会对所有指定了packing tag的图片进行打包
,packing tag相同的sprite会打到同一个图集中。使用时并没有图集的概念,还是使用原始图片。U3D会在游戏运行时自动使用图集。
对比NGUI的使用就麻烦些了,NGUI atlasmaker打包过程:在磁盘上选中要打包的小图,打开atlasmaker,新建一个图集。
点击ADD会将选中的小图添加进来。使用时:NGUI->create sprite ,点击sprite属性,选择图集,然后再选择图集中的图片。
NGUI中有TWEEN功能,实现简单的位置变换,旋转,缩放,颜色或ALPAH渐变等。
使用NGUI添加一个sprite时,会在层级面板自动生成UI Root,下面有一个uicamera子结点和生成的sprite子结点。
UI ROOT也就相当于UGUI中的canvas, 不过UGUI把UI相机隐藏了,实际上还是有一个默认的UI相机的。
5,突然想到:由C++程序的编译链接执行过程可以知道NET程序(C#程序)在编译时是不经过汇编的。
C++程序编译执行过程:CPP源码编译为汇编代码,存储在一个个的.obj文件中,然后执行链接,将这些OBJ文件,以及第三方DLL库,
以及操作系统入口调用代码汇编为机器码,然后在机器上执行。
NET程序的执行过程:将CS文件编译为程序集,即EXE,程序集中是IL和元数据,IL为伪汇编代码。运行EXE时,
加载CLR将程序集转换为本地机器码
6,看了导航网格寻路的原理:第一步生成导航网格,算法没看,就是利用凸包原理在3D场景上面生成一层覆盖网格。
第二步,利用A星寻出一条网格路径。第三步:在A星寻得的网格集上,拐点法寻找出真正的路线(一段拆线)
由此可见导航网格寻路要效率要比A星高得多,网上有人说要高1到2个数量级, 10到100倍?因为A星要把场景划分为密集的网格,
而导航网格的格子则有大有小,平坦的地方非常稀疏,且通过了A星筛选,这些都是预处理好的,在运行时只需要在A星筛选出的格
子中进行寻路,效率当然要比原始A星高上不知多少了。
而且导航网格比原始A星(路点A星寻路)多出许多优点,总之是有过之而无不及。
7,  UnityEngine.Object[] soundObjs = Resources.LoadAll (path);
注意,path是相对于Resources文件夹的,Assets下可以有许多Resources文件夹,不同位置的Resources文件夹内的文件和层级可以完全相同,loadAll将一视同仁的对待。
path传“”时,会将所有Resources文件夹下的资源全部加载,不管重复与否。
8,像声音这种资源,不需要实例化,只需要在某个GO上添加AudioSource组件,运行时获取这个组件并调用play()即可。
有时候可能需要动态创建声音,这个其实可以绕开,不必自己加载自己管理声音。
可以在需要声音的GO上依次添加多个音源组件(该组件只是个引用,不用怕),在使用时,根据音源顺序与实际名字对应上。所有的GO都可以这样做,这样就避免了自己加载与管理音源,让U3D帮我做。

posted @ 2016-11-16 20:41  时空观察者9号  阅读(229)  评论(0编辑  收藏  举报