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);
作品尚需改进地方
我认为我编写的这个游戏还有许多细节可以进行改进,比如游戏的背景,可以进一步的选择一个比较适合这个游戏的背景。还有就是可以给这个游戏选择一个合适的游戏背景音乐,这样配合着游戏玩可以更加有体验感。
作品的优势
我认为这个游戏有一个比较好的地方,也是这个游戏比较灵活一点的地方就是:我们可以随时更改障碍物的地方和障碍物的形状,让游戏更加的有意思、可以更加的吸引玩家,通过不断的改变障碍物,可以让玩家一直有新鲜感,让游戏更加的具有挑战性。图一是一种玩法:
这种玩法比较简单。
图二又是一种玩法:
通过对比可以得出,游戏的玩法即障碍物的出现是可以随意更改的。
作品总结
这个作品从开始到结束所用到的材料如图:
游戏中所写的代码为:
- 为小球所编写的代码:
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;
}
}
- 为障碍物所编写的代码:
private void OnTriggerEnter(Collider other)
{
Debug.Log(other.name + "碰到我了");
//加一个判断条件,只有小球碰到障碍物才会暂停游戏
if(other.name == "Player")
{
//当小球碰到障碍物时游戏结束,停止!
Time.timeScale = 0;
}
}
- 游戏结束代码:
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);
}