zoukankan      html  css  js  c++  java
  • 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帮我做。

  • 相关阅读:
    jdbc连接池工具与pg fdw连接的问题
    关于drill http存储插件http 超时的一些说明
    tds-fdw PostgreSQL said: DB-Library error: DB #: 20002, DB Msg: Adaptive Server connection failed, OS #: 0, OS Msg: Success, Level: 9 问题解决.md
    开发自己的jdbc驱动——可选开发工具
    nexus Invalid state: DELETED; allowed: [STARTED] 问题解决
    airline开发类似git cli 的jar 包
    开发自己的jdbc驱动——基本说明
    nessie 安装&&简单试用
    nessie 类似git 管理数据湖
    一些不错的开源大数据虚拟数据sql 查询引擎
  • 原文地址:https://www.cnblogs.com/timeObjserver/p/6071429.html
Copyright © 2011-2022 走看看