ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
上一篇我们仅仅是创建了场景和主角,暂时不具备任何玩法。 这次,我们来看看怎么让主角移动起来。 > 笨木头花心贡献,啥?花心?不,是用心。 > 转载请注明,原文地址:[http://www.benmutou.com/archives/2131](http://www.benmutou.com/archives/2131) > 文章来源:[笨木头与游戏开发](http://www.benmutou.com/blog/) ### 1.Update,又是Update 似乎[游戏开发](http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=18&is_app=0&jk=a5cc34bc97dc9175&k=%D3%CE%CF%B7%BF%AA%B7%A2&k0=%D3%CE%CF%B7%BF%AA%B7%A2&kdi0=0&luki=4&n=10&p=baidu&q=25013069_cpr&rb=0&rs=1&seller_id=1&sid=7591dc97bc34cca5&ssp2=1&stid=0&t=tpclicked3_hc&td=1682305&tu=u1682305&u=http%3A%2F%2Fwww%2Ebenmutou%2Ecom%2Farchives%2F2131&urlid=0)里总是无法离开Update,我现在的工作不是游戏开发,没法使用Update,导致我非常不习惯。 Update是什么?我们把游戏想象成一个大的while循环,每一次循环都会调用一次Update函数。 而我们就可以在Update函数里做一些乱七八糟的事情。 比如,每一次Update就让角色的x坐标+1,于是,很多次Update的调用连起来之后,角色就在移动了。 总而言之,Update是我们经常会用到了,很重要的东西,这里不多解释了。 ### 2.别急,先给BugPlayer上色 因为BugPlayer现在是白色,不方便演示,我们就先来给它上色吧。 在【Project】创建右键,依次点击【Create】->【Material】,命名为PlayerMaterial。 这样就创建了一个材质,接着修改材质的颜色,然后把材质拖到BugPlayer身上,如: ![u006_3.gif](https://box.kancloud.cn/2016-06-06_575541ae993c9.gif) 由于我在录制Gif之前就已经把材质拖到BugPlayer身上了,所以这一步我就没演示了,和拖脚本是一毛一样的。 ### 3.前后移动 OK,要开始移动了,跟紧了。 打开BugPlayerLogic脚本,修改Update[函数](http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=18&is_app=0&jk=a5cc34bc97dc9175&k=%BA%AF%CA%FD&k0=%BA%AF%CA%FD&kdi0=0&luki=5&n=10&p=baidu&q=25013069_cpr&rb=0&rs=1&seller_id=1&sid=7591dc97bc34cca5&ssp2=1&stid=0&t=tpclicked3_hc&td=1682305&tu=u1682305&u=http%3A%2F%2Fwww%2Ebenmutou%2Ecom%2Farchives%2F2131&urlid=0),现在脚本的内容应该是这样的: 1. ~~~ public class BugPlayerLogic : MonoBehaviour {    void Start () { }       void Update ()    {        if (Input.GetAxis("Vertical") != 0)        {            this.gameObject.transform.position += this.gameObject.transform.forward * Input.GetAxis("Vertical");        }    }} ~~~ Input类用于获取各种输入,包括键盘、鼠标等。 而Input.GetAxis(“Vertical”)代表获取垂直方向上的输入,在电脑上就是W和S键,分别代表正负方向。 下面一一解释: A. this.gameObject 我们要注意了,BugPlayerLogic是一个脚本,它是BugPlayer身上的一个组件,并不是BugPlayer本身。 所以,我们要通过this.gameObject来获取当前脚本所属的obj对象。 理论上来说,一个组件只能有一个GameObject,但由于我是[新手](http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=18&is_app=0&jk=a5cc34bc97dc9175&k=%D0%C2%CA%D6&k0=%D0%C2%CA%D6&kdi0=0&luki=1&n=10&p=baidu&q=25013069_cpr&rb=0&rs=1&seller_id=1&sid=7591dc97bc34cca5&ssp2=1&stid=0&t=tpclicked3_hc&td=1682305&tu=u1682305&u=http%3A%2F%2Fwww%2Ebenmutou%2Ecom%2Farchives%2F2131&urlid=0),所以,不敢乱说。 B. transform GameObject的transform是什么呢?这个最简单了,就是obj对象的位置属性,包括坐标、旋转角度、缩放。 C. transform.position 既然transform包括坐标属性,position自然就是它的坐标属性了。 那么,this.[game](http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=18&is_app=0&jk=a5cc34bc97dc9175&k=game&k0=game&kdi0=0&luki=3&n=10&p=baidu&q=25013069_cpr&rb=0&rs=1&seller_id=1&sid=7591dc97bc34cca5&ssp2=1&stid=0&t=tpclicked3_hc&td=1682305&tu=u1682305&u=http%3A%2F%2Fwww%2Ebenmutou%2Ecom%2Farchives%2F2131&urlid=0)Object.transform.position += XXX; 又是什么鬼? 这代表给坐标加上一个坐标,比如我当前坐标是(10,0),加上(1,0)就变成了(11,0)了。 当然,由于这是3D坐标,实际上是有X、Y、Z的。 (Z:特么的我终于不用被忽略了) (小若:不,它举例的时候还是特意的完全把你忽略了。) 特么的,我是“他”,不是“它”! D. transform.forward 这个forward又是什么呢?顾名思义,它是物体的正方向、正前方。 物体的正前方就是它的Z轴的方向,当我们希望物体忘正前方移动的时候,当然就是要加上正前方的坐标了。 而this.[game](http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=18&is_app=0&jk=a5cc34bc97dc9175&k=game&k0=game&kdi0=0&luki=3&n=10&p=baidu&q=25013069_cpr&rb=0&rs=1&seller_id=1&sid=7591dc97bc34cca5&ssp2=1&stid=0&t=tpclicked3_hc&td=1682305&tu=u1682305&u=http%3A%2F%2Fwww%2Ebenmutou%2Ecom%2Farchives%2F2131&urlid=0)Object.transform.forward * Input.GetAxis(“Vertical”),就是让这个正前方的位移更大一些(根据输入的值来变化)。 关于坐标,应该也是需要研究一番的,我目前还没很熟悉,所以,不多了,免得误导了大家。 OK,总而言之,你记住,向前和向后移动,就是上面那一句代码。 来看看效果: ![u006_4.gif](https://box.kancloud.cn/2016-06-06_575541aed7262.gif) 大家实际上可能会发现,按w键的时候,它往后移动了,这是因为我们的摄像机正对着BugPlayer的正方向了。 停止运行[游戏](http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=18&is_app=0&jk=a5cc34bc97dc9175&k=%D3%CE%CF%B7&k0=%D3%CE%CF%B7&kdi0=0&luki=2&n=10&p=baidu&q=25013069_cpr&rb=0&rs=1&seller_id=1&sid=7591dc97bc34cca5&ssp2=1&stid=0&t=tpclicked3_hc&td=1682305&tu=u1682305&u=http%3A%2F%2Fwww%2Ebenmutou%2Ecom%2Farchives%2F2131&urlid=0),把BugPlay旋转一下: ![u006_5.gif](https://box.kancloud.cn/2016-06-06_575541aeee3fb.gif) 按下快捷键E就可以进入到旋转模式(或者点击左上方的旋转按钮),我们要绕着Y轴旋转,所以要按住绿色的那条圈,然后拖动鼠标。 大家自己尝试吧,习惯就好了。 ### 4.左右旋转 特么的主角当然不能只会前进后退了,还得左右转向。 这个更简单,打开BugPlayerLogic脚本,继续修改Update[函数](http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=18&is_app=0&jk=a5cc34bc97dc9175&k=%BA%AF%CA%FD&k0=%BA%AF%CA%FD&kdi0=0&luki=5&n=10&p=baidu&q=25013069_cpr&rb=0&rs=1&seller_id=1&sid=7591dc97bc34cca5&ssp2=1&stid=0&t=tpclicked3_hc&td=1682305&tu=u1682305&u=http%3A%2F%2Fwww%2Ebenmutou%2Ecom%2Farchives%2F2131&urlid=0): 1. ~~~   void Update ()    {        /* 旋转镜头 */        if (Input.GetAxis("Horizontal") != 0)        {            transform.Rotate(new Vector3(0, Input.GetAxis("Horizontal"), 0));        }        if (Input.GetAxis("Vertical") != 0)        {            //this.gameObject.transform.position += this.gameObject.transform.forward * Input.GetAxis("Vertical") * 10 * Time.deltaTime;            this.gameObject.transform.position += this.gameObject.transform.forward * Input.GetAxis("Vertical");        }    } ~~~ 既然Input.GetAxis(“Vertical”)是获取垂直方向上的输入,那么,Input.GetAxis(“Horizontal”)自然就是获取水平方向的输入了。 在选中BugPlayer的时候,我们就能看到它的三个方向的箭头: ![](https://box.kancloud.cn/2016-06-06_575541af32044.jpg) 看看箭头的颜色,再对比右上角的XXX(小若:XXX是什么鬼啊?) 我不知道右上角的那个XXX叫什么名字,叫做方向图例?随便吧。 总之,看看不同颜色的箭头,分别标注了X、Y等文字,代表这个颜色的箭头是哪个方向的。(Z:别烦我,我想静静地思考一下…特么的我就这么让作者讨厌?) 很明显,BugPlayer的垂直方向是Y轴,如果我们要旋转BugPlayer,是不是应该绕着Y轴旋转? 千万不要告诉我,因为是水平方向的旋转,所以要绕着X轴或者Z轴什么的,我不想和你们说话。 于是,代码中的tranform.rotate就是用来旋转物体的,而Vector3代表的是三维坐标,由于只需要旋转Y轴,所以X和Z的值都是0. OK,运行[游戏](http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=18&is_app=0&jk=a5cc34bc97dc9175&k=%D3%CE%CF%B7&k0=%D3%CE%CF%B7&kdi0=0&luki=2&n=10&p=baidu&q=25013069_cpr&rb=0&rs=1&seller_id=1&sid=7591dc97bc34cca5&ssp2=1&stid=0&t=tpclicked3_hc&td=1682305&tu=u1682305&u=http%3A%2F%2Fwww%2Ebenmutou%2Ecom%2Farchives%2F2131&urlid=0),看看效果: ![u006_6.gif](https://box.kancloud.cn/2016-06-06_575541af4df50.gif) 不好意思,这车倒得有点歪了,没关系…车位挺多的… ### 5.待续 好了,本篇到此结束。 下一篇,我们来玩些什么呢,要不,我们开始在场景里设置一些奇怪的东西吧? 本篇源码:[Unity_benmutou_007](http://www.benmutou.com/wp-content/uploads/2015/11/Unity_benmutou_007.7z)