脸上白癜风 http://m.39.net/pf/a_4530985.html这次是使用Unity制作山寨阉割版《SuperMario》
先上成果:
接下来介绍一下如何制作
(素材使用的是网上白嫖大法)
这次主要涉及几个知识点
碰撞器及碰撞检测
角色控制
动画及其触发
碰撞器及碰撞检测
[碰撞器]:顾名思义将对象赋予碰撞器组件就能够与其他同样拥有碰撞器组件的对象发生碰撞,否则当两个游戏物体接触时若其中一方没有碰撞器,则会出现穿模的现象。
分类:
一目了然,可以根据实际情况需要选择
所以在我们角色玛丽奥相碰撞的物体上我们都要添加碰撞器,如地板、烟囱、金币、怪物等。(这是一块普通的地板砖,选择的是2d盒型碰撞器)
其中要注意的是“是触发器”的选项。若勾选该选项,则物体将会变成触发器,当其他碰撞体与之相碰时并不会产生阻挡,而是触发相应的触发器事件。
[碰撞检测]:当两个有碰撞器的对象碰撞时,对象能够检测到碰撞,进而触发相应的事件,分别是OnCollisionEnter和OnCollisionExit,而若是触发器的话则是OnTriggerEnter和OnTriggerExit分别是在碰撞/触发产生时和结束时。(若是2d物体方法名后面要加上2D)
因此,我们先将相应的素材放到场景
当中并给地板、角色、怪物、金币、烟囱添加合适的碰撞器。
这里金币勾选“是触发器”,因为金币无需与角色发生真正碰撞。
角色控制和刚体
赋予了刚体组件的物体,将会具备物理属性,能够收到力的作用而产生相应的运动。这里的角色控制使用的是刚体组件。
(Unity同样还有“角色控制器”组件,但是“角色控制器”和“刚体”同时使用会出大问题,我觉得刚体受力运动更加丝滑,所以只使用了“刚体”,角色控制部分通过代码实现。)
接着给角色添加代码
usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;publicclassPlayeControl:MonoBehaviour{publicGameObjectplayer;publicRigidbody2DP;publicfloatplayerSpeed=10;publicboolfacingRight=true;publicintplayerJumpPower=;publicfloatmoveX;publicAnimatoranima;publicboolisJump=false;publicRaycastHit2Dtodown;voidStart(){player=gameObject;P=gameObject.GetComponentRigidbody2D();}//UpdateiscalledonceperframevoidUpdate(){ToGround();PlayerMove();}voidPlayerMove(){//controlsmoveX=Input.GetAxis("Horizontal");if(Input.GetKeyDown(KeyCode.Space)){if(!isJump){anima.SetBool("jumping",true);Jump();}}//P.velocity=newVector2(moveX*playerSpeed,P.velocity.y);P.transform.Translate(transform.right*10f*Time.deltaTime*moveX);//animation//directionif(moveX0.0ffacingRight==true){FlipPlayer();}if(moveX0.0ffacingRight==false){FlipPlayer();}if(!isJump){anima.SetFloat("running",Mathf.Abs(moveX));}else{anima.SetFloat("running",0);}}voidJump(){P.AddForce(Vector2.up*playerJumpPower);}voidFlipPlayer(){facingRight=!facingRight;Vector2localScale=player.transform.localScale;localScale.x*=-1;transform.localScale=localScale;}voidToGround(){todown=Physics2D.Raycast(this.transform.position,Vector2.down);if(todown.distance0.6f){if(todown.collider.tag=="Ground"){anima.SetBool("jumping",false);isJump=false;}else{P.AddForce(Vector2.up*);todown.collider.gameObject.GetComponentAnimator().SetBool("Die",true);Invoke("killEnemy",0.05f);}}else{isJump=true;anima.SetBool("jumping",true);}}voidkillEnemy(){if(todown.collider.tag!="Ground"){Destroy(todown.collider.gameObject);}}}
移动
角色移动PlayerMove()使用了Input.GetAxis函数这里简单介绍一下参数用法
Input.GetAxis()
一:触屏类
1.MouseX
鼠标沿着屏幕X移动时触发
2.MouseY
鼠标沿着屏幕Y移动时触发
3.MouseScrollWheel
当鼠标滚动轮滚动时触发
二:键盘操作类
1.Vertical
对应键盘上面的上下箭头,当按下上或下箭头时触发
2.Horizontal
对应键盘上面的左右箭头,当按下左或右箭头时触发
使用Horizontal读取键盘的左右箭头进行控制左右移动
跳跃
当按下跳跃键(空格)时触发跳跃事件,给刚体P赋予向上的力。
避免二段跳:
在全局变量上设置跳跃状态,在Update使用ToGround()函数时刻更新角色的是否处于地面上。
在ToGround()函数中使用向下射线检测物体
逻辑:当检测到物体距离小于一定数值判断角色为非跳跃状态,反之处于跳跃状态。当角色处于跳跃状态时,按下跳跃键不会触发跳跃时间Jump(),这样就可以避免二段或多段跳的问题。
因为使用了射线检测,所以Player对象图层要调整为忽略射线,否则射线将会检测到自身。
转身
FlipPlayer()函数,设置localScale属性控制角色转身。在全局变量设置facingRight状态变量,用来判断角色朝向,当角色向左移动但没有面向左侧则调用FlipPlayer(),另一方向同理。
游戏规则
主要是设置金币和积分。
金币代码
usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;publicclassCoin:MonoBehaviour{//StartiscalledbeforethefirstframeupdatevoidStart(){}//UpdateiscalledonceperframevoidUpdate(){}privatevoidOnTriggerEnter2D(Collider2Dcollision){Destroy(this.gameObject);GameRuld.datasocre+=1;}}
记分代码(绑定与场景中任一一直存在的物体)
usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;usingUnityEngine.UI;publicclassGameRuld:MonoBehaviour{publicTextscore;publicstaticintdatasocre=0;//StartiscalledbeforethefirstframeupdatevoidStart(){score.text="Score:"+datasocre.ToString();}//UpdateiscalledonceperframevoidUpdate(){score.text="Score:"+datasocre.ToString();}}
动画
给游戏对象赋予动画,能够使得游戏更加有趣。
首先要有相应动画的素材
马里奥游戏角色有两个状态动画:
跑步状态:
跳跃状态:
选中角色对象,ctrl+6打开动画窗口
点击创建新的剪辑,给动画命名,并将跑步的每帧素材拖入右边蓝色区域,调整帧数间隔。(跳跃同理)
接着打开动画器窗口(这时角色对象自动会添加动画器组件),在动画器中调整动画播放条件
首先添加running和jumping参数方便代码控制
创建各个动画之间的过度,并设置条件
最后是代码控制
先定义动画器变量
在相应的位置对动画器的参数进行设置,这样当参数达到要求时,动画就会自动切换(上面角色移动代码也包含以下部分)
游戏结束触发
这里做成了进入城堡的效果
原理:使用了两个城堡素材并放置在不同的图层中,其中一个完整的城堡素材作为背景层,而另外后半边的城堡素材图层位置高于马里奥任务位置,因此当角色走到后半边城堡时就会被遮挡住,达到“进入城堡的效果”
在后半部放置一个对象,添加触发器组件
最后编写游戏结束代码
usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;usingUnityEngine.UI;publicclassGameover:MonoBehaviour{publicTextGameScore;//StartiscalledbeforethefirstframeupdatevoidStart(){GameScore.gameObject.SetActive(false);}privatevoidOnTriggerEnter2D(Collider2Dcollision){GameScore.text="Win!Scroe:"+GameRuld.datasocre.ToString();GameScore.gameObject.SetActive(true);Debug.Log(collision.name);collision.gameObject.GetComponentPlayeControl().enabled=false;Destroy(collision);}}
主要功能是当触发器被触发时显示游戏分数并摧毁游戏角色。
至此,山寨阉割版马里奥完成。
预览时标签不可点收录于话题#个上一篇下一篇
转载请注明:http://www.rongweicar.com/ddqh/10527.html