有谁用联通3G手机卡没有信号怎么办的,信号咋样,乡下又如何

从事unity开发的多年里 ,有几个不解&br&其中之一就是为何有那么多人在尝试做虚拟换衣。。 或者魔镜换衣啥的&br&&br&布料模拟是非常高端特殊的,特别涉及布料缝合 多重布料,简直算死电脑,更何况打板设计等等都是异常复杂的专业领域,市面上基本就是marvelous designer一家独大(有几个相关衍生如cth3d啥的,基本都是相同技术,甚至就是一个团队),人家尚且需求大量的解算时间,为何要用unity去做如此专业复杂的工作,我不理解。&br&&br&我多年制作VR类交互产品,深知国内大量项目纯粹追求好看,但是如果软件本身一点用处没有,对开发者本身亦是一种否定,这类穿衣软件基本都是拼命上马,草草收场,弄出个没有实际用处,甚至也不好看的产品出来。&br&&br&钱大家要赚,我很理解,但是弄一个完全没有实际用途,仅仅是实现并不先进的所谓先进技术,真的能好好收尾么,所以每次人家问我虚拟换衣,我总是说一堆限制局限,最后人家意兴阑珊的走开了。&br&&br&但也许这样才是最好的,不是么
从事unity开发的多年里 ,有几个不解 其中之一就是为何有那么多人在尝试做虚拟换衣。。 或者魔镜换衣啥的 布料模拟是非常高端特殊的,特别涉及布料缝合 多重布料,简直算死电脑,更何况打板设计等等都是异常复杂的专业领域,市面上基本就是marvelous design…
&b&一个故事:&/b&&br&&br&早先改革开放的时候,有老板出资去买了德国的机器,以为就能做出德国品质的产品。结果设备运回来后,发现连能驾驭该设备的工程师都欠缺。&br&&br&&b&举个实际的例子:&/b&&br&&br&因为mono带来的便利性的同时,给Unity的内存也带来了致命伤,但是,驾驭的好,是可以用来做大多数的东西的。曾经在一家NSDQ上市公司做一款产品,做出来大家只知道这东西太耗内存了,遇到宕机一点办法都没有或者是找到的方法只能化解表面的问题。但是,国外差不多级别的产品,同样用unity,消耗的资源可能只有一半。这里面真的不是unity的问题,是人的问题。&br&&br&&b&然后是观点:&/b&&br&&br&国内跟国外比,还缺太多的“人才”。同样的一个工具,在不同人手里使用,出现的效果会有天壤之别。&br&&br&即使回到流程上,行业里也没有所谓的原型开发和验证阶段,这个阶段就是来验证选择的工具是否适合要做的产品的。可能大家都不懂或者大家都很着急着去上市:)。&br&&br&所以,怪一个工具,特别是还在流行的工具,无论如何是没有任何道理的。&br&&br&&b&结论:&/b&&br&&br&失败是常态。unity会成为其中的原因,可能只是当初unity不适合该产品,或者团队中的人当时并不能驾驭unity来制作产品。
一个故事: 早先改革开放的时候,有老板出资去买了德国的机器,以为就能做出德国品质的产品。结果设备运回来后,发现连能驾驭该设备的工程师都欠缺。 举个实际的例子: 因为mono带来的便利性的同时,给Unity的内存也带来了致命伤,但是,驾驭的好,是可以用…
从前是美术出身,做的基本虚拟比较多,对优化的要求不高,有就行。&br&大多情况需要弄shader都是因为透明效果,反射折射什么,或者需要顶点色啥的。&br&&br&这时候,我就掏出shaderforge,一发搞定(不要问我哪里有download,我用正版的)&img src=&/b97c34f32fb02a8615bef2_b.png& data-rawwidth=&829& data-rawheight=&597& class=&origin_image zh-lightbox-thumb& width=&829& data-original=&/b97c34f32fb02a8615bef2_r.png&&&br&&br&&img src=&/348c497f73ff5dd39fac_b.png& data-rawwidth=&479& data-rawheight=&241& class=&origin_image zh-lightbox-thumb& width=&479& data-original=&/348c497f73ff5dd39fac_r.png&&
从前是美术出身,做的基本虚拟比较多,对优化的要求不高,有就行。 大多情况需要弄shader都是因为透明效果,反射折射什么,或者需要顶点色啥的。 这时候,我就掏出shaderforge,一发搞定(不要问我哪里有download,我用正版的)
Editor中:修改shader并保存时立即编译。&br&&br&Runtime下,无论哪个平台,都是在进入场景时加载shader object内容到内存,但是首次实际调用渲染时才编译,编译完成之后会cache下来。&br&&br&有两种优化方法:&br&&br&1. 调用Shader.WarmupAllShaders(),自动编译该场景中用到的所有shader。该方法在Unity5中已经废弃。&br&&br&2. 在项目设置的GraphicsSettings中,可以导出ShaderVariantCollection,并在Preloaded Shader中导入,这样的话就可以在载入场景时一并编译需要预加载的shader,这样的优化在移动平台上用得比较多。&br&&br&具体见:&br&&a href=&///?target=http%3A///Manual/OptimizingShaderLoadTime.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Unity - Manual:
Optimizing Shader Load Time&i class=&icon-external&&&/i&&/a&
Editor中:修改shader并保存时立即编译。 Runtime下,无论哪个平台,都是在进入场景时加载shader object内容到内存,但是首次实际调用渲染时才编译,编译完成之后会cache下来。 有两种优化方法: 1. 调用Shader.WarmupAllShaders(),自动编译该场景中用到的…
unity3D开发是否简单这个问题我就用自己的一点经历来回答吧,我算是游戏行业的一枚新兵,虽然工作年限不短了,惭愧。去年九月份开始unity,正式开始用其开发是去年的十一月份,目前用其开发了一款半2D游戏,指导开发了一款3D游戏,之前无游戏引擎使用经验,有php+mysql网站开发经验,就我来说,unity的使用还是较简单的,不过,要想成为高手还是比较难的。&br&其实unity吸引众多开发者使用的原因除了入门快之外,更重要的是其跨平台性和3D表现特性,这两点在之前举办的unity开发者大会上一再被提到,另外我认为其新版本的快速推出,良好的技术支持(unity的官方论坛上几乎可以解决一切问题,需要英文哦,unity的官方技术牛长泡在上边),开发丰富的资源商店也是重要原因。&br&unity3D分免费版、基础班和高级版,基础版和高级版需要收费,而且商业使用的话必然是高级版了,因为unity的跨平台机制导致其导出的ios和android安装文件要大于原生方式开发出的文件大小,高级版较基础版来说加入了更多的优化机制,文件大小会小一些,其次就是高级版较基础版多了许多功能。&br&高级版一套包括基本授权(可以导出pc版和web版产品)、ios授权、android授权以及flash授权,每个授权都是1000美金,除基本授权必须购买外,其他授权选购。&br&以上只是我自己的一点浅薄经验之谈,疏漏之处敬请谅解。&br&unity的跨平台特性以及其他特性,unity的购买价格,其实在官网上都有详细描述,现在官网也有中文版了,如果想了解更多,直接去看看吧。&a href=&///?target=http%3A//& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&。&br&&br&*********************************分隔符**********************************************&br&&br&哦,再补充点unity3D的不足之处(限于移动开发)&br&1、导出的安装包体积较大,无论ios还是android,因此开发过程中的资源优化十分重要;&br&2、使用第三方sdk比较麻烦,比如应用内支付(苹果的iap、国内android平台的支付sdk)、广告sdk等,需要对sdk进行二次开发,不过随着unity3D在国内的普及,sdk提供者同时提供unity3D版sdk,比如中移动、友盟;
unity3D开发是否简单这个问题我就用自己的一点经历来回答吧,我算是游戏行业的一枚新兵,虽然工作年限不短了,惭愧。去年九月份开始unity,正式开始用其开发是去年的十一月份,目前用其开发了一款半2D游戏,指导开发了一款3D游戏,之前无游戏引擎使用经验,…
因为项目需要,比较了下uLua和sLua&br&&br&测试工程见 &a href=&///?target=https%3A///qiankanglai/unity_lua_benchmark& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&GitHub - qiankanglai/unity_lua_benchmark: sLua/uLua Performance Test&i class=&icon-external&&&/i&&/a&&br&&br&放几张结果图&br&ps. 下面的图我为了美观都是&b&对数&/b&坐标...&br&pss. uLua的工程目录我无力吐槽………………&br&&br&&img src=&/318c6c5b223d7e05c8aeb7_b.png& data-rawwidth=&613& data-rawheight=&431& class=&origin_image zh-lightbox-thumb& width=&613& data-original=&/318c6c5b223d7e05c8aeb7_r.png&&&br&&img src=&/1e2cc160e9aa6_b.png& data-rawwidth=&407& data-rawheight=&286& class=&content_image& width=&407&&&img src=&/9aeec1d88d14d05e0aad95_b.png& data-rawwidth=&482& data-rawheight=&287& class=&origin_image zh-lightbox-thumb& width=&482& data-original=&/9aeec1d88d14d05e0aad95_r.png&&
因为项目需要,比较了下uLua和sLua 测试工程见
放几张结果图 ps. 下面的图我为了美观都是对数坐标... pss. uLua的工程目录我无力吐槽………………
数据驱动是游戏开发的常用套路。&br&&ul&&li&最常见的,策划配资源、配数值,运营配活动。&br&&/li&&li&高级点的,将复杂的逻辑处理配置化、配表化,这样很容易写出灵活鲁棒的设计。可以用在复杂的流程跳转、AI设计、公式计算、奖励判定等。&/li&&/ul&数据驱动其实很简单,每个开发者都能掌握,但注意不要滥用。&br&&br&数据驱动和 Entity Component System 被当成是常见搭配,通过配置 ECS,确实能实现一些像 &a data-hash=&96ebf60da4f1295abab79cce388e85c0& href=&///people/96ebf60da4f1295abab79cce388e85c0& class=&member_mention& data-editable=&true& data-title=&@钱康来& data-hovercard=&p$b$96ebf60da4f1295abab79cce388e85c0&&@钱康来&/a&提到的“零代码”编程,但我认为这其实更接近模块化设计,数据仅仅是模块的载体罢了。
数据驱动是游戏开发的常用套路。 最常见的,策划配资源、配数值,运营配活动。 高级点的,将复杂的逻辑处理配置化、配表化,这样很容易写出灵活鲁棒的设计。可以用在复杂的流程跳转、AI设计、公式计算、奖励判定等。数据驱动其实很简单,每个开发者都能掌握…
在知乎上结交了许多的3d同好,并且在我建立的Q群中经常聊天。这个过程中我发现视频比我想像的有人缘,很多现在的同学,都喜欢看着视频学习。我经这个现象仔细思考了一下,觉得视频比书有几个好处:视频上的讲解,特别是实战课程,都是老师一行一行代码的敲出来可以看到的。哪个菜单被点中,都是一目了然的。而书本在这两个方面显然不如视频。而且,视频的演示往往能让同学能先知道结果是可以运行的。而书本,可能对着敲了半天代码却发现编译不过(因为印刷错误或者人为的错误)。当然,视频本身有一定的缺陷,如不易查阅等。&br&&br&后来又因为招人的原因,接触到不少培训学校出来的同学。初始发现培训学校的确是很“黑”,正如楼主所说的意思,没有教多少内容,却收了狂多的费用。但是随着深入了解这个行业(那时候在线教育风生水起),我发现线下的培训的确还是有用处的,特别是对还在门外的同学,因为不管老师怎么讲,至少他把你领进门,知道这么个东西“怎么用”和“是什么”肯定是没有问题的。问题只在于,线下的培训,因为线下成本的原因(从这点出发真不黑),性价比相当的差。&br&&br&因此,我开始筹划创办在线的视频网站和在线培训&a href=&///?target=http%3A//98jy.net/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&98jy - 永不熄灯的课堂&i class=&icon-external&&&/i&&/a&,致力于线上的教育,希望以低成本的方式帮助到很多想要进入这行的同学。创办的过程中,我逐渐了解到,线上教育与线下教育相比,目前主要是不能控制到同学的真实学习时间,因此非常依赖同学的自律性。所以,下面是我对楼主的回答:&br&&br&1、如果你不差钱,自律性很差,还没有入门,线下的培训机构还是可以考虑的,有老师带着学,比自己自学入门快很多,还能结识一群伙伴;&br&2、自律性还不错,报线上的班就可以;省出来的大笔钱用来给自己学成后奖励自己,也能认识到更多的伙伴。&br&3、喜欢啃书的,of course,you can do just as you like!
在知乎上结交了许多的3d同好,并且在我建立的Q群中经常聊天。这个过程中我发现视频比我想像的有人缘,很多现在的同学,都喜欢看着视频学习。我经这个现象仔细思考了一下,觉得视频比书有几个好处:视频上的讲解,特别是实战课程,都是老师一行一行代码的敲…
RPG Map Editor &br&&a href=&///?target=http%3A///threads/released-rpg-map-editor.278604/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&[RELEASED] RPG Map Editor&i class=&icon-external&&&/i&&/a&&br&这个asset仿rpgmaker的自动地砖到unity,试了下作者的demo,好像是通过像素来计算碰撞。&br&&br&我觉得,个人做游戏,用什么做不重要,最主要是有好的剧情脚本(各种日本免费游戏,狂父、魔女之家、尸体派对)又或者新颖有趣的游戏体验(死亡独轮车什么的)。&br&&br&还是推荐用RPG Maker 系列,最新版RPG Maker MV改JS了,全平台的方向挺不错的,推荐试试&br&&br&&img data-rawwidth=&800& data-rawheight=&480& src=&/ebeedf109abc_b.jpg& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&/ebeedf109abc_r.jpg&&&img data-rawwidth=&800& data-rawheight=&480& src=&/04f0f044e02c968e50f1c9a_b.jpg& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&/04f0f044e02c968e50f1c9a_r.jpg&&&img data-rawwidth=&1908& data-rawheight=&948& src=&/50b1dbcfa9740ddc21aef_b.jpg& class=&origin_image zh-lightbox-thumb& width=&1908& data-original=&/50b1dbcfa9740ddc21aef_r.jpg&&&img data-rawwidth=&1230& data-rawheight=&758& src=&/c1ab14d2f94fc4bcbaa0e04d_b.jpg& class=&origin_image zh-lightbox-thumb& width=&1230& data-original=&/c1ab14d2f94fc4bcbaa0e04d_r.jpg&&
RPG Map Editor
这个asset仿rpgmaker的自动地砖到unity,试了下作者的demo,好像是通过像素来计算碰撞。 我觉得,个人做游戏,用什么做不重要,最主要是有好的剧情脚本(各种日本免费游戏,狂父、魔女之家、尸体派对)又或者新颖…
官方论坛和Wiki是最好的材料。看别人的代码和自己模拟一个项目做是最快的途径。远离培训和坑爹的书
官方论坛和Wiki是最好的材料。看别人的代码和自己模拟一个项目做是最快的途径。远离培训和坑爹的书
首先你应该明确这个规定的限制范围:只是针对MonoBehaviour的派生类,为什么,因为其他的类就是正常的C#类,你在里面写Awake方法,就是个普通的叫Awake的方法,并不会被自动调用。&br&原因也很简单,MonoBehaviour代表的是一个组件,在Unity3D里面组件是必须依附于GameObject存在的,对于这种类你永远都不会使用new来创建一个实例,而是使用AddComponent或GetComponent方法来获取。Unity3D的开发人员并不想让你知道这个类是具体什么时候new出来的,你只要关心我想要的时候能够拿到一个引用就可以了。&br&你引用的这条限制,在我理解来看实际是说:“MonoBehaviour的生命周期并不是从构造函数开始的,而是从Awake开始的”。在构造函数中初始化变量,一般来说目的是将类的状态设置到一个“初始状态”,对于MonoBehaviour来说,你相当于在这个类的生命周期之外设定了它的状态,此时这个代码就是不严谨的,而应该放在Awake里面去。&br&因此,在我的理解来看,你应该避免做的是在构造函数里设定任何跟类的内部状态有关的事情。举例来说,如果我在做一个计数器,有一个count变量,这个变量就明显是内部状态,count=0这句话就应该放在Awake中。另外,程序不是一个类组成的,在实际工程中,有时候一个类的状态依赖于其他类的状态,你举例的GUI.Button方法可以看做设定了GUI类的内部状态,这个代码也不应该放在构造函数中(这个例子不好之处在于GUI类的方法只能在onGUI中调用,不能在任何其他地方,包括Awake中使用,如果换用一个其它全局变量可能更能说明问题)&br&另一方面,我们可以做一些不牵扯到类的内部状态的事情,举个例子:&br&&div class=&highlight&&&pre&&code class=&language-csharp&&&span class=&k&&class&/span& &span class=&nc&&A&/span&&span class=&p&&{&/span&
&span class=&k&&public&/span& &span class=&kt&&int&/span& &span class=&n&&count&/span&&span class=&p&&;&/span&
&span class=&k&&public&/span& &span class=&kt&&int&/span& &span class=&n&&price&/span&&span class=&p&&;&/span&
&span class=&k&&public&/span& &span class=&kt&&string&/span& &span class=&n&&name&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&k&&class&/span& &span class=&nc&&AComponent&/span& &span class=&p&&:&/span& &span class=&n&&MonoBehaviour&/span&&span class=&p&&{&/span&
&span class=&n&&A&/span& &span class=&n&&inner&/span&&span class=&p&&;&/span&
&span class=&k&&public&/span& &span class=&kt&&int&/span& &span class=&n&&Count&/span& &span class=&p&&{&/span&&span class=&k&&get&/span&&span class=&p&&{&/span&&span class=&k&&return&/span& &span class=&n&&inner&/span&&span class=&p&&.&/span&&span class=&n&&count&/span&&span class=&p&&;}&/span& &span class=&k&&set&/span&&span class=&p&&{&/span& &span class=&n&&inner&/span&&span class=&p&&.&/span&&span class=&n&&count&/span& &span class=&p&&=&/span& &span class=&k&&value&/span&&span class=&p&&;}}&/span&
&span class=&k&&public&/span& &span class=&kt&&int&/span& &span class=&n&&Price&/span& &span class=&p&&{...}&/span&
&span class=&k&&public&/span& &span class=&n&&String&/span& &span class=&n&&Name&/span& &span class=&p&&{...}&/span&
&span class=&k&&public&/span& &span class=&nf&&AComponent&/span&&span class=&p&&(){&/span&
&span class=&n&&inner&/span& &span class=&p&&=&/span& &span class=&k&&new&/span& &span class=&n&&A&/span&&span class=&p&&();&/span&
&span class=&p&&}&/span&
&span class=&k&&public&/span& &span class=&nf&&Awake&/span&&span class=&p&&(){&/span&
&span class=&n&&Count&/span&&span class=&p&&=&/span&&span class=&m&&0&/span&&span class=&p&&;&/span&
&span class=&n&&Price&/span&&span class=&p&&=&/span&&span class=&m&&10&/span&&span class=&p&&;&/span&
&span class=&n&&Name&/span&&span class=&p&&=&/span&&span class=&s&&&Something&&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&在这样一个类的构造方法中我创建了一个A对象给了inner,原因在于我这个类的内部状态并不在inner本身,而是在于inner的内部状态,此时创建出来inner不是为了设定状态,而是为了让几个属性永远都能用而已。实际状态设定还是在Awake中。&br&当然这个new也可以写在Awake中,因为毕竟实际用到这几个属性的时候Awake应该是已经调用过了,但这两者还是有略微的区别,就是何时创建这个对象的问题。如果你做过手游,应该会知道手机环境上new一个东西的效率并不是很高(由于这个东西不是临时对象,所以不讨论GC问题),写在构造函数里会在资源加载时调用,写在Awake里会在第一次使用(例如它依附的GameObject第一次变成active)时调用。&br&假设这个A类占用很大内存,甚至可能会出现内存不够的crash,那么这两者就有区别了,写在new中,这个申请内存会在资源加载时,此时游戏大概会有一个loading的界面,卡一点是可以接受的,如果crash掉了,也会给用户一个明显的暗示就是内存不够导致的crash,是不是关一些后台程序再来试试。而放在Awake中,可能发生的是用户第一次触发某个功能,放某个技能,就会卡一下,如果crash掉了,那就是在说我这个功能没做好,所以崩了,这种体验比起上一种是要差一些的。&br&&br&结论:大部分情况下把所有的初始化写在Awake里就行,写在构造函数里并不是完全没有应用场景,但比较少见,是一种具体问题具体分析的优化策略,写的时候需要脑子清楚,知道自己为什么要这么写。
首先你应该明确这个规定的限制范围:只是针对MonoBehaviour的派生类,为什么,因为其他的类就是正常的C#类,你在里面写Awake方法,就是个普通的叫Awake的方法,并不会被自动调用。 原因也很简单,MonoBehaviour代表的是一个组件,在Unity3D里面组件是必须依…
大致看了下前面的回答,都没说到点子上。作为一个从业12年的游戏3d美术,很付责任的告诉你。所有的软件都相对容易掌握。不管是ps,zb,max,maya,sp都是实现目的的工具,熟练只是时间问题。不要忽视美术基础的训练,还有就是见识的多寡。美术基础和造型能力才是核心能力,这个决定你在这一行能走多远。&br&具体到入门,如果你完全没接触过这行,我建议你去报个学习班,系统的学习一下,就基本能掌握所有需要的软件,和制作的流程。这个会比你自学快一些,也更加规范一些。再往后的深入学习就的靠我开始跟你提到的核心能力了。
大致看了下前面的回答,都没说到点子上。作为一个从业12年的游戏3d美术,很付责任的告诉你。所有的软件都相对容易掌握。不管是ps,zb,max,maya,sp都是实现目的的工具,熟练只是时间问题。不要忽视美术基础的训练,还有就是见识的多寡。美术基础和造型能力才…
&p&泻药。文档里写的很清楚啊,是顶点属性(vertex attributes)的数量限制是900,而非直接限制顶点数量本身。&/p&&p&因此,如果用到了Vertex Position, Normal and single UV,那么限制就是900/3 = 300个顶点&/p&&p&如果再增加几个属性,Vertex Position, Normal, UV0, UV1 and Tangent,那么限制就是900/5=180顶点了。&/p&&a href=&///?target=https%3A///Manual/DrawCallBatching.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Draw call batching&i class=&icon-external&&&/i&&/a&
泻药。文档里写的很清楚啊,是顶点属性(vertex attributes)的数量限制是900,而非直接限制顶点数量本身。因此,如果用到了Vertex Position, Normal and single UV,那么限制就是900/3 = 300个顶点如果再增加几个属性,Vertex Position, Normal, UV0, UV1 …
&p&占坑,先说说现状,以后细答。&/p&&p&============================时间日============================&/p&&p&现在,我们团队正打算用类似UNet的方案,这周,我用这个方案写了个小Demo。&/p&&p&Demo的玩法是多玩家在同一个场景内采集资源、互相攻击、自我增益等等,主要是为主体游戏验证同步方案。&/p&&p&实现起来涉及到的框架功能如下:&/p&&p&1. 创建房间&/p&&p&2. 建立连接Peer&/p&&p&3. 创建、同步网络数据对象NetworkPlayer&/p&&p&4. 由NetworkPlayer创建本地对象&/p&&p&5. 使用SyncVar同步属性(Host拥有修改权限,Client仅能定时接收到同步)&/p&&blockquote&例如HP&/blockquote&&p&6. 使用NetworkTransform方案同步属性(Client有修改权限,并同步给Host及其他Client)&/p&&blockquote&例如Position&/blockquote&&p&7. Client使用Cmd调用Host逻辑&/p&&blockquote&例如使用道具&/blockquote&&p&8. Host使用Rpc调用网络对象逻辑,并下发至所有Client上的对应网络对象&/p&&blockquote&例如使用道具成功&/blockquote&&p&9. Client对Host发送Message&/p&&blockquote&例如请求LocalPlayer所在位置的地图数据&/blockquote&&p&10. Host对指定Client发送Message&/p&&blockquote&例如返回对方所请求的地图数据&/blockquote&&br&&p&那么,在写起来的时候是什么一种感觉呢?&/p&&blockquote&早上起床,我对着镜子刷着牙,然后开始认真思考自己是LocalPlayer还是RemotePlayer,我现在刷牙这么认真,会不会不同步出去,如果不同步出去我岂不是白刷了。&br&写代码时感觉要精分,上一行是Host,下一行可能就是Client了,上一行是Local,下一行可能就是Client了。&/blockquote&&p&实际书写碰到的不习惯:&/p&&p&1. 整条工作流非常长&/p&&blockquote&相当于在C/S架构中,同时写Client、Server并且制定协议,在写Client的过程中还需要写Local、Remote,再往后还有View层的相关表现,导致一个功能的实现可能需要同时编写6个以上的文件&/blockquote&&p&2. 在收发Cmd/Rpc、修改SyncVar时,需要脑子清醒&/p&&blockquote&考虑自己是Host还是Client,是否有权限做相关操作&br&考虑自己是Local还是Remote,分别做什么样的处理&/blockquote&&p&3. 在即是Host又是Client的情况下,代码共用所导致部分变量共用,部分代码写起来很猥琐,例如:&/p&&div class=&highlight&&&pre&&code class=&language-csharp&&&span class=&kt&&bool&/span& &span class=&n&&isA&/span& &span class=&p&&=&/span& &span class=&k&&false&/span&&span class=&p&&;&/span&
&span class=&k&&void&/span& &span class=&nf&&A&/span&&span class=&p&&()&/span&
&span class=&p&&{&/span&
&span class=&k&&if&/span&&span class=&p&&(&/span&&span class=&n&&isA&/span&&span class=&p&&)&/span& &span class=&p&&{&/span& &span class=&k&&return&/span&&span class=&p&&;&/span& &span class=&p&&}&/span&
&span class=&n&&isA&/span& &span class=&p&&=&/span& &span class=&k&&true&/span&&span class=&p&&;&/span&
&span class=&n&&RpcOnA&/span&&span class=&p&&();&/span&
&span class=&p&&}&/span&
&span class=&k&&void&/span& &span class=&nf&&RpcOnA&/span&&span class=&p&&()&/span&
&span class=&p&&{&/span&
&span class=&c1&&//BUG!!!!如果是Host的话,isA此时为true&/span&
&span class=&k&&if&/span&&span class=&p&&(&/span&&span class=&n&&isA&/span&&span class=&p&&)&/span& &span class=&p&&{&/span& &span class=&k&&return&/span&&span class=&p&&;&/span& &span class=&p&&}&/span&
&span class=&n&&isA&/span& &span class=&p&&=&/span& &span class=&k&&true&/span&&span class=&p&&;&/span&
&span class=&c1&&//Do Something&/span&
&span class=&p&&}&/span&
&span class=&c1&&//正确打开方式&/span&
&span class=&k&&void&/span& &span class=&nf&&RpcOnA&/span&&span class=&p&&()&/span&
&span class=&p&&{&/span&
&span class=&k&&if&/span&&span class=&p&&(!&/span&&span class=&n&&isHost&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&k&&if&/span&&span class=&p&&(&/span&&span class=&n&&isA&/span&&span class=&p&&)&/span& &span class=&p&&{&/span& &span class=&k&&return&/span&&span class=&p&&;&/span& &span class=&p&&}&/span&
&span class=&n&&isA&/span& &span class=&p&&=&/span& &span class=&k&&true&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&c1&&//Do Something&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&p&分析原因:&/p&&p&-&1. C/S架构的工作流是,前后端先定接口,再写各自的逻辑,而现在我的Demo是前后端同时、同一个人写,所以工作流显得长&/p&&p&-&2. 由于共用代码的缘故,工作流是前后端同时写,导致思维混乱,实现起来完全可以避免&/p&&blockquote&分析好Host/Client的功能、接口&br&在初始的时候就就行Local/Remote的区分初始化、包括分支处理。&/blockquote&&p&-&3. 无解,除非不存在isHost && isClient的情况,由于C/S的架构本身就是前后端分离,所以不会有这种问题。&/p&&br&&p&使用建议:&/p&&p&1. 实现做好结构分析、设计&/p&&p&2. 分离出数据、逻辑、表现&/p&&p&3. 数据:确定Host、Client的持有、同步需求&/p&&blockquote&玩家们的背包数据在Host,每个Client拥有自己的背包数据,之间需要进行数据同步&/blockquote&&p&4. 逻辑:确定Host、Client的职责、权限、交互接口&/p&&blockquote&对背包的增减需要授信,所以逻辑在Host,同时对Client进行数据变化的推送&/blockquote&&p&5. 表现:根据需求针对网络对象,在初始化期间进行对应表现逻辑注入&/p&&blockquote&LocalPlayer注入至HUDPlayer,RemotePlayer注入至RemotePlayerManager&br&相同的事件,两边对进行不同的表现逻辑处理。&/blockquote&
占坑,先说说现状,以后细答。============================时间日============================现在,我们团队正打算用类似UNet的方案,这周,我用这个方案写了个小Demo。Demo的玩法是多玩家在同一个场景内采集资源、互相攻击、自我增益等等,…
如果是unity新手的话,可以先去unity官网照着教程做几个小游戏练练手,熟悉u3d一些基本编程规范与思想,对之后编程非常有益。&br&&br&如果不满足于这些,可以去github上fork一些比较成熟的u3d游戏项目看看他们的源码,会有较多的提升。当然一些优秀的u3d的插件例如behavior designer,itween的源码也值得观赏。&br&&br&编码之前,可以给游戏进行一些模块划分,以及适当的进行一些类划分。&br&性能优化方面例如涉及到字符串拼接的地方可以用stringBuilder代替String,可以减少不少内存垃圾;缓存常用组件以避免反复寻找…具体在csdn上搜一下u3d代码优化内存优化都有的~&br&&br&编码的时候注意一下类的可扩展性,可以省去不少后期维护的麻烦。尽量将不同功能的代码写在不同组件之中,提高组件的复用性。另外,可以使用虚函数来避免重复代码,重复代码写的时候不觉得怎么样,ctrl+c,crtl+v就OK啦,但后期维护起来就得改很多处,非常麻烦而且容易出幺蛾子。
如果是unity新手的话,可以先去unity官网照着教程做几个小游戏练练手,熟悉u3d一些基本编程规范与思想,对之后编程非常有益。 如果不满足于这些,可以去github上fork一些比较成熟的u3d游戏项目看看他们的源码,会有较多的提升。当然一些优秀的u3d的插件例如…
&p&大场景即便远近都用cook好的shadow mask也是性能有巨大压力的,如果游戏要在主流平台上去跑。&/p&&p&大场景整体来看,不是一个技术,而是指整体游戏运行效率高。&/p&&p&落实到场景上,可以考虑的包括&/p&&ul&&li&多线程 & simd&/li&&li&culling(frustum cull到portal到software rasterizer),&/li&&li&lod相关技术(geometry lod到billboard,mesh和terrain都有),&/li&&li&尽可能的离线化计算(从lightmap到各种可以离线化计算的东东)&/li&&/ul&&p&这里面unity有的做了,但是大部分是做的不到位和没做,没做的部分根据自己情况,能自己实现多少是多少。&/p&
大场景即便远近都用cook好的shadow mask也是性能有巨大压力的,如果游戏要在主流平台上去跑。大场景整体来看,不是一个技术,而是指整体游戏运行效率高。落实到场景上,可以考虑的包括多线程 & simdculling(frustum cull到portal到software rasterizer),…
&p&一个UNITY高级程序员除了要有精湛的编程水平,对UNITY各模块的深入理解能力,更需要的是一种作为高级程序员的担当。&/p&&br&&p&当项目出现问题的时候,无论是开发过程中还是线上运营中,作为高级程序员应该第一时间顶上,配合其他部门核查问题的技术原因,高效安全的提供技术解决方案,并且协调其他程序员完成任务并且配合验收。&/p&&br&&p&当碰见水平比自己初级的其他程序员,不要有不耐烦的心态,要想到自己也是这样成长下来的。要怀着分享的精神安排好自己的代码规范,方便别人理解自己的代码,必要时撰写文档或者画图来进一步降低沟通成本。&/p&&br&&p&有良好的学习习惯,Unity的进步非常快,每个新版本都会有新的坑,新的特性,要时刻保持着学习的热诚,并将优质的信息分享给项目。&/p&&br&&p&任何一家游戏企业,技术永远都是整个企业的核心支柱,所有员工的信心所在,不要轻视这个岗位,你每在这个位子上多投入哪怕1%的精力,整个企业能够更安全的开展更多业务的可能性就提高了很多。&/p&
一个UNITY高级程序员除了要有精湛的编程水平,对UNITY各模块的深入理解能力,更需要的是一种作为高级程序员的担当。 当项目出现问题的时候,无论是开发过程中还是线上运营中,作为高级程序员应该第一时间顶上,配合其他部门核查问题的技术原因,高效安全的…
&p&你好LZ&/p&&p&如要使用中文,需要修改一下字符长度相关的编码。书中采用了如下格式的字符串编码,字符串由4位的长度以及后面的字符编码所组成。&/p&&img src=&/v2-34d827fbf9f99bc0996a72_b.jpg& data-rawwidth=&719& data-rawheight=&141& class=&origin_image zh-lightbox-thumb& width=&719& data-original=&/v2-34d827fbf9f99bc0996a72_r.jpg&&&br&&p&对该编码的实现方式,比如在第7章“字节流协议”的addstring方法是这样的:&/p&&div class=&highlight&&&pre&&code class=&language-text&&public void AddString(string str)
Int32 len = str.L
byte[] lenBytes = BitConverter.GetBytes (len);
byte[] strBytes = System.Text.Encoding.UTF8.GetBytes (str);
if(bytes == null)
bytes = lenBytes.Concat(strBytes).ToArray();
bytes = bytes.Concat(lenBytes).Concat(strBytes).ToArray();
&/code&&/pre&&/div&&p&这段代码对于英文编码是没有问题了,但对于中文编码就会出现问题。原因就在于Int32 len = str.L这一句,中文的length获取的是字符个数,而非编码长度,导致出错。所以可以参考下面的形式,将len修改为编码后的字节流长度。&/p&&div class=&highlight&&&pre&&code class=&language-text&&public void AddString(string str)
byte[] strBytes = System.Text.Encoding.UTF8.GetBytes (str);
Int32 len = strBytes.L
byte[] lenBytes = BitConverter.GetBytes (len);
if(bytes == null)
bytes = lenBytes.Concat(strBytes).ToArray();
bytes = bytes.Concat(lenBytes).Concat(strBytes).ToArray();
&/code&&/pre&&/div&&br&&p&感谢大家支持《 unity3d网络游戏实战》&/p&
你好LZ如要使用中文,需要修改一下字符长度相关的编码。书中采用了如下格式的字符串编码,字符串由4位的长度以及后面的字符编码所组成。 对该编码的实现方式,比如在第7章“字节流协议”的addstring方法是这样的:public void AddString(string str)
1. 为什么要强调Texture2DArray可以用于地形,除了减少Bind以外有什么优势?&br&减少bind优势很大啊。即能减少drawcall,有能减少流水线暂停。即便只有这个优势,也是一个非常非常巨大的优势了。&br&&br&2. 既然每个Slice都要Sampling的话,性能上应该没有明显区别才对?&br&没有每个slice都要sample,这一点你理解错了。&br&&br&3. 退一步讲... 为什么有Texture3D了还要有Texture2DArray呢?&br&一个mipmap过的Texture3D,在depth方向也是逐层递减的。而mipmap过的Texture2DArray,只有x和y方向是逐层递减。Array长度不减。显然对于地形来说,你要的是后者。&br&&br&4. 看这里的说法主要就是便于绑定,所以DX12出了Bindless就没用了... &br&是的,有了bindless之后就不需要那些劳什子了。但你要考虑历史的进程啊。Texture2DArray毕竟是D3D10就有,硬件支持率几乎100%。
1. 为什么要强调Texture2DArray可以用于地形,除了减少Bind以外有什么优势? 减少bind优势很大啊。即能减少drawcall,有能减少流水线暂停。即便只有这个优势,也是一个非常非常巨大的优势了。 2. 既然每个Slice都要Sampling的话,性能上应该没有明显区别才…
已有帐号?
无法登录?
社交帐号登录}

我要回帖

更多关于 联通手机卡信号怎么样 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信