马里

Unity笔记03山寨超级马里


程序开发求职招聘微信群 http://www.bcutexas.net/chaoliu/xinchao/1608.html

先看看最终效果吧。

这周的课上,助教布置了个小任务——让我们制作超级马里奥的一个小游戏场景。

首先来分析一下需求。

角色可以移动、跳跃——使用角色控制器或刚体来实现玩家对角色的控制。

吃金币加分——金币带触发器,被角色碰到后消失并加分。

实时显示分数——放一个Text,实时更新。

开门胜利——场景最右有触发器,碰到后有“门”打开。出“门”后胜利。

那么开始搭建场景吧。

既然是做超级马里奥,自然要用到超级马里奥的素材。

以下超级马里奥的素材来自B站UP主飞羽时代。(至于他哪来的素材就不知道了

首先导入场景的地图,这次只需要用到一小部分。

完整地图

用到的部分

使用给到的素材进行简单的地图搭建。

把我们的马里奥拖进场景里。

考虑到素材把马里奥的动作都佩奇了,不把角色动画做出来好像也有点说不过去。主要是——

同时,同宿舍哥们把音乐、金币闪动、顶砖块、板栗仔的移动和踩爆也都给实现了……

需要创新性嘛,那开整!

那就先研究下动画的实现吧,同时实现键盘控制马里奥的移动和跳跃。

往场景内拖入序列中的多个图片,会自动生成动画文件。

之后,在Animator窗口内设置好各个状态的关系,创建必要的布尔变量以判断状态。同时设置好所有转场。

跳跃和地上站定的判断还需要用到碰撞体、刚体,补全之。

其中马里奥角色的组件有Rigidbody2D和CapsuleCollider2D

其它物体都使用BoxCollider2D

编写脚本附给马里奥,实现移动、跳跃、碰撞。

usingUnityEngine;usingUnityEngine.UI;publicclassPlayerControl:MonoBehaviour{publicstaticstringtext="Score:0";publicstaticintscore=0;privateAnimatoranimator;privateboolisGrounded;privateRigidbody2DRigidbody2D;voidStart(){animator=GetComponentAnimator();Rigidbody2D=GetComponentRigidbody2D();}voidUpdate(){floathorizontal=Input.GetAxis("Horizontal");if(horizontal!=0){transform.Translate(transform.right*1f*Time.deltaTime*horizontal);if(horizontal0){GetComponentSpriteRenderer().flipX=false;}if(horizontal0){GetComponentSpriteRenderer().flipX=true;}animator.SetBool("IsRunning",true);}else{animator.SetBool("IsRunning",false);}if(Input.GetKeyDown(KeyCode.Space)isGrounded){Rigidbody2D.AddForce(Vector2.up*f);animator.SetBool("IsJumping",true);}}privatevoidOnCollisionEnter2D(Collision2Dcollision){if(collision.collider.CompareTag("Ground")){isGrounded=true;animator.SetBool("IsJumping",false);}}privatevoidOnCollisionExit2D(Collision2Dcollision){if(collision.collider.CompareTag("Ground")){isGrounded=false;}}}

PlayerControl.cs

同时,为了实现吃到金币并加分,还需要给场景里的金币添加Trigger。依旧是一个BoxCollider2D,不过选中了IsTrigger这个选项。

这样,就可以在脚本里编写金币被触碰之后的逻辑了。

usingUnityEngine;publicclassGoldTrigger:MonoBehaviour{privatevoidOnTriggerEnter2D(Collider2Dcollision){Destroy(this.gameObject);PlayerControl.score++;PlayerControl.text="Score:"+PlayerControl.score;}}

Trigger.cs

既然有了分数,那就还需要实时显示它。在场景内添加个Text物体,打上标签“Score”,其上的Canvas渲染到MainCamera上。

同时在PlayerControl.cs的Update()方法内添加一行代码。

GameObject.FindGameObjectWithTag("Score").GetComponentText().text=text;

分数的显示和更新便搞定了。

最后一个要求,碰到场景右侧的触发器打开“门”,出门胜利。和金币被吃的逻辑类似。代码略。

说到马里奥也离不开它经典的音乐和音效,加之。首先编写音频控制脚本。

usingUnityEngine;publicclassAudioManager:MonoBehaviour{publicstaticAudioManagerInstance;publicAudioSourceMusicPlayer;publicAudioSourceSoundPlayer;voidStart(){Instance=this;}publicvoidPlayMusic(stringname){if(!MusicPlayer.isPlaying){AudioClipclip=Resources.LoadAudioClip(name);MusicPlayer.clip=clip;MusicPlayer.Play();}}publicvoidStopMusic(){MusicPlayer.Stop();}publicvoidPlaySound(stringname){AudioClipclip=Resources.LoadAudioClip(name);SoundPlayer.PlayOneShot(clip);}}

AudioManager.cs

之后在场景内新建一个空物体,附上脚本,便可在其属性窗口内设置音乐。

同时,在跳跃、金币被吃的事件内都添加好对应的音效,代码略。

于是乎,整个山寨小案例便大功告成。

下班!

TakaSoap




转载请注明:http://www.rongweicar.com/ddqh/10525.html


当前时间: