如何在Unity中实现自制一根能收缩的鱼竿有弹性的鱼竿

(文章开头先放工程地址:http://mp./s/jkJh3mEUQx8E2Y2SY1WmTw)&&
& 游戏开发过程中经常需要控制游戏从一个状态切换到另外一个状态,比如:UI界面的切换(从背包系统切换到商城系统,从商城系统切换到任务系统,从奖励系统切换到聊天系统等等),每个系统之间是相互独立、但是有一些关联(当从商城系统切换到任务系统时,往往会发生这样有趣的对话:嗨,任务,我要谢幕了,接下来该你上场了,说完,商城系统收拾一下自己的道具,黯然离场。任务系统接收到来自商城系统的消息,准备好自己的道具、服装,闪亮登场,一场表演bulinbulin的开始。OK,任务系统要退出了,下一个上场的该是战斗系统了;任务系统通知战斗系统:老兄,该你战斗了,come
on ,说罢,任务系统退出。战斗系统提起早已饥渴难耐的大刀pipipapa,30秒到达了战场,紧接着,Game Over,计分系统老哥出场了,就这样,兄弟几个交替着上场、退出)。切回正题,其实上述描述的场景就是一个使用有限状态机控制的场景。在这样一个场景中,当前需要退出的状态不知道即将要进入的是哪一个状态,而即将要进入的状态也不关心上一个退出的场景是哪一个,两者需要关心的仅仅是:我什么时候该上场,上场之后需要做什么和我什么时候该下场,下场之后需要做什么。那么,既然,两者之间没有任何的联系,又是怎样做到上场和下场的消息通知呢。没错,这就导演的职责了,当一个状态要退出舞台时,通知导演:唉,导演,我的表演
It's Over了,我要卷铺盖走人了,说完,收拾自己的行李,下台。导演接收到信息,通知下一个状态:准备一下,小火鸡,该你上场了,下一个状态接收到来自导演的语音:好的,秃鹫收到,即将闪亮登场:Music在哪里,动次打次动次打次.............;从整个过程来分析,状态与状态之间完全是相互独立的、互不影响,我登台了,我干我该干的事,我下台了,我只收拾我的东西。至于,下一个上台的人,我只需要通知导演我下台了,至于谁上台,关我什么事。这样设计有一个很大的好处,各状态之间相互独立,不互相影响,避免了状态与状态之间的耦合,我们都知道,在计算机程序设计中追求的是高内聚、低耦合,面向对象开发中,我们需要尽量减少类与类之间的耦合度,这样才能增强软件的健壮性,避免产生更多的Bug。好了,犊子扯了这么多,来仔细谈一下什么是有限状态机吧。
&&&&有限状态机:又称为有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。(摘自百度百科)。一般有限状态机有以下几种类型的动作:
&&&&1.进入动作(进入当前状态时执行)
&&&&2.退出动作(退出当前状态时执行)
&&&&3.输入动作(接收到来自管理器消息时执行)
&&&&4.转移动作(在进行特定转移时执行)
看张图舒缓舒缓(画的很Low,凑合看吧)
从图中可以看出,状态与状态之间没有任何的关联,极大的降低了程序的耦合度,各个状态之间的消息传递,均通过管理器来完成,这样,状态只需要关心和管理在当前状态下会发生的事,而不需要额外的去获取其它状态的动作和事件,这就是有限状态机的一大好处。下图是一个在Unity& Animator
动画管理器中的一个有限状态机示例,实际比下图要复杂的多,在一组动画中,有多个动画状态,各个状态之间是没有关联的,状态与状态之间的切换,包括触发的条件,都是由动画控制器(Animator Controller)来管理的,当然,在Unity的Animator Controller中提供了四种类型的参数可供使用,分别是(bool& trigger& int float)。
说了这么多,没有写代码来的实在,下面,我就逐步的分析和实现一个基于UI管理器的简单有限状态机,用来控制各个UI状态间的切换。从上述的过程分析可知,每一个状态都有进入、退出等动作,在具体的进入和退出过程中,会执行一些当前状态下需要触发的事件。因此,创建一个基类是非常有必要的,让每个状态类继承它。基类代码如下所示:
我们创建各个系统的实例继承自基类:
一.商店系统
二:任务系统
三:计分系统
接下来就是比较重要的状态切换管理器了管理器了,管理器控制着各个状态间的切换(谁该上台,谁该收拾东西走人)
看一张大概图,文章提供github地址,需要工程文件的请跳转连接。本文大部分只是参考自Unity官方商业案例:Trash Dash,其UI状态的切换使用的就是FSM状态机,需要的可以下载Sample研究一下,其中也涉及一些数据存储,对象池等常用游戏开发技术,很有研究学习的价值,地址:https://www./en/#!/content/87901;
OK,本次有限状态机(FSM)分享就到这了。
再补一张工程文件截图:
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:6291次
排名:千里之外
原创:10篇
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'怎么用一根绳子模拟出一个弹簧或者皮筋的效果???【unity3d吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:77,628贴子:
怎么用一根绳子模拟出一个弹簧或者皮筋的效果???收藏
我知道用关节可以实现弹簧或者皮筋的效果但是关节和物体之间没有用绳子之类实际物体的连接起来。怎么做能够让一根绳子模拟出一个弹簧或者皮筋的效果???
51CTO学院11年行业品牌,1400万用户选择,中国专业IT技能学习平台,unity能做什么.通过在线学习的方式,帮助广大技术人员实现技能提升,高薪就业的职业梦想,unity能做什么.
自己顶一下。。希望高人解决
没人吗????急呀
可以用LineRender划线
登录百度帐号推荐应用&p&你可以这样做&/p&&div class=&highlight&&&pre&&code class=&language-csharp&&&span class=&k&&class&/span& &span class=&nc&&FuckAttribute&/span& &span class=&p&&:&/span& &span class=&n&&Attribute&/span&
&span class=&p&&{&/span&
&span class=&k&&public&/span& &span class=&n&&Type&/span& &span class=&n&&Shit&/span&&span class=&p&&{&/span&&span class=&k&&get&/span&&span class=&p&&;&/span&&span class=&k&&set&/span&&span class=&p&&;}&/span&
&span class=&p&&}&/span&
&span class=&k&&enum&/span& &span class=&n&&MyTypes&/span&
&span class=&p&&{&/span&
&span class=&na&&
[Fuck(Shit = typeof(FuckerResourceOrderEntity)]&/span& &span class=&n&&One&/span& &span class=&p&&=&/span& &span class=&m&&1&/span&&span class=&p&&,&/span&
&span class=&na&&
[Fuck(Shit = typeof(DeepAnalOrderEntity)]&/span& &span class=&n&&Two&/span& &span class=&p&&=&/span& &span class=&m&&2&/span&&span class=&p&&,&/span&
&span class=&na&&
[Fuck(Shit = typeof(BdsmSkirtOrderEntity)]&/span& &span class=&n&&Three&/span& &span class=&p&&=&/span& &span class=&m&&3&/span&&span class=&p&&,&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&p&然后反射,怎么从enum item里面拿到FuckAttribute的实例自己查。&/p&
你可以这样做class FuckAttribute : Attribute
public Type Shit{}
enum MyTypes
[Fuck(Shit = typeof(FuckerResourceOrderEntity)] One = 1,
[Fuck(Shit = typeof(DeepAnalOrderEntity)] Two = 2,
[Fuck(Shit = typeof(BdsmSkirtOrderE…
&p&先上最终效果&/p&&p&&br&&/p&&img src=&/v2-3bd346d2d97a1c37d6052_b.png& data-rawwidth=&1131& data-rawheight=&634& class=&origin_image zh-lightbox-thumb& width=&1131& data-original=&/v2-3bd346d2d97a1c37d6052_r.png&&&p&*最后在挥动方面的角度计算仍有问题,有问题的代码放在最后请大手子们指点一下。&/p&&p&===================================================&/p&&p&昨晚看到了这题,但是觉得可能会上头导致失眠,所以没写,结果还是失眠了……&/p&&p&如果要我个人说的话,我建议让美术制作“轻度弯曲”“中度弯曲”“重度弯曲”三个动画,然后让程序根据挥动力度在这三者间切换就好。&/p&&p&现在我写的是另一个解决方案,即通过代码更新Mesh来实现。&/p&&p&废话不多说,关键代码如下:&/p&&p&首先是计算插值的代码,也是照搬的逍遥剑客的算法:&/p&&div class=&highlight&&&pre&&code class=&language-csharp&&&span class=&k&&private&/span& &span class=&kt&&float&/span& &span class=&nf&&GetCantileverW&/span&&span class=&p&&(&/span&&span class=&kt&&float&/span& &span class=&n&&x&/span&&span class=&p&&,&/span& &span class=&kt&&float&/span& &span class=&n&&L&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&k&&return&/span& &span class=&n&&Mathf&/span&&span class=&p&&.&/span&&span class=&n&&Pow&/span&&span class=&p&&(&/span&&span class=&n&&x&/span&&span class=&p&&,&/span& &span class=&m&&2f&/span&&span class=&p&&)&/span& &span class=&p&&*&/span& &span class=&p&&(&/span&&span class=&m&&3&/span& &span class=&p&&*&/span& &span class=&n&&L&/span& &span class=&p&&-&/span& &span class=&n&&x&/span&&span class=&p&&)&/span& &span class=&p&&/&/span& &span class=&p&&(&/span&&span class=&m&&2&/span& &span class=&p&&*&/span&&span class=&n&&Mathf&/span&&span class=&p&&.&/span&&span class=&n&&Pow&/span&&span class=&p&&(&/span&&span class=&n&&L&/span&&span class=&p&&,&/span& &span class=&m&&3f&/span&&span class=&p&&));&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&p&其次是更新Mesh用到的代码,代码都在注释里我就不废话解释了:&/p&&div class=&highlight&&&pre&&code class=&language-csharp&&&span class=&k&&public&/span& &span class=&k&&void&/span& &span class=&nf&&RefreshRod&/span&&span class=&p&&(&/span&&span class=&kt&&float&/span& &span class=&n&&distance&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&n&&CantileverDistance&/span& &span class=&p&&=&/span& &span class=&n&&distance&/span&&span class=&p&&;&/span&
&span class=&c1&&//第一步,制造一个鱼竿的Mesh&/span&
&span class=&c1&&//1.0,清理数据&/span&
&span class=&n&&RodMesh&/span&&span class=&p&&.&/span&&span class=&n&&Clear&/span&&span class=&p&&();&/span&
&span class=&n&&colors&/span&&span class=&p&&.&/span&&span class=&n&&Clear&/span&&span class=&p&&();&/span&
&span class=&n&&vertices&/span&&span class=&p&&.&/span&&span class=&n&&Clear&/span&&span class=&p&&();&/span&
&span class=&n&&triangles&/span&&span class=&p&&.&/span&&span class=&n&&Clear&/span&&span class=&p&&();&/span&
&span class=&c1&&//1.1,拿到每个节点的长度&/span&
&span class=&c1&&//1.1.1,计算弯曲之后的鱼竿节点&/span&
&span class=&n&&List&/span&&span class=&p&&&&/span&&span class=&n&&Vector3&/span&&span class=&p&&&&/span& &span class=&n&&rodeList&/span& &span class=&p&&=&/span& &span class=&k&&new&/span& &span class=&n&&List&/span&&span class=&p&&&&/span&&span class=&n&&Vector3&/span&&span class=&p&&&();&/span&
&span class=&k&&for&/span& &span class=&p&&(&/span&&span class=&kt&&int&/span& &span class=&n&&i&/span& &span class=&p&&=&/span& &span class=&m&&0&/span&&span class=&p&&;&/span& &span class=&n&&i&/span& &span class=&p&&&&/span& &span class=&n&&RodeCount&/span&&span class=&p&&;&/span& &span class=&n&&i&/span&&span class=&p&&++)&/span&
&span class=&p&&{&/span&
&span class=&n&&rodeList&/span&&span class=&p&&.&/span&&span class=&n&&Add&/span&&span class=&p&&(&/span&&span class=&k&&new&/span& &span class=&n&&Vector3&/span&&span class=&p&&(&/span&&span class=&m&&0&/span&&span class=&p&&,&/span& &span class=&n&&RodeLength&/span& &span class=&p&&*&/span& &span class=&n&&i&/span&&span class=&p&&,&/span& &span class=&n&&CantileverDistance&/span& &span class=&p&&*&/span& &span class=&n&&GetCantileverW&/span&&span class=&p&&(&/span&&span class=&n&&RodeLength&/span& &span class=&p&&*&/span& &span class=&n&&i&/span&&span class=&p&&,&/span& &span class=&n&&RodeLength&/span& &span class=&p&&*&/span& &span class=&p&&(&/span&&span class=&n&&RodeCount&/span& &span class=&p&&-&/span&&span class=&m&&1&/span&&span class=&p&&))));&/span&
&span class=&p&&}&/span&
&span class=&c1&&//1.1.2,由于弯曲之后鱼竿长度会变相增长,所以进行一次缩放&/span&
&span class=&kt&&float&/span& &span class=&n&&realLength&/span& &span class=&p&&=&/span& &span class=&m&&0f&/span&&span class=&p&&;&/span&
&span class=&k&&for&/span& &span class=&p&&(&/span&&span class=&kt&&int&/span& &span class=&n&&i&/span& &span class=&p&&=&/span& &span class=&m&&1&/span&&span class=&p&&;&/span& &span class=&n&&i&/span& &span class=&p&&&&/span& &span class=&n&&RodeCount&/span&&span class=&p&&;&/span& &span class=&n&&i&/span&&span class=&p&&++)&/span&
&span class=&p&&{&/span&
&span class=&n&&realLength&/span& &span class=&p&&+=&/span& &span class=&p&&(&/span&&span class=&n&&rodeList&/span&&span class=&p&&[&/span&&span class=&n&&i&/span&&span class=&p&&]&/span& &span class=&p&&-&/span& &span class=&n&&rodeList&/span&&span class=&p&&[&/span&&span class=&n&&i&/span& &span class=&p&&-&/span& &span class=&m&&1&/span&&span class=&p&&]).&/span&&span class=&n&&magnitude&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&k&&for&/span& &span class=&p&&(&/span&&span class=&kt&&int&/span& &span class=&n&&i&/span& &span class=&p&&=&/span& &span class=&m&&1&/span&&span class=&p&&;&/span& &span class=&n&&i&/span& &span class=&p&&&&/span& &span class=&n&&RodeCount&/span&&span class=&p&&;&/span& &span class=&n&&i&/span&&span class=&p&&++)&/span&
&span class=&p&&{&/span&
&span class=&n&&rodeList&/span&&span class=&p&&[&/span&&span class=&n&&i&/span&&span class=&p&&]&/span& &span class=&p&&*=&/span& &span class=&n&&RodeLength&/span& &span class=&p&&*&/span& &span class=&p&&(&/span&&span class=&n&&RodeCount&/span& &span class=&p&&-&/span& &span class=&m&&1&/span&&span class=&p&&)&/span& &span class=&p&&/&/span& &span class=&n&&realLength&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&c1&&//1.1.3*,绘制顶端到钓块的线&/span&
&span class=&n&&Debug&/span&&span class=&p&&.&/span&&span class=&n&&DrawLine&/span&&span class=&p&&(&/span&
&span class=&n&&fish&/span&&span class=&p&&.&/span&&span class=&n&&transform&/span&&span class=&p&&.&/span&&span class=&n&&position&/span&&span class=&p&&,&/span&
&span class=&n&&transform&/span&&span class=&p&&.&/span&&span class=&n&&TransformPoint&/span&&span class=&p&&(&/span&&span class=&n&&rodeList&/span&&span class=&p&&[&/span&&span class=&n&&RodeCount&/span& &span class=&p&&-&/span& &span class=&m&&1&/span&&span class=&p&&])&/span&
&span class=&p&&);&/span&
&span class=&c1&&//1.2,根据每个节点长度,计算出面片&/span&
&span class=&kt&&float&/span& &span class=&n&&unitEuler&/span& &span class=&p&&=&/span& &span class=&m&&2&/span& &span class=&p&&*&/span& &span class=&n&&Mathf&/span&&span class=&p&&.&/span&&span class=&n&&PI&/span& &span class=&p&&/&/span& &span class=&p&&(&/span&&span class=&kt&&float&/span&&span class=&p&&)&/span& &span class=&n&&SplitCount&/span&&span class=&p&&;&/span&
&span class=&k&&for&/span& &span class=&p&&(&/span&&span class=&kt&&int&/span& &span class=&n&&i&/span& &span class=&p&&=&/span& &span class=&m&&1&/span&&span class=&p&&;&/span& &span class=&n&&i&/span& &span class=&p&&&&/span& &span class=&n&&RodeCount&/span&&span class=&p&&;&/span& &span class=&n&&i&/span&&span class=&p&&++)&/span&
&span class=&p&&{&/span&
&span class=&k&&for&/span& &span class=&p&&(&/span&&span class=&kt&&int&/span& &span class=&n&&j&/span& &span class=&p&&=&/span& &span class=&m&&0&/span&&span class=&p&&;&/span& &span class=&n&&j&/span& &span class=&p&&&&/span& &span class=&n&&SplitCount&/span&&span class=&p&&;&/span& &span class=&n&&j&/span&&span class=&p&&++)&/span&
&span class=&p&&{&/span&
&span class=&kt&&float&/span& &span class=&n&&x1&/span& &span class=&p&&=&/span& &span class=&n&&Radius&/span& &span class=&p&&*&/span& &span class=&n&&Mathf&/span&&span class=&p&&.&/span&&span class=&n&&Sin&/span&&span class=&p&&(&/span&&span class=&n&&unitEuler&/span& &span class=&p&&*&/span& &span class=&n&&j&/span&&span class=&p&&);&/span&
&span class=&kt&&float&/span& &span class=&n&&x2&/span& &span class=&p&&=&/span& &span class=&n&&Radius&/span& &span class=&p&&*&/span& &span class=&n&&Mathf&/span&&span class=&p&&.&/span&&span class=&n&&Sin&/span&&span class=&p&&(&/span&&span class=&n&&unitEuler&/span& &span class=&p&&*&/span& &span class=&p&&(&/span&&span class=&n&&j&/span& &span class=&p&&+&/span& &span class=&m&&1&/span&&span class=&p&&));&/span&
&span class=&kt&&float&/span& &span class=&n&&z1&/span& &span class=&p&&=&/span& &span class=&n&&Radius&/span& &span class=&p&&*&/span& &span class=&n&&Mathf&/span&&span class=&p&&.&/span&&span class=&n&&Cos&/span&&span class=&p&&(&/span&&span class=&n&&unitEuler&/span& &span class=&p&&*&/span& &span class=&n&&j&/span&&span class=&p&&);&/span&
&span class=&kt&&float&/span& &span class=&n&&z2&/span& &span class=&p&&=&/span& &span class=&n&&Radius&/span& &span class=&p&&*&/span& &span class=&n&&Mathf&/span&&span class=&p&&.&/span&&span class=&n&&Cos&/span&&span class=&p&&(&/span&&span class=&n&&unitEuler&/span& &span class=&p&&*&/span& &span class=&p&&(&/span&&span class=&n&&j&/span& &span class=&p&&+&/span& &span class=&m&&1&/span&&span class=&p&&));&/span&
&span class=&n&&AddQuad&/span&&span class=&p&&(&/span&
&span class=&k&&new&/span& &span class=&nf&&Vector3&/span&&span class=&p&&(&/span&&span class=&n&&x1&/span&&span class=&p&&,&/span& &span class=&n&&rodeList&/span&&span class=&p&&[&/span&&span class=&n&&i&/span&&span class=&p&&].&/span&&span class=&n&&y&/span&&span class=&p&&,&/span& &span class=&n&&z1&/span& &span class=&p&&+&/span& &span class=&n&&rodeList&/span&&span class=&p&&[&/span&&span class=&n&&i&/span&&span class=&p&&].&/span&&span class=&n&&z&/span&&span class=&p&&),&/span&
&span class=&k&&new&/span& &span class=&nf&&Vector3&/span&&span class=&p&&(&/span&&span class=&n&&x2&/span&&span class=&p&&,&/span& &span class=&n&&rodeList&/span&&span class=&p&&[&/span&&span class=&n&&i&/span&&span class=&p&&].&/span&&span class=&n&&y&/span&&span class=&p&&,&/span& &span class=&n&&z2&/span& &span class=&p&&+&/span& &span class=&n&&rodeList&/span&&span class=&p&&[&/span&&span class=&n&&i&/span&&span class=&p&&].&/span&&span class=&n&&z&/span&&span class=&p&&),&/span&
&span class=&k&&new&/span& &span class=&nf&&Vector3&/span&&span class=&p&&(&/span&&span class=&n&&x1&/span&&span class=&p&&,&/span& &span class=&n&&rodeList&/span&&span class=&p&&[&/span&&span class=&n&&i&/span&&span class=&p&&-&/span&&span class=&m&&1&/span&&span class=&p&&].&/span&&span class=&n&&y&/span&&span class=&p&&,&/span& &span class=&n&&z1&/span& &span class=&p&&+&/span& &span class=&n&&rodeList&/span&&span class=&p&&[&/span&&span class=&n&&i&/span&&span class=&p&&-&/span&&span class=&m&&1&/span&&span class=&p&&].&/span&&span class=&n&&z&/span&&span class=&p&&),&/span&
&span class=&k&&new&/span& &span class=&nf&&Vector3&/span&&span class=&p&&(&/span&&span class=&n&&x2&/span&&span class=&p&&,&/span& &span class=&n&&rodeList&/span&&span class=&p&&[&/span&&span class=&n&&i&/span&&span class=&p&&-&/span&&span class=&m&&1&/span&&span class=&p&&].&/span&&span class=&n&&y&/span&&span class=&p&&,&/span& &span class=&n&&z2&/span& &span class=&p&&+&/span& &span class=&n&&rodeList&/span&&span class=&p&&[&/span&&span class=&n&&i&/span&&span class=&p&&-&/span&&span class=&m&&1&/span&&span class=&p&&].&/span&&span class=&n&&z&/span&&span class=&p&&)&/span&
&span class=&p&&);&/span&
&span class=&n&&AddQuadColor&/span&&span class=&p&&(&/span&&span class=&n&&Color&/span&&span class=&p&&.&/span&&span class=&n&&gray&/span&&span class=&p&&,&/span& &span class=&n&&Color&/span&&span class=&p&&.&/span&&span class=&n&&white&/span&&span class=&p&&);&/span&
&span class=&p&&}&/span&
&span class=&p&&}&/span&
&span class=&c1&&//1.3,计算上下顶面&/span&
&span class=&k&&for&/span& &span class=&p&&(&/span&&span class=&kt&&int&/span& &span class=&n&&j&/span& &span class=&p&&=&/span& &span class=&m&&0&/span&&span class=&p&&;&/span& &span class=&n&&j&/span& &span class=&p&&&&/span& &span class=&n&&SplitCount&/span&&span class=&p&&;&/span& &span class=&n&&j&/span&&span class=&p&&++)&/span&
&span class=&p&&{&/span&
&span class=&kt&&float&/span& &span class=&n&&x1&/span& &span class=&p&&=&/span& &span class=&n&&Radius&/span& &span class=&p&&*&/span& &span class=&n&&Mathf&/span&&span class=&p&&.&/span&&span class=&n&&Sin&/span&&span class=&p&&(&/span&&span class=&n&&unitEuler&/span& &span class=&p&&*&/span& &span class=&n&&j&/span&&span class=&p&&);&/span&
&span class=&kt&&float&/span& &span class=&n&&x2&/span& &span class=&p&&=&/span& &span class=&n&&Radius&/span& &span class=&p&&*&/span& &span class=&n&&Mathf&/span&&span class=&p&&.&/span&&span class=&n&&Sin&/span&&span class=&p&&(&/span&&span class=&n&&unitEuler&/span& &span class=&p&&*&/span& &span class=&p&&(&/span&&span class=&n&&j&/span& &span class=&p&&+&/span& &span class=&m&&1&/span&&span class=&p&&));&/span&
&span class=&kt&&float&/span& &span class=&n&&z1&/span& &span class=&p&&=&/span& &span class=&n&&Radius&/span& &span class=&p&&*&/span& &span class=&n&&Mathf&/span&&span class=&p&&.&/span&&span class=&n&&Cos&/span&&span class=&p&&(&/span&&span class=&n&&unitEuler&/span& &span class=&p&&*&/span& &span class=&n&&j&/span&&span class=&p&&);&/span&
&span class=&kt&&float&/span& &span class=&n&&z2&/span& &span class=&p&&=&/span& &span class=&n&&Radius&/span& &span class=&p&&*&/span& &span class=&n&&Mathf&/span&&span class=&p&&.&/span&&span class=&n&&Cos&/span&&span class=&p&&(&/span&&span class=&n&&unitEuler&/span& &span class=&p&&*&/span& &span class=&p&&(&/span&&span class=&n&&j&/span& &span class=&p&&+&/span& &span class=&m&&1&/span&&span class=&p&&));&/span&
&span class=&n&&AddTriangle&/span&&span class=&p&&(&/span&
&span class=&k&&new&/span& &span class=&nf&&Vector3&/span&&span class=&p&&(&/span&&span class=&n&&x2&/span&&span class=&p&&,&/span& &span class=&n&&rodeList&/span&&span class=&p&&[&/span&&span class=&m&&0&/span&&span class=&p&&].&/span&&span class=&n&&y&/span&&span class=&p&&,&/span& &span class=&n&&z2&/span& &span class=&p&&+&/span& &span class=&n&&rodeList&/span&&span class=&p&&[&/span&&span class=&m&&0&/span&&span class=&p&&].&/span&&span class=&n&&z&/span&&span class=&p&&),&/span&
&span class=&k&&new&/span& &span class=&nf&&Vector3&/span&&span class=&p&&(&/span&&span class=&n&&x1&/span&&span class=&p&&,&/span& &span class=&n&&rodeList&/span&&span class=&p&&[&/span&&span class=&m&&0&/span&&span class=&p&&].&/span&&span class=&n&&y&/span&&span class=&p&&,&/span& &span class=&n&&z1&/span& &span class=&p&&+&/span& &span class=&n&&rodeList&/span&&span class=&p&&[&/span&&span class=&m&&0&/span&&span class=&p&&].&/span&&span class=&n&&z&/span&&span class=&p&&),&/span&
&span class=&k&&new&/span& &span class=&nf&&Vector3&/span&&span class=&p&&(&/span&&span class=&m&&0&/span&&span class=&p&&,&/span& &span class=&n&&rodeList&/span&&span class=&p&&[&/span&&span class=&m&&0&/span&&span class=&p&&].&/span&&span class=&n&&y&/span&&span class=&p&&,&/span& &span class=&m&&0f&/span&&span class=&p&&)&/span&
&span class=&p&&);&/span&
&span class=&n&&AddTriangleColor&/span&&span class=&p&&(&/span&&span class=&n&&Color&/span&&span class=&p&&.&/span&&span class=&n&&white&/span&&span class=&p&&);&/span&
&span class=&n&&AddTriangle&/span&&span class=&p&&(&/span&
&span class=&k&&new&/span& &span class=&nf&&Vector3&/span&&span class=&p&&(&/span&&span class=&n&&x1&/span&&span class=&p&&,&/span& &span class=&n&&rodeList&/span&&span class=&p&&[&/span&&span class=&n&&RodeCount&/span& &span class=&p&&-&/span& &span class=&m&&1&/span&&span class=&p&&].&/span&&span class=&n&&y&/span&&span class=&p&&,&/span& &span class=&n&&z1&/span& &span class=&p&&+&/span& &span class=&n&&rodeList&/span&&span class=&p&&[&/span&&span class=&n&&RodeCount&/span& &span class=&p&&-&/span& &span class=&m&&1&/span&&span class=&p&&].&/span&&span class=&n&&z&/span&&span class=&p&&),&/span&
&span class=&k&&new&/span& &span class=&nf&&Vector3&/span&&span class=&p&&(&/span&&span class=&n&&x2&/span&&span class=&p&&,&/span& &span class=&n&&rodeList&/span&&span class=&p&&[&/span&&span class=&n&&RodeCount&/span& &span class=&p&&-&/span& &span class=&m&&1&/span&&span class=&p&&].&/span&&span class=&n&&y&/span&&span class=&p&&,&/span& &span class=&n&&z2&/span& &span class=&p&&+&/span& &span class=&n&&rodeList&/span&&span class=&p&&[&/span&&span class=&n&&RodeCount&/span& &span class=&p&&-&/span& &span class=&m&&1&/span&&span class=&p&&].&/span&&span class=&n&&z&/span&&span class=&p&&),&/span&
&span class=&k&&new&/span& &span class=&nf&&Vector3&/span&&span class=&p&&(&/span&&span class=&m&&0&/span&&span class=&p&&,&/span& &span class=&n&&rodeList&/span&&span class=&p&&[&/span&&span class=&n&&RodeCount&/span& &span class=&p&&-&/span& &span class=&m&&1&/span&&span class=&p&&].&/span&&span class=&n&&y&/span&&span class=&p&&,&/span& &span class=&n&&rodeList&/span&&span class=&p&&[&/span&&span class=&n&&RodeCount&/span& &span class=&p&&-&/span& &span class=&m&&1&/span&&span class=&p&&].&/span&&span class=&n&&z&/span&&span class=&p&&)&/span&
&span class=&p&&);&/span&
&span class=&n&&AddTriangleColor&/span&&span class=&p&&(&/span&&span class=&n&&Color&/span&&span class=&p&&.&/span&&span class=&n&&gray&/span&&span class=&p&&);&/span&
&span class=&p&&}&/span&
&span class=&c1&&//1.4,给Mesh赋值&/span&
&span class=&n&&RodMesh&/span&&span class=&p&&.&/span&&span class=&n&&vertices&/span& &span class=&p&&=&/span& &span class=&n&&vertices&/span&&span class=&p&&.&/span&&span class=&n&&ToArray&/span&&span class=&p&&();&/span&
&span class=&n&&RodMesh&/span&&span class=&p&&.&/span&&span class=&n&&triangles&/span& &span class=&p&&=&/span& &span class=&n&&triangles&/span&&span class=&p&&.&/span&&span class=&n&&ToArray&/span&&span class=&p&&();&/span&
&span class=&n&&RodMesh&/span&&span class=&p&&.&/span&&span class=&n&&colors&/span& &span class=&p&&=&/span& &span class=&n&&colors&/span&&span class=&p&&.&/span&&span class=&n&&ToArray&/span&&span class=&p&&();&/span&
&span class=&n&&RodMesh&/span&&span class=&p&&.&/span&&span class=&n&&RecalculateBounds&/span&&span class=&p&&();&/span&
&span class=&n&&RodMesh&/span&&span class=&p&&.&/span&&span class=&n&&RecalculateNormals&/span&&span class=&p&&();&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&p&效果如下:&/p&&img src=&/v2-f880f8c59f7a9e9b789c2_b.png& data-rawwidth=&832& data-rawheight=&464& class=&origin_image zh-lightbox-thumb& width=&832& data-original=&/v2-f880f8c59f7a9e9b789c2_r.png&&&p&&br&&/p&&img src=&/v2-fd16a00feeb_b.png& data-rawwidth=&825& data-rawheight=&534& class=&origin_image zh-lightbox-thumb& width=&825& data-original=&/v2-fd16a00feeb_r.png&&&p&(所以如果不缩放长度,弯曲程度越大则钓竿实际长度会无止境的增加)&/p&&p&这个函数只提供了单一方向的挥动,所以挥动方向由父物体提供,我们要另写一个新的挥杆者计算挥杆方向:&/p&&div class=&highlight&&&pre&&code class=&language-csharp&&&span class=&err&&……&/span&
&span class=&c1&&//由于FPSController的问题,不能从鼠标位置正确的得到旋转的速度,所以直接从GameObject的Rotation上拿&/span&
&span class=&k&&public&/span& &span class=&n&&Transform&/span& &span class=&n&&PlayerTrans&/span&&span class=&p&&;&/span&
&span class=&k&&public&/span& &span class=&n&&Transform&/span& &span class=&n&&CameraTrans&/span&&span class=&p&&;&/span&
&span class=&k&&public&/span& &span class=&n&&FishingRod&/span& &span class=&n&&Rod&/span&&span class=&p&&;&/span&
&span class=&c1&&//挥动系数&/span&
&span class=&k&&public&/span& &span class=&kt&&float&/span& &span class=&n&&Force&/span&&span class=&p&&;&/span&
&span class=&c1&&//偏移累计量&/span&
&span class=&k&&public&/span& &span class=&n&&Vector2&/span& &span class=&n&&Offset&/span&&span class=&p&&;&/span&
&span class=&c1&&//目前偏移量&/span&
&span class=&k&&public&/span& &span class=&n&&Vector2&/span& &span class=&n&&CurOffset&/span&&span class=&p&&;&/span&
&span class=&c1&&//偏移回振力度&/span&
&span class=&k&&public&/span& &span class=&kt&&float&/span& &span class=&n&&Resistance&/span&&span class=&p&&;&/span&
&span class=&c1&&//偏移方向&/span&
&span class=&k&&public&/span& &span class=&n&&Vector3&/span& &span class=&n&&OffsetDir&/span&&span class=&p&&;&/span&
&span class=&c1&&//上次的角度&/span&
&span class=&k&&public&/span& &span class=&n&&Vector2&/span& &span class=&n&&LastAngle&/span&&span class=&p&&;&/span&
&span class=&k&&public&/span& &span class=&kt&&float&/span& &span class=&n&&test&/span&&span class=&p&&;&/span&
&/code&&/pre&&/div&&p&这里有一个问题,那就是我使用的是默认的FpsController,导致不能正确的用Input.mousePosition拿到旋转的方向和速度大小,所以这里我从Player的y轴上取到水平方向的旋转分量,再从Camera的x轴上取到垂直旋转的分量。&/p&&div class=&highlight&&&pre&&code class=&language-csharp&&&span class=&c1&&// Update is called once per frame&/span&
&span class=&k&&void&/span& &span class=&nf&&Update&/span& &span class=&p&&()&/span&
&span class=&p&&{&/span&
&span class=&c1&&//获得当前挥动角度&/span&
&span class=&n&&Vector2&/span& &span class=&n&&nowAngle&/span& &span class=&p&&=&/span& &span class=&k&&new&/span& &span class=&n&&Vector2&/span&&span class=&p&&(&/span&&span class=&n&&PlayerTrans&/span&&span class=&p&&.&/span&&span class=&n&&localRotation&/span&&span class=&p&&.&/span&&span class=&n&&y&/span&&span class=&p&&,&/span& &span class=&n&&CameraTrans&/span&&span class=&p&&.&/span&&span class=&n&&localRotation&/span&&span class=&p&&.&/span&&span class=&n&&x&/span&&span class=&p&&);&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&n&&nowAngle&/span& &span class=&p&&!=&/span& &span class=&n&&LastAngle&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&c1&&//加入最大偏移限制,刚进入游戏会有一个1000+的巨额偏移&/span&
&span class=&n&&Offset&/span& &span class=&p&&+=&/span& &span class=&p&&((&/span&&span class=&n&&nowAngle&/span& &span class=&p&&-&/span& &span class=&n&&LastAngle&/span&&span class=&p&&).&/span&&span class=&n&&magnitude&/span& &span class=&p&&&&/span& &span class=&m&&10f&/span& &span class=&p&&?&/span& &span class=&n&&Vector2&/span&&span class=&p&&.&/span&&span class=&n&&zero&/span& &span class=&p&&:&/span& &span class=&p&&(&/span&&span class=&n&&nowAngle&/span& &span class=&p&&-&/span& &span class=&n&&LastAngle&/span&&span class=&p&&));&/span&
&span class=&p&&}&/span&
&span class=&c1&&//对偏移累积量进行修正&/span&
&span class=&kt&&float&/span& &span class=&n&&temp&/span& &span class=&p&&=&/span& &span class=&m&&1&/span& &span class=&p&&-&/span& &span class=&p&&(&/span&&span class=&n&&Resistance&/span& &span class=&p&&/&/span& &span class=&n&&Offset&/span&&span class=&p&&.&/span&&span class=&n&&magnitude&/span&&span class=&p&&);&/span&
&span class=&n&&Offset&/span& &span class=&p&&*=&/span& &span class=&p&&(&/span&&span class=&n&&temp&/span& &span class=&p&&&=&/span& &span class=&m&&0&/span& &span class=&p&&?&/span& &span class=&n&&temp&/span& &span class=&p&&:&/span& &span class=&m&&0&/span&&span class=&p&&);&/span&
&span class=&c1&&//目前偏移量向累积量进行修正&/span&
&span class=&n&&Vector2&/span& &span class=&n&&offsetBetweenTotalAndCurrent&/span& &span class=&p&&=&/span& &span class=&n&&Offset&/span& &span class=&p&&-&/span& &span class=&n&&CurOffset&/span&&span class=&p&&;&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&n&&offsetBetweenTotalAndCurrent&/span&&span class=&p&&.&/span&&span class=&n&&magnitude&/span& &span class=&p&&&&/span& &span class=&n&&Resistance&/span&&span class=&p&&)&/span&
&span class=&n&&CurOffset&/span& &span class=&p&&=&/span& &span class=&n&&Offset&/span&&span class=&p&&;&/span&
&span class=&k&&else&/span&
&span class=&n&&CurOffset&/span& &span class=&p&&+=&/span& &span class=&n&&offsetBetweenTotalAndCurrent&/span&&span class=&p&&.&/span&&span class=&n&&normalized&/span& &span class=&p&&*&/span& &span class=&n&&Resistance&/span&&span class=&p&&;&/span&
&span class=&c1&&//根据得到的偏移量之模刷新Mesh&/span&
&span class=&n&&Rod&/span&&span class=&p&&.&/span&&span class=&n&&RefreshRod&/span&&span class=&p&&(&/span&&span class=&n&&CurOffset&/span&&span class=&p&&.&/span&&span class=&n&&magnitude&/span& &span class=&p&&*&/span& &span class=&n&&Force&/span&&span class=&p&&);&/span&
&span class=&n&&Rod&/span&&span class=&p&&.&/span&&span class=&n&&transform&/span&&span class=&p&&.&/span&&span class=&n&&localRotation&/span& &span class=&p&&=&/span& &span class=&n&&Quaternion&/span&&span class=&p&&.&/span&&span class=&n&&Euler&/span&&span class=&p&&(&/span&&span class=&k&&new&/span& &span class=&n&&Vector3&/span&&span class=&p&&(&/span&&span class=&m&&0f&/span&&span class=&p&&,&/span& &span class=&p&&-&/span& &span class=&n&&Vector2Angle&/span&&span class=&p&&(&/span&&span class=&n&&CurOffset&/span&&span class=&p&&)&/span& &span class=&p&&-&/span& &span class=&m&&90f&/span&&span class=&p&&,&/span&&span class=&m&&0f&/span&&span class=&p&&));&/span&
&span class=&n&&LastAngle&/span& &span class=&p&&=&/span& &span class=&n&&nowAngle&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&p&好吧,下面就是有问题的代码了,拿到这水平和垂直的旋转分量后我应该能计算出鱼竿的y轴欧拉角,不过不知道为啥总有一个方向挥不动,请大手子指教一下:&/p&&div class=&highlight&&&pre&&code class=&language-csharp&&&span class=&k&&private&/span& &span class=&kt&&float&/span& &span class=&nf&&Vector2Angle&/span&&span class=&p&&(&/span&&span class=&n&&Vector2&/span& &span class=&n&&e&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&c1&&//e.x是水平旋转分量 e.y是垂直旋转分量&/span&
&span class=&kt&&float&/span& &span class=&n&&res&/span&&span class=&p&&;&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&n&&e&/span&&span class=&p&&.&/span&&span class=&n&&y&/span& &span class=&p&&==&/span& &span class=&m&&0f&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&n&&res&/span& &span class=&p&&=&/span& &span class=&n&&e&/span&&span class=&p&&.&/span&&span class=&n&&x&/span& &span class=&p&&&&/span& &span class=&m&&0&/span& &span class=&p&&?&/span& &span class=&m&&0&/span& &span class=&p&&:&/span& &span class=&m&&180f&/span&&span class=&p&&;&/span&
&span class=&n&&print&/span&&span class=&p&&(&/span&&span class=&n&&res&/span&&span class=&p&&);&/span&
&span class=&k&&return&/span& &span class=&n&&res&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&n&&res&/span& &span class=&p&&=&/span& &span class=&p&&(&/span&&span class=&kt&&float&/span&&span class=&p&&)&/span& &span class=&n&&Math&/span&&span class=&p&&.&/span&&span class=&n&&Atan&/span&&span class=&p&&(&/span&&span class=&n&&e&/span&&span class=&p&&.&/span&&span class=&n&&y&/span& &span class=&p&&/&/span& &span class=&n&&e&/span&&span class=&p&&.&/span&&span class=&n&&x&/span&&span class=&p&&);&/span&
&span class=&n&&res&/span& &span class=&p&&=&/span& &span class=&n&&res&/span& &span class=&p&&/&/span& &span class=&n&&Mathf&/span&&span class=&p&&.&/span&&span class=&n&&PI&/span& &span class=&p&&*&/span& &span class=&m&&180&/span&&span class=&p&&;&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&n&&e&/span&&span class=&p&&.&/span&&span class=&n&&y&/span& &span class=&p&&&&/span& &span class=&m&&0&/span&&span class=&p&&)&/span&
&span class=&n&&res&/span& &span class=&p&&=&/span& &span class=&n&&Mathf&/span&&span class=&p&&.&/span&&span class=&n&&Abs&/span&&span class=&p&&(&/span&&span class=&n&&res&/span&&span class=&p&&);&/span&
&span class=&k&&else&/span&
&span class=&n&&res&/span& &span class=&p&&=&/span& &span class=&p&&-&/span&&span class=&n&&Mathf&/span&&span class=&p&&.&/span&&span class=&n&&Abs&/span&&span class=&p&&(&/span&&span class=&n&&res&/span&&span class=&p&&);&/span&
&span class=&n&&print&/span&&span class=&p&&(&/span&&span class=&n&&res&/span&&span class=&p&&);&/span&
&span class=&k&&return&/span& &span class=&n&&res&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&p&我太累了,失眠+写完代码的空虚感……我先出去吃个饭然后睡会,下午还要写自己的东西……&/p&&p&P.S.顺带一提,实际上作为挥动钓竿的约束条件的CantileverDistance,实际上可以用正切函数从挥动角度上拿到的,因为挥动角度更好量化而挥动距离确不行。&/p&&p&P.S.2.还有就是实际上为了保证鱼竿在视野内的效果,在弯曲程度小的时候应该抬高鱼竿,在弯曲程度大的时候应放低鱼竿,保证鱼竿都在视野范围内。&/p&&p&P.S.N.还有一堆的东西,不说了,吃饭了……&/p&&p&===================================================&/p&&p&感谢 &a class=&member_mention& href=&///people/37aea7374636aae4def311& data-hash=&37aea7374636aae4def311& data-hovercard=&p$b$37aea7374636aae4def311&&@逍遥剑客&/a& 提供的公式&/p&&p&感谢&a href=&///?target=http%3A///unity/tutorials/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Unity C# Tutorials&i class=&icon-external&&&/i&&/a&&/p&&p&感谢腾讯GAD的翻译&/p&
先上最终效果 *最后在挥动方面的角度计算仍有问题,有问题的代码放在最后请大手子们指点一下。===================================================昨晚看到了这题,但是觉得可能会上头导致失眠,所以没写,结果还是失眠了……如果要我个人说的话,我建议…
&p&Google是大多数程序员梦寐以求想要进入的公司,那么要如何准备呢?&/p&&h2&1、了解Google的要求——G家面试最看重的是什么?&/h2&&ul&&li&Coding 能力。&/li&&li&对基本数据结构和算法的知识和理解。&/li&&li&解决问题的技巧(和白板练习)。&/li&&li&设计大型分布式系统的能力。&/li&&li&文化适应能力和人际交往能力&/li&&/ul&&h2&2、提升硬实力&/h2&&p&准备进入Google前先让自己成为一个技术过硬的软件工程师。按照Google对面试者的要求,分别给出以下建议:&/p&&ul&&li&&b&编码能力&/b&&/li&&/ul&&p&1.提高你的代码量&/p&&p&最简单的方法就是刷题,你可以去&a href=&///?target=http%3A///zh-cn/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&LintCode - 主页&i class=&icon-external&&&/i&&/a&上刷题,只要你能够把Lintcode上70%的题目刷两遍,60%的题目做到bug free,你的 Coding 能力会有质的飞跃。&/p&&p&2.用你最熟悉的编程语言,来工作和应对面试&/p&&p&面试官能很快发现你对某一种编程语言的熟练程度。你对编程语言的熟练运用可以帮助你你在面试中把更多的精力放在问题本身更深层次的思考和其他问题的解决中。&/p&&ul&&li&&b&对基本数据结构和算法知识的掌握&/b&&/li&&/ul&&p&复习一下数据结构和算法,有针对性有目的性的通过刷题提升,一般面试中会考察一下内容:&/p&&p&&b&算法部分 &/b& &/p&&div class=&highlight&&&pre&&code class=&language-text&&二分搜索 Binary Search
分治 Divide Conquer
宽度优先搜索 Breadth First Search
深度优先搜索 Depth First Search
回溯法 Backtracking
双指针 Two Pointers
动态规划 Dynamic Programming
扫描线 Scan-line algorithm
快排 Quick Sort
&/code&&/pre&&/div&&p&&b&数据结构部分 &/b& &/p&&div class=&highlight&&&pre&&code class=&language-text&&栈 Stack
队列 Queue
链表 Linked List
数组 Array
哈希表 Hash Table
二叉树 Binary Tree
并查集 Union Find
字典树 Trie
&/code&&/pre&&/div&&p&如果想了解最新、最热门的 Google面试题,可以看这里:&a href=&///?target=http%3A///article%3Ftags%3Dinterview-questions%26tags%3Dgoogle& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Google 最新热门面试题及题解&i class=&icon-external&&&/i&&/a&&/p&&ul&&li&&b&算法能力(包括白板做题)&/b&&/li&&/ul&&p&练习和解决编码问题。可以从最基本的开始,然后逐步解决更高级的问题。不过,需要注意,你最好把做题时间控制在30分钟内。因此,反复练习以达到熟能生巧很重要。可以在Lintcode上进行一些IT企业面试真题的训练:&a href=&///?target=http%3A///zh-cn/ladder/2/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&北美IT企业技术面试仿真模拟试题&i class=&icon-external&&&/i&&/a& &/p&&p&此外,练习白板做题也是很有必要的。不少公司在面试时,会直接要求你在白板上写代码。因为大家平常多在编译器上coding,在白板上写代码的时候常常很不适应,错漏百出。所以,强烈建议大家有针对性地练习一下白板coding。&/p&&ul&&li&&b&系统设计能力&/b&&/li&&/ul&&p&如果说,编码能力帮你被选上,那么你的设计技能就是决定你的薪水和水平的关键了。所以,学习分布式系统的基础知识,然后学习如何根据约束条件设计大规模的分布式系统十分重要。&/p&&p&你需要学习:&/p&&ol&&li&容量规划&/li&&li&无状态服务器&/li&&li&SQL和NOSQL&/li&&li&分布式队列&/li&&li&Blob存储&/li&&li&一致性模型(强一致性和最终一致性)&/li&&/ol&&p&建议可以多做做系统设计的面试题,了解系统设计的基本原理,以及设计Instagram、Youtube、设计优步等方面的问题。有条件的话,可以参加一下系统设计的课程,九章算法系统设计班的课程也即将开始,&a href=&///?target=http%3A///course/2/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&免费试听传送门&i class=&icon-external&&&/i&&/a& 。每个月都有免费试听,对于新手小白来说,可以提前了解系统设计的面试内容、如何回答系统设计题、如何设计Instagram、如何设计 Uber 等等。&/p&&h2&3.提高文化适应和人际关系处理能力&/h2&&p&无论你在什么公司,学会更好地与人相处都是很重要的。&/p&&p&因为你必须在团队中工作。学习一些如何在职场应对各种人际关系的技巧,如何和上下级同事相处,如何更加专业化等等,这些职场技能都是必不可少的。公司的雇佣工程师是属于一整个团队的成员。&/p&&p&有时候会出现一些棘手的情况,你和你的团队或者你的经理意见不一致。你需要学会协调,寻找共同的解决意见。&/p&&p&面试时,面试官也会考察你的人际关系处理能力。所以试着在面试前预备一些这种情况的回答,如果你想获得更加专业的面试指导,比如代码风格、薪资谈判、behavior interview 等,可以参考&a href=&///?target=http%3A///article/%3Ftags%3Dguidance& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&《硅谷精英工程师面试指导大全》&i class=&icon-external&&&/i&&/a&&/p&&p&&b&最后,送给各位为梦想奔波努力的各位:&/b&&/p&&p&&b&有志者,事竟成,破釜沉舟,百二秦关终归楚&/b&&/p&&p&&b&苦心人,天不负,卧薪尝胆,三千越甲可吞吴&/b&&/p&&p&&b&欢迎关注我的微信公众号:九章算法(ninechapter ),带你了解IT前沿技术,帮你通过面试,拿到offer,找到好工作!&/b&&/p&
Google是大多数程序员梦寐以求想要进入的公司,那么要如何准备呢?1、了解Google的要求——G家面试最看重的是什么?Coding 能力。对基本数据结构和算法的知识和理解。解决问题的技巧(和白板练习)。设计大型分布式系统的能力。文化适应能力和人际交往能力2、…
&p&回答题主问题之前先看这样一道题:如何判断一个数num是不是2的正整数次幂,比如2、4、8、16……,一般来讲,敲代码学C的同学在这道题的解法上会优于啃书本学C的。&/p&&p&——————————————————————————————————&/p&&p&回到题主的问题,如何学习C语言,在我看来一定要边学边用、理论实践相结合,才能对知识真正掌握牢靠。虽说这都是老生常谈的话题了,但不可否认的是&b&给你一部手机去探索它的功能远比只给你一本手机说明书要好得多&/b&。&/p&&p&很多初学者之所以学C语言有困难,一方面是自己摆脱不了从小到大听课、做题、考试的学习模式,把工科当理科的学了;另一方面也和当下有关C语言的很多教材书籍有关,整本书的示例都只引入&stdio.h&,那可不让人误以为C语言就只能做算术题吗?很多原本兴致高昂,以为学了C就能开发游戏的同学硬是被那个黑框造的一点兴趣都没了。&/p&&p&&b&兴趣和动手一定是学习编程的两大法宝&/b&,显然对于C语言的学习也不例外。所以针对题主的问题,我给的学习步骤如下:&/p&&p&1、&b&了解C语言的基本语法
&/b&推荐K&R的&a href=&///?target=https%3A///subject/1882483/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&C程序设计语言 (豆瓣)&i class=&icon-external&&&/i&&/a&,谭老的书很多人对其颇有微词,我倒是觉得虽然比起“K&R圣经”显得啰嗦,而且还有些错误,但对于只是为了了解基本语法的初学者来说倒也可以接受。&b&比起精确无误,能看懂并坚持下去在一开始比什么都重要!!切忌选一本过厚的书去看,结果八成会是还没开始你就已经放弃了。&/b&这一阶段能了解什么是类型、变量、函数,什么是与或非,什么是if、while、for基本上就可以了。最最最重要的是,一定要动手去敲代码!一定要动手去敲代码!一定要动手去敲代码!同样,忽略书上那些复杂隐晦的示例,30行以内简单明了的就好,什么多维数组、运算符优先级,指向指针的指针……暂时先放一边把;&/p&&p&2、&b&了解C语言可以做什么&/b&
有了一定的语法基础后,理论上而言就可以上手编程了,但如上所述,大部分入门级书籍给的示例都是基于标准输入输出的控制台程序,这对于初学者来说并不能激发学习的兴趣。除了做算术题、给数组排序、交换变量A和B的值……C语言能做的事还有很多。远的不说,利用graphics图形库写个“贪吃蛇”是一种很爽的体验……推荐一个视频教程&a href=&///?target=http%3A///& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&香蕉地--C语言入门了离学会编程还远吗?&i class=&icon-external&&&/i&&/a&。这一阶段切勿贪多图快,踏踏实实动手完成一个专属于你的游戏对自己的兴趣和信心都是极大的提升;&/p&&p&3、&b&进阶学习&/b&
依然用项目驱动的方式去学习,通过Windows API写图片查看器、通过Socket写聊天室软件、通过CGI开发动态网页……当然,除了这些软件项目,买一块开发板,比如Arduino玩玩硬件也是很不错的选择。无论是用graphics库开发小游戏,还是这里提到的各种高阶玩法,在实践的过程中遇到不懂的C语言语法再去深入学习,推荐参考书籍:
&a href=&///?target=https%3A///subject/1240002/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&C Primer Plus (豆瓣)&i class=&icon-external&&&/i&&/a&
英文牛逼可以看原版,很优美
&a href=&///?target=https%3A///subject/2778632/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&C陷阱与缺陷 (豆瓣)&i class=&icon-external&&&/i&&/a&
内容精悍,耐人寻味
&a href=&///?target=https%3A///subject/2377310/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&C专家编程 (豆瓣)&i class=&icon-external&&&/i&&/a&
同样精悍,但需要有Linux经验&/p&&p&—————————————————————————————————— &/p&&p&事实是只有当你动起手来,看到机器的CPU使用率飙升时,才会想到用位运算去判断一个大数是否是2的整数次幂,笔和纸从来都不行。&/p&
回答题主问题之前先看这样一道题:如何判断一个数num是不是2的正整数次幂,比如2、4、8、16……,一般来讲,敲代码学C的同学在这道题的解法上会优于啃书本学C的。——————————————————————————————————回到题主的问题,如…
&p&&b&首先我们先解决一个问题:人为什么要玩游戏?&/b&&/p&&p&根据&b&马斯洛需求层次理论 (&i&Maslow's hierarchy of needs&/i&)&/b& ,人的需求像阶梯一样从低到高按层次分为五种,分别是:生理需求、安全需求、爱与归属的需求、尊重需求和自我实现需求。满足了低阶需求,高阶需求就会成为人的主要驱动力。&/p&&p&而只有少数人能够在现实中达到自我实现。 &/p&&img src=&/v2-5f4cd0a6b0bbae73c49f9_b.jpg& data-rawwidth=&1280& data-rawheight=&720& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&/v2-5f4cd0a6b0bbae73c49f9_r.jpg&&&p&但这些人可以通过游戏的方式找到自我实现的感觉。&/p&&p&在游戏中,有钱的,技术好的,长得漂亮的都会受人尊敬。在现实中的不如意,可以在游戏中找到替代。比如一个“坏”孩子学习不好,但是打游戏特别厉害。在现实生活中,他没有成就感,也不被人尊重。在游戏的世界里,他可以在排行榜上露脸,被其他玩家崇拜,由此得到成就感,达到“自我实现”。&/p&&blockquote&&b&但题主问“为什么有人愿意在游戏做打怪练级这样的重复劳动?”&/b&&/blockquote&&br&&p&重点在「&b&重复」&/b&&/p&&p&&b&“重复”这件事情本身不是很吸引人,除非玩家有明确的目标,能够得到明确的反馈和奖励。&/b&&/p&&p&简单来说,重复打怪能升级。打怪得到的奖品是&b&「奖励」&/b&,&b&「奖励」&/b&能够促使玩家&b&「升级」&/b&,&b&「升级」&/b&能够让玩家排名提前。所以玩家为了提升排名&b&(目标)&/b&,打怪去赢取奖励。基于这样的目的和结果,一个玩家才能「&b&重复」&/b&的去做这件事。&/p&&p&&b&所以,想吸引玩家在游戏中打怪联系,做重复劳动,一定要给玩家一个合理的目标,和合理的奖励。&/b&&/p&&br&&h2&1. 目标是引起行为的最直接动机&/h2&&p&根据&b&目标设定理论(Goal-Setting Theory)&/b&:目标是一个人试图完成的行动的目的。&b&目标是引起行为的最直接的动机&/b&,设置合适的目标会使人产生想达到该目标的成就需要,因而对人具有强烈的&b&激励作用&/b&。重视并尽可能设置合适的目标是激发动机的重要过程(Locke, 1968)。&/p&&br&&p&游戏中的表表设定理论图解如下&/p&&img src=&/v2-890c2783ecdc733b451d5b69cc4be54f_b.png& data-rawwidth=&866& data-rawheight=&579& class=&origin_image zh-lightbox-thumb& width=&866& data-original=&/v2-890c2783ecdc733b451d5b69cc4be54f_r.png&&&ul&&li&&b&第一,明确目标:&/b&玩家在玩游戏的时候要先知道游戏任务是什么,没有明确的目标,玩家行为就没有针对性。&/li&&li&&b&第二,适当的目标难度:&/b&如果一个任务看上去就很难,大部分人会放弃;如果一个任务看上去很简单,大部分人会觉得无聊。目标是玩家通过努力可以达成的,才会激发玩家的成就感,吸引他们去做任务。&/li&&li&&b&第三,适当反馈:&/b&在游戏之后,玩家需要获得奖励或者反馈来告诉玩家表现如何。对奖励满意,玩家才会进行下一次任务。&/li&&/ul&&br&&p&如果用游戏前,游戏中,游戏后来剖析,可以参照以下模型。&/p&&img src=&/v2-1f0b7abbcd7d76bb66e102159daff9db_b.png& data-rawwidth=&1113& data-rawheight=&648& class=&origin_image zh-lightbox-thumb& width=&1113& data-original=&/v2-1f0b7abbcd7d76bb66e102159daff9db_r.png&&&br&&h2&&b&2. 奖励对玩家有意义,能够激励玩家继续游戏&/b&&/h2&&p&根据「操作条件反射」,反馈(奖励)能告诉玩家下一步该怎么做。当玩家完成一个任务,得到的是奖励,他会倾向于多完成此类任务。而反馈也能够增强玩家的成就感。但前提是,这个奖励对玩家是有意义的(meaningful)。&/p&&p&比如,在「超级马里奥兄弟」中,马里奥第一次吃掉蘑菇会长大,隐形多一条命。「红蘑菇」这种奖励在这个游戏中是有用。这对玩家有吸引力,玩家会主动顶问号砖块。&/p&&p&但是,当马里奥已经长大了,也迟到了花拿到了子弹。马里奥吃「红蘑菇」只能加分不能加命,分数的积累是长期的,不能立时见效,玩家吃「红蘑菇」的动机就不如第一次强烈。即使错失也不会太过懊恼。&/p&&br&&p&所以当玩家愿意在游戏中打怪练级做重复劳动时,「明确的目标」和「有意义的奖励」起到了很大的作用。&/p&&h2&&b&3. 实例分析&/b&&/h2&&p&我们可以用这个模型分析&b&MMO手游「剑侠世界&/b&」的副本设置&/p&&p&&b&「剑侠世界&/b&」的副本设置是一个典型的&b&「重复」&/b&劳动。&/p&&img src=&/v2-cb0b75fa04f8b4ba135a789d9f9d9079_b.png& data-rawwidth=&2208& data-rawheight=&1242& class=&origin_image zh-lightbox-thumb& width=&2208& data-original=&/v2-cb0b75fa04f8b4ba135a789d9f9d9079_r.png&&&br&&p&副本每周每个玩家都只能通关一次,五人组队通关。每过一关,会随机掉落0~2件各个门派的装备(一共五个门派)。所以过关的玩家也不一定能获取自己门派的装备,也不能保证每次掉落就是自己需要的装备。因此需要每一周都去刷副本,副本内容不变,这就是典型的&b&「重复」&/b&劳动。&/p&&p&但每周只要是装备没毕业的玩家都回去打副本,为什么大家喜欢这种重复劳动呢?&/p&&p&&b&1)目标感强&/b&&/p&&p&打副本是为了获得装备&/p&&p&&b&2)奖励有用&/b&&/p&&p&获得装备能够极大的提高战力,在战力排行,家族打Boss,5v5 和3v3 的对抗中占得先机。&/p&&p&目标感强,奖励有诱惑性,玩家才能耐住性子,一遍又一遍刷副本。&/p&&br&&p&但是到后期&b&「剑侠世界&/b&」装备掉落概率的问题被广大玩家诟病。有非酋在开副本两个月一件装备也没打到。奖励过度延迟也会导致玩家流失。&/p&&p&这又涉及到如何「延迟奖励」能够勾住玩家,又不至于让玩家弃游的机制了。鉴于与本次问题不是特别相关,我们留到下次再讲。&/p&&p&&b&Reference &/b&&/p&&p&Locke, E. A. (1968). Toward a theory of task motivation and incentives.&i&Organizational behavior and human performance&/i&, &i&3&/i&(2), 157-189.&/p&
首先我们先解决一个问题:人为什么要玩游戏?根据马斯洛需求层次理论 (Maslow's hierarchy of needs) ,人的需求像阶梯一样从低到高按层次分为五种,分别是:生理需求、安全需求、爱与归属的需求、尊重需求和自我实现需求。满足了低阶需求,高阶需求就会…
&p&我是真正零基础开始学Python的,从一开始的一窍不通,到3个月后成功搭建了一个动态网站(没有用任何框架)。相比于计算机大牛,我更加知道一个小白将会遇到什么坑,遇到哪些难点。我把我的学习过程写在下面,并附上在每个阶段的学习资料,希望对零基础的Python学习者有所帮助。&/p&&p&注:本文只做经历分享,不是技术探讨。&/p&&p&&i&---&/i&&/p&在知乎上常常看到想要转行IT,或者是想学习编程但不知如何开始的朋友。回答这类问题的人往往只是列出书单资源然后给出一个大致的方向。有些朋友一开始就扎入了理论学习的汪洋大海,从苦读类似《算法导论》开始,能够坚持读下来的寥寥无几,学习的积极性也被不断的挫败感消磨的所剩无几。&p&一直以来,编程对我而言是一种「黑魔法」般的存在。今年阿里月饼门,当很多人都参与到是非之争的时候,我更加着迷于程序员区区几行代码的脚本所展现出的威力,对于外行而言,这是超乎他们想象之外的某种能力——为什么我守在电脑面前盯着秒针然后拼命点击鼠标都不一定能抢到的礼物,程序员只需要提前花5分钟写3行代码就轻松搞定?&/p&&p&所以,我的心底深处一直都想变成这样的一位魔法师。今年的8月,刚好工作上想要开发一个基于微信的英语学习网站,借此机会,我决定好好学习一下编程。在此之前,我所有关于程序的知识仅仅来源于两部分,一是本科时期的C语言必修课,现在已经忘的一干二净,不过好歹我从中明白编程是怎么回事;第二部分是大概两年前由于工作关系学的一些Python,不过只是皮毛,现在忘的七七八八。&/p&&p&简单说,我的目标是建立一个网站,不过这个网站是动态的,也就是说它能识别谁登陆,然后对不同的人显示不同的内容。而当时的现实是,我完全不明白网页是如何显示出来的?譬如每个人登陆知乎的时候看到的是定制化的页面,后台是如何基于每个ID来组织出不同的页面的?所有我们看到的问题,回答,参与的评论在背后的服务器上是以一种什么样的形式存在的?又比如为什么有些页面只能在微信端打开,在电脑上就会出错?(不知道你有没有发现这一点)&/p&&p&当时我的心中充满了无数个类似的问号?当然如果你也是小白,一定有着同样的疑问。&/p&&p&好处是一开始就明确了学习的目的:Web建站。所以我的学习方案基本就是通过做项目学习,哪里不懂就解决哪里,边做边学习,不断推进。另外,由于知道很多成功的网站在用Python做服务器开发,比如知乎,所以我就自然选择了Python。&br&&/p&&p&于是我就开始了我充满着挫败感和成就感的编程之路……&/p&&p&从8月到12月的四个月里,除去本来的工作,为了学习质量,我会保证平均每天4个小时的学习时间,周末也不例外。另外,所有的文档,问答都尽量看英文的,这可以帮你剩下大量的时间。12月13日,我做的网站上线了,3天时间大概有5000人访问了这个网站,我有时在后台看着日志,不免有些心潮喷涌,我想把自己的经验写下来,希望对于那些有心学习编程但无从下手的朋友提供一些帮助和鼓励。&br&&/p&&h2&1. 我的自学编程之路&/h2&&p&1)基础&br&&/p&&p&刚开始的时候,我对搭建网站一无所知。为了给自己迅速建立一个框架,我在Google上面泡了整整一天,了解了HTML,CSS,JavaScript,Ajax,jQuery,React,SQL,服务器脚本等等知识,不求精通,只是了解每一项技术是干嘛的,另一方面建立起了一个学习的roadmap,这样大概知道做一个Web App需要哪些知识,分别学习的主次顺序。重点推荐两个资源:&/p&&p&Python基础知识:&a href=&///?target=https%3A//learnpythonthehardway.org/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Learn Python the Hard Way&i class=&icon-external&&&/i&&/a&&/p&&p&Web App基础知识:@张秋怡的&a href=&/question//answer/& class=&internal&&答案&/a&写的通俗易懂,极力推荐。&/p&&p&有了这个roadmap,我明白了前端三大必须掌握技能HTML,CSS和JavaScript,花了大概10天左右把W3Schools上的教程全部过了一遍,然后试着写了几个网页,感觉自己写的很没有底气。于是根据知乎和豆瓣上的推荐,买了《JaveScript DOM》和《Head First HTML与CSS》,边看书边把例子过了一遍。&/p&&p&W3Schools: &a href=&///?target=http%3A///link%3Furl%3DIYCvCXzSkGQLt7ulZZFmBNaPMEd_6GSSHjvs-BKvWu-oYzYfW7aAUyj8JGqiQpVB& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&/&i class=&icon-external&&&/i&&/a&&/p&&p&JavaScript:&a href=&///?target=https%3A///subject/1921890/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&JavaScript DOM编程艺术&i class=&icon-external&&&/i&&/a&&/p&&p&HTML & CSS : &a href=&///?target=https%3A///subject//& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Head First HTML与CSS(第2版)&i class=&icon-external&&&/i&&/a&&/p&&p&前端是需要慢慢学习的,在看完上面的资料后,虽然能写出来一些挺漂亮的页面,但是我自己知道很多都是不符合标准的,更不要说代码风格什么的。这只能通过不断地积累和增加代码量来提高。由于明白服务器端需要耗费自己大量的时间,所以在发现自己能够按照构思勉强实现网页之后,我就把学习中心放到了服务器端上。不过每天还是会抽空写一写网页,避免手生。&/p&&p&2)服务器端&/p&&p&最先了解的是HTTP协议,也就是浏览器和服务器之间是如何通信的。也就是当你在浏览器里键入网址按下回车直到网页显示在你浏览器的这个过程中,浏览器和浏览器之间发生了什么事情。这是很有意思的内容,我是以读小说的心情了解了这部分内容。了解这部分后,你就会明白类似为什么有时候会有404页面?在百度搜索框里键入的搜索词是如何提交到百度服务器的?为什么重新登录知乎的时候就不用再输入密码了?之类的问题了。&/p&&p&HTTP协议学习资料:&a href=&///?target=https%3A//www.ntu.edu.sg/home/ehchua/programming/webprogramming/HTTP_Basics.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&In Introduction to HTTP Basics&i class=&icon-external&&&/i&&/a&&/p&&p&&a href=&///people/a179aa706eacbd2f7088& data-hash=&a179aa706eacbd2f7088& class=&member_mention& data-title=&@Vamei& data-editable=&true& data-hovercard=&p$b$a179aa706eacbd2f7088&&@Vamei&/a&的博客:&a href=&///?target=http%3A///vamei/archive//2802811.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&协议森林&i class=&icon-external&&&/i&&/a&&/p&&p&了解了HTTP协议之后,我就多少有些入迷了。看似神秘难懂的现象其实原理并不复杂,你反而会被吸引。接下来就进入到我投入时间最多的部分了——后端开发。记得当时了解Web开发的MVC(Model-View-Controller)模式后,有一种心血喷涌的感觉,觉得太有意思了(程序员别喷,我就是这么没见过世面)。我们以知乎为例子来说明MVC是个啥:&/p&&img src=&/v2-0f9a88b7e281cc7ffd5e_b.png& data-rawwidth=&1029& data-rawheight=&623& class=&origin_image zh-lightbox-thumb& width=&1029& data-original=&/v2-0f9a88b7e281cc7ffd5e_r.png&&&br&&p&每个人的主页都是相同的布局和风格,例如最上面的菜单搜索栏,颜色分割,左边显示动态等,右边是个人信息等,然后具体的内容却因人而异——每个人的头像,名字,动态都是不一样的。那么知乎是如何保证每一个人看到的都是自己的主页呢?&/p&&p&你可以把这个相同的布局想象成一个模板,里面有一个个空格子,当你用你的账户登陆页面时,想象你的电脑里有无数个小人根据你的账号从知乎后台的数据库里取出你的头像,动态,认证信息等等内容,然后对应着模板上规定好的位置,把对应的内容填进去。这些小人的动作实在是太快了,以至于你觉得这是在瞬间完成的。&/p&&p&上面所说的模板就是MVC中的V,是View的缩写,负责显示。这样做的好处在于,如果知乎有一天突然想改变一下个人主页的风格,那么只需要改变这一个模板,然后几千万注册用户的主页就相应的变化了,因为模板是公用的,是不是省了很多事情?(早期的Web开发可不是这样哟,你可能要一个个用户去改,非常麻烦。)&/p&&p&而这些小人除了摆放内容,它们真正负责的是业务逻辑,我们把他们叫做Controller,也就是MVC中的C。例如当你登陆的时候,这些小人要检查你的用户名是不是准确的,如果准确,它们要去数据库里取出你请求的信息等,如果用户名错误,它们要拦截住你的登陆。它们的职责还有很多,无法一一列举。在实际中,这些小人做的事情其实就是Python(或者其它脚本语言)做的事情。&/p&&p&最后,MVC中的Model其实就是传给View的数据,包括上面的头像,用户名,动态等因人而异的数据。这些数据在知乎服务器上是以数据库表格(table)的形式存在的,你可以把它们想象成很多不同的excel表格,不同的表格储存着不同的信息,有些记录着知乎用户的个人信息,有些记录着回答,有些记录着评论等等,而这些表格之间又彼此联系,当你在知乎的不同网页间跳转的时候,上面说的那些小人就根据你的要求,组合对应的表格取出对应的数据,然后把他们放到模板对应的空格里,发送给浏览器。然后浏览器根据你写的CSS,用不同的颜色,大小等等,将数据很漂亮的显示出来。&/p&&p&这样做的好处是什么呢?虽然你最终在浏览器里看到的是一个完整的页面,但是在后端逻辑上它们都是区分开的——模型(M),视图(V)和控制器(C)的区分就保证了较高的可维护性——我可以随时修改主页的显示并看到效果,同样我可以随时加入一些业务逻辑。&/p&&p&如果你的学习坚持到这里了,首先要恭喜你。其次你可能已经知道一些非常成熟的Python Web框架了,例如Django,Flask等等,并且你可能看到了很多小白教程教你直接使用,毕竟大部分人可能觉得没有必要重复造轮子。&/p&&p&本来为了省事,我也打算直接用框架。我是在设计数据库的时候,当时在看SQLAlchemy文档,觉得相对自己的项目SQLAlchemy太过复杂,所以我决定自己写自己的ORM(名词不懂没关系),这对于当时的我来说是一件难度非常大的事情。于是我投入了极大的精力每天都在看关于SQL和Python相关的教程和资料,&a href=&///?target=https%3A///subject/3112503/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Python核心编程(第二版) &i class=&icon-external&&&/i&&/a&给了我很大的启发。在自己完成了ORM后,又写了URL处理函数,同样没有用任何现成的Web框架。&/p&&p&现在回头看,我认为这一段时间的造轮子是提升编程能力最快的时候。比如为了写ORM,就必须去花很多时间学习SQL,去了解Python里面的metaclass,而如果用一个现成的框架,我很有可能偷懒不去关注某些细节。而不出问题还好,一旦出问题,我就只能跪。另外,造轮子迫使我在开始的时候就构思整个框架,因为我必须尽可能的考虑到所有的情况,于是就会不断的强迫自己完善知识体系,和别人的代码作对比从而改进自己的,这个过程充满了无尽的挫败感,但是得来的成就和快乐也是无可比拟的。&/p&&p&SQL书籍:&a href=&///?target=https%3A///Sams-Teach-Yourself-MySQL-Days/dp/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Sams Teach Yourself MySQL in 21 Days&i class=&icon-external&&&/i&&/a&&/p&&p&Python:&a href=&///?target=https%3A///subject/3112503/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Python核心编程(第二版)&i class=&icon-external&&&/i&&/a&&/p&&p&Github上的优质Python资源:&a href=&///?target=https%3A///CodementorIO/Python-Learning-Resources& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&CodementorIO/Python-Learning-Resources&i class=&icon-external&&&/i&&/a&&/p&&p&过程中还牵涉到部署,我的网站是跑在Linux上的。关于部署网上有非常多的优质教程,一搜一大把。这里就不再赘述。&/p&&p&这些是我学习大致路线,当然过程中充满着小的磕磕绊绊,虽然网站上线了,貌似运行还比较顺利,但是如果以一个程序员的标准来要求自己,自己依然非常菜鸟。不过我并没有以前那样惧怕技术了,就像你明白魔术的背后的原理后,会更多的思考原理本身。&/p&&h2&2. 自学编程需要注意的问题&/h2&&p&很多人都推荐小白第一门语言选Python,因为语法简单。这句话只说了一半,Python确实容易上手,对初学者的门槛很低。但我发现,&b&&u&对于小白真正的门槛在于系统知识,这就和用什么语言完全没有任何关系了。&/u&&/b&例如很多人学完了Python的语法,觉得确实简单,但是转头去用Python标准库的时候,却发现自己连文档都看不懂。标准库提供了Python和其它系统功能的接口,最终实现了Python和系统之间的互动。读标准库需要系统知识,比如操作系统,数据库,进程和线程,socket编程,网络协议等等,这些对于编程小白来才构成很高的门槛,但是只有学会这些,才能真正发挥出Python的威力来。&/p&&p&这也是我觉得自己的经历对小白是有价值的一个原因。因为设计一个动态的网页是一个很不错的练手Project。建立网页(Web App)会逼迫你了解从你在浏览器里键入地址按下回车到网页显示在浏览器的过程中,浏览器,网络,服务器都干了些什么。具体到技术上面,你不得不去学习前端的HTML,CSS和JavaScript,后端的脚本,数据库,操作系统等。也就是说,这个过程能够促使你去主动学习上面提到的系统知识,如果你再做另外一个项目,你就不会像现在这样无从下手,而有能力去进行一些技术性的探讨,所以我认为这是一个非常好的练手项目。&br&&/p&&p&1)一定要空出时间补充理论知识&/p&很多人会强调learn by doing,边做项目边学习,这也是我自己采用的方式。在这种方式中,你不断犯错,改正……学习效率非常高。但是,很多人走了极端,最后的结果就是不注意理论知识的学习。你会发现自己Google的能力越来越高,但是真实的编程能力并没有得到提升。如果有这种情况,你需要反思一下。&p&一种可能是你太过于依赖各种成熟的框架,结果编程就变成了用「胶水」去粘合不同的框架完成需求。就好比你的Web App用了SQLAlchemy,虽然自己不太懂SQL,但是网站跑的也还不错。这时候如果数据库出现了问题,那你就只能跪了。&/p&&p&另外一种可能是你完全沉浸在做项目中,忽略了学习理论知识。做项目虽然充满困难,但回报是强烈的成就感,很容易沉浸其中。我觉得这是极其错误的。首先半路出家的程序员都没有经过系统的学习,没有形成自己的知识体系,如果你不懂数据结构,算法复杂度,操作系统这些理论,那么你能达到的高度就极其有限。所以,在每天做项目的同时,一定要保证抽出一定的时间,恶补理论知识。这部分的书单在豆瓣和知乎上都有很多总结,可以自行搜索。&/p&&p&2)不要太纠结于无意义的问题,比如什么框架好,XX语言比XX语言好啦这种问题。前期确定了练手项目,就去专心积累代码量,积累基础知识。那些你现在还看不懂的炫酷技术你慢慢也就能明白是怎么回事了,反而没有基础,再炫酷的框架对你而言都是天书。&/p&&p&3)学会发问。好问题是建立在你自己已经实践或者思考的基础上问出来的,这是对自己的负责,也是对别人的尊重。不要一遇到困难就喜欢直接上网搜索:「这个问题是怎么回事啊?」,「我不明白你能不能帮我看看……」。&/p&&p&4)学好英语。&/p&&p&THE END&/p&&br&&p&最后,给自己打个广告,如果学英语,一定要关注我。&/p&&p&&a href=&///?target=http%3A///r/ETt0bGzEkzHsrSgP924D& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&/r/ETt0bGz&/span&&span class=&invisible&&EkzHsrSgP924D&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a& (二维码自动识别)&/p&
我是真正零基础开始学Python的,从一开始的一窍不通,到3个月后成功搭建了一个动态网站(没有用任何框架)。相比于计算机大牛,我更加知道一个小白将会遇到什么坑,遇到哪些难点。我把我的学习过程写在下面,并附上在每个阶段的学习资料,希望对零基础的Pyt…
&p&你把自己定位为码农,这就错了!&/p&&p&&b&要把自己定位为解决某一类问题的人&/b&。&/p&&p&只有这种定位,才能支持你的未来十年、二十年、三十年。&/p&&p&当你想要解决某类问题,如果撰写转件可以解决,那你就去撰写软件。当你想要解决的问题,一台风扇可以解决,那你就搞一台风扇来。当你要解决的问题,写一篇文章可以解决,那就去写文章。当你要解决的问题,花点钱找别人帮忙可以搞定,那就花点钱。&/p&&p&软件开发只是解决问题的一种手段,而已。&/p&&p&当你通过软件开发具备了解决问题的能力和思维,就不必一直背着它。你见过谁乘舟过河之后,一直把舟背在背上的吗?&/p&
你把自己定位为码农,这就错了!要把自己定位为解决某一类问题的人。只有这种定位,才能支持你的未来十年、二十年、三十年。当你想要解决某类问题,如果撰写转件可以解决,那你就去撰写软件。当你想要解决的问题,一台风扇可以解决,那你就搞一台风扇来。当…
&img src=&/50/v2-aaaa2e7f6a49c536aa6291_b.jpg& data-rawwidth=&1920& data-rawheight=&1080& class=&origin_image zh-lightbox-thumb& width=&1920& data-original=&/50/v2-aaaa2e7f6a49c536aa6291_r.jpg&&&p&本专栏是着重于讨论“&b&开发一款游戏需要怎样的能力&/b&”,以及“&b&如何学习开发游戏所需的所有技能&/b&”。欢迎来到知乎专栏《&b&自学游戏开发&/b&》的第二篇文章。在开始讨论我们的两个主题之前,我认为非常有必要让初学者了解一下:&b&一个游戏是如何被设计和开发完成的。 &/b&&/p&&p&温馨提示:本文共28900字,包括50张配图,40段视频,建议先收藏再阅读。为了保证阅读体验,建议在桌面浏览器环境下阅读。&/p&&br&&p&我在知乎回答“&a href=&/question//answer/?group_id=941376& class=&internal&&想要自己做一款游戏,需要学习哪些知识&/a&”下面简单列举了四个能力,分别是:程序、设计、美术、音乐。但是碍于篇幅限制,我并没有详细展开来说明每一项能力具体是如何发挥作用,以及发挥作用的形式和功效。如果在学习之前,我们对即将学习的东西一无所知的话,会导致学习中产生不小的迷茫感:不知道为何而学,不知道学了有什么作用,不知道该学习到什么程度。带着这样的迷茫去学习,会导致学习效率低下,容易受挫,甚至会在达到一定程度后动摇自己理想,怀疑自己的学习能力是否有问题。作为以“&b&引导自学游戏开发&/b&”为使命的一个专栏,我认为非常有必要解除初学者对于游戏开发的朦胧认识。这也是&b&自学游戏开发&/b&专栏第二篇文章的意义之所在,让初学者了解:&/p&&ul&&li&&b&一个常规的游戏开发团队有哪些人,每个人具备怎样的能力&br&&/b&&/li&&li&&b&一个游戏从最初构想到最终完成开发,会经过一个怎样的过程&/b&&/li&&li&&b&团队中的每个人在游戏开发过程中的什么时间,发挥了怎样的作用&/b&&/li&&/ul&&br&&p&在了解完以上三个问题以后,我们会对自己的情况做一个判断,根据自己的情况,再对未来的方向做一个规划。比如说,你是一个喜欢画画的人,想从事游戏相关的美术工作,那么你就应该知道不同的美术工作在游戏开发流程的哪一步需要画什么样的东西 做什么样的美术资源,设计师和技术人员拿到你做的美术资源又会加以怎样的修改和使用,你在后面的学习中应该着重练习哪方面的技术和能力;再比如说,你想成为像我一样技能覆盖面比较广,各个方面都知道一点的开发者,那么你应该如何去组织你的技能,在众多的技能中考虑到你的性格和你的特长,你更喜欢亲自做哪一项工作内容,应该选取哪个作为核心能力,如果今后不做独立开发而是进游戏公司工作,你会站在哪个位置工作?在阅读完本篇的正文后,你会开始思考这些问题,并尽快找到一个大致的答案。&/p&&p&预先了解我们即将从事的工作,预先概览我们即将学习的知识,这件事对于引导我们前进有重大的意义。为了完成这个环节,我从第一篇文章发布后到现在一直都在筹备此事(边看春晚边做配图)。要让任何一个从没接触过游戏开发的人,在一篇文章的篇幅内了解整个游戏开发的全过程,这件事情真的是非常难。我认为真正要做好这件事情,需要一个纪录片的工作量。要完整地记录下一个游戏从设计师的头脑中 转换到电脑中的过程,然后展现给别人。我本人的搜索能力有限,到目前为止并没有找到一个非常理想的此类纪录片,但是在知乎问题 “&a href=&/question/& class=&internal&&有哪些介绍游戏开发过程的纪录片或视频?&/a&” 下面,&a href=&/people/ccaaa2aa1492& data-hash=&ccaaa2aa1492& class=&member_mention& data-title=&@windleavez& data-hovercard=&p$b$ccaaa2aa1492& data-editable=&true&&@windleavez&/a& 的回答中有非常多零

我要回帖

更多关于 如何实现弹性滑动 的文章

 

随机推荐