Unity3d课设

跑酷游戏分析

设计思想

本课设的设计思想来源于我们课上的一个游戏-飞机大战。当时老师在给我们讲授飞机大战这个游戏的时候,我就在想是不是可以自己也做一个类似于这样的游戏。游戏主要由三部分组成:小球、障碍物、跑道。点击键盘左右键可以移动小球,来躲避障碍物。这个作品中用到了预制体、添加材质、碰撞体等技术。

开发步骤

1、先新建一个Cube,然后将这个Cube的Z轴设置为1000,然后再新建一个球体,用于移动。再新建一个Cube,设置其Scale为3,作为障碍物。障碍物我们可以通过预制体的方式来制作,以便于后面生成障碍物的时候比较方便管理控制。障碍物大小调制好后设置其颜色,新建三个材质。如图:

 

matBall、matBarrier、matGround分别为球体、障碍物、跑道的颜色,然后手动添加到各自物体上。添加后如图:

 

      2、新建一个C#脚本,然后绑定在球体身上。用于编写与球体运动有关的代码。为了更好的观察球体的运动,我将摄像机作为了球体的子物体,这样球体的运动会带动摄像机的运动如图:

 

 

3、在C#脚本里面编写有关小球运动的代码。定义一个public变量speed,表示小球的移动速度,定义为public类型有利于后期在unity3d中运行时调节小球的速度。如图:

 

在里面可以根据小球具体的运动速度来更改他的速度。然后再定义一个public变量turnSpeed,用于表示小球在转弯时的速度即小球躲避障碍物的速度。具体如图所示:

 

4、将预制体设置好之后,把预制体设置为触发器,以便当在游戏运作时小球碰撞到障碍物时会触发操作。如图:

 

5、为小球添加刚体组件,但是我们只是需要将它标记为刚体,我们并不会使用这个刚体,所以我么需要选Is Kinematic选项。如图:

 

从图中可以看到在添加Rigidbody组件之后又选了Is Kinematic选项。

 

6、在障碍物Barrier身上添加一个脚本,用于添加触发器。当小球与障碍物发生碰撞的时候,就会停止游戏,通过Time.timeScale = 0;设置完成。如图:

 

当小球碰撞到障碍物的时候游戏就结束了。同理,当小球掉下去的时候也会停止游戏如图:

 

 

7、在跑到的合适位置添加一个障碍物,但时这个障碍物不设置碰撞触发事件,他的作用只是用来检测玩家走到了该位置,在添加这个障碍物的事件要将他的

Mesh Renderer组件给去掉,让他成为一个透明物体,当玩家努力的走到这个位置的时候,就会触发另一个操作,通知玩家已经走到了尽头,即玩家已经通关我们的这个游戏了

 

之后需要新建一个Finish C#脚本文件,用于玩家通关之后的一些操作。

8、在跑到上我们需要再新建一个Panel,它的父级为Canvas,然后再新建一个Text如图:

 

里面的我们可以自由的进行设置,目的是为了提醒玩家已经通关我们的游戏。如图所示:

 

9、当玩家通过自己的努力完成我们的关卡的时候,继续向前走就会到达Finish区域,当小球通过这个区域之后就会有提示出现,如图所示:

 

关键技术

在这个游戏设计以及完成游戏的过程中,我用到了设置预制体、为对应的物体挂在脚本文件、添加材质、添加触发器等技术。

难点问题的解决

在制作这个游戏的过程中,所遇到的难点有一个,就是在最后查找组件的子组件的时候,不知到该怎么样查找对应的组件,以及他的子组件。通过查阅资料,我才发现了怎样才能正确的查找:

//先找到Canvas这个物体

Game_Object Canvas = GameObject.Find("Canvas");

//寻找Canvas的子物体Panel; 游戏开始时设置为false即看不到此物体

Canvas.transform.Find("Panel").gameObject.SetActive(false);

作品尚需改进地方

我认为我编写的这个游戏还有许多细节可以进行改进,比如游戏的背景,可以进一步的选择一个比较适合这个游戏的背景。还有就是可以给这个游戏选择一个合适的游戏背景音乐,这样配合着游戏玩可以更加有体验感。

作品的优势

我认为这个游戏有一个比较好的地方,也是这个游戏比较灵活一点的地方就是:我们可以随时更改障碍物的地方和障碍物的形状,让游戏更加的有意思、可以更加的吸引玩家,通过不断的改变障碍物,可以让玩家一直有新鲜感,让游戏更加的具有挑战性。图一是一种玩法:

这种玩法比较简单。

 

图二又是一种玩法:

 

通过对比可以得出,游戏的玩法即障碍物的出现是可以随意更改的。

作品总结

这个作品从开始到结束所用到的材料如图:

 

游戏中所写的代码为:

  1. 为小球所编写的代码:

void Update()

    {

        //当游戏结束后,按下R键可以重新开始游戏

        if (Input.GetKeyDown(KeyCode.R))

        {

            //加载第一个场景

            SceneManager.LoadScene(0);

            //将时间还原

            Time.timeScale = 1;

            return;

        }

        //获得键盘的输入 左右键,Horizontal用于获得横向的输入,返回值为0到1  

        float x = Input.GetAxis("Horizontal");

        //speed * Time.deltaTime 用于保证球在移动时速度不变;turnSpeed为转弯的速度

        transform.Translate(x * turnSpeed * Time.deltaTime, 0, speed * Time.deltaTime);

        //如果小球的位置不在(-4,4)之间,小球就会掉下去

        if(transform.position.x < -4 ||transform.position.x > 4)

        {

            //设置y轴方向位置为-10 * Time.deltaTime,即小球会掉下去

            transform.Translate(0, -10 * Time.deltaTime, 0);

        }

        //当小球的位置低于-20时,就会触发暂停

        if(transform.position.y < -20)

        {

            Time.timeScale = 0;

        }

    }

  1. 为障碍物所编写的代码:

private void OnTriggerEnter(Collider other)

    {

        Debug.Log(other.name + "碰到我了");

        //加一个判断条件,只有小球碰到障碍物才会暂停游戏

        if(other.name == "Player")

        {

            //当小球碰到障碍物时游戏结束,停止!

            Time.timeScale = 0;

        }

    }

  1. 游戏结束代码:

private void Start()

    {

        //先找到Canvas这个物体

        GameObject Canvas = GameObject.Find("Canvas");

        //寻找Canvas的子物体Panel; 游戏开始时设置为false即看不到此物体

        Canvas.transform.Find("Panel").gameObject.SetActive(false);

    }

private void OnTriggerEnter(Collider other)

    {

        //先找到Canvas这个物体

        GameObject Canvas =  GameObject.Find("Canvas");

        //寻找Canvas的子物体Panel,设置为true,即玩家通关后就可看到此物体

        Canvas.transform.Find("Panel").gameObject.SetActive(true);

    }

  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

1planet

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值