文章目录

  • 前言
  • 一、实验目的
  • 二、实验环境
  • 三、实验内容
    • 1.游戏世界
    • 2.摄像机
    • 3.背景
    • 4.游戏实体
      • 玩家
      • 流星
      • 子弹
      • 触发器
    • 5.游戏控制
      • 流星脚本
      • 流星再生
      • 触发器脚本
      • 玩家脚本
      • 子弹脚本
    • 6.游戏测试
  • 总结

前言

  让我们制作一款游戏!在本实验中,将制作一款名称为 Captain Blaster 的 2D 滚动射击游戏。你首先将设计游戏的多个元素。接着,将开始构建滚动背景。一旦建立了运动的理念,就可以开始构建多个游戏实体。在完成了实体之后,将构造控制并使项目游戏化。在本实验最后,将分析游戏,并确定一些可以改进的地方。


一、实验目的

  1. 怎样设计 Captain Blaster 游戏;
  2. 怎样构建 Captain Blaster 游戏世界;
  3. 怎样构建 Captain Blaster 实体;
  4. 怎样构建 Captain Blaster 控制;
  5. 怎样进一步改进 Captain Blaster 游戏。

二、实验环境

  1. 操作系统:WINDOWS 10
  2. 开发工具:UNITY
  3. 实验设备:PC

三、实验内容

  制作一款名称为Captain Blaster的2D滚动射击游戏。你首先将设计游戏的多个元素。接着,将开始构建滚动背景。一旦建立了运动的理念,就可以开始构建多个游戏实体。在完成了实体之后,将构造控制并使项目游戏化。在本实验最后,将分析游戏,并确定一些可以改进的地方。

1.游戏世界

(1)在名为 Captain Blaster 的文件夹中创建一个新项目,并向场景中添加一个定向灯光。
(2)创建一个 Scenes 文件夹,并把场景另存为 Main。
(3)在 Game 视图中,把屏幕高宽比改为 5:4

2.摄像机

(1)把摄像机定位于(0, 0, −10)处,并且不进行旋转。
(2)把 Projection 属性改为 Orthographic。
(3)把 Size 属性设置为 6,查看摄像机的属性列表。

3.背景

(1)向场景中添加一个立方体,把它重命名为 Background,并把它置于(0, 0, 0)处。然后立方体缩放为(15, 15, .1)。

(2)在 Project 视图中创建一个名为 Textures 的新文件夹。在用于第 15 章(Hour 15)的本书配套资源中找到 Star_Sky.png 文件,并把它拖到新的 Textures 文件夹中。从 Project 视图中,把 Star_Sky 纹理拖到背景上。

(3)在 Project 视图中创建一个名为 Scripts 的新文件夹。然后在该文件夹中创建一个名为
BackgroundScript 的新脚本,并把它拖到背景立方体上。

BackgroundScript代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class BackgroundScript : MonoBehaviour
{public float speed = -2;// Use this for initializationvoid Start(){}// Update is called once per framevoid Update(){transform.Translate(0f, speed * Time.deltaTime, 0f);if (transform.position.y <= -15){transform.Translate(0f, 30f, 0f);}}
}

(4)复制背景立方体,并把它放在(0, 15, 0)处。

4.游戏实体

玩家

(1)创建一个新文件夹,并把它命名为 Meshes。将Space Shooter的文件夹拖到新创建的Meshes文件夹中(以导入它)。

(2)在 Meshes 文件夹下,现在应该会有一个 Space Shooter 文件夹。找到其中的Space_Shooter.fbx 文件,并在编辑器中把比例因子改为 0.09。一定要单击Inspector 视图底部的 Apply 按钮。

(3)从 Project 视图中单击 Space_Shooter.fbx,并把它拖到 Scene 视图中。注意它面朝错误的方向。把它定位在(0, −4, −5)处,并把旋转角度设置为(270, 0, 0)。

(4)在 Space Shooter 文件夹下找到 Textures 文件夹,然后单击 1K_BodyTXTR.jpg 文件,并将其拖到 Scene 视图中的宇宙飞船模型上。


(5)给宇宙飞船添加一个胶囊碰撞器。选中 Is Trigger 属性,然后把半径设置为 0.62,把高度设置为 1.71,并把方向设置为 Z-Axis

流星

(1)将Meteor1 文件夹拖到创建的 Meshes 文件夹中。

(2)在新的 Meteor1 文件夹中找到 Meteor1.fbx 文件,然后在 Inspector 视图中把比例因子改为 0.5。一定要单击 Inspector 视图底部的 Apply 按钮。

(3)把 Meteor1.fbx 文件拖到 Scene 视图中。把它置于(0, 0, −5)处,然后把旋转角度设置为(0, 0, 0),并把缩放比例设置为(1, 1, 1)(网格在导入时已经应用了某种旋转和缩放效果)。

(4)在 Textures 文件夹中,找到 Meteor1_TXTR.png 文件,并把它拖到场景中的流星上。

(5)给流星添加一个刚体,并且取消选中 Use Gravity 属性。给流星也添加一个胶囊碰撞器。

(6)创建一个名为 Prefabs 的新文件夹,并在该文件夹中创建一个名为 Meteor 的新预设。从 Hierarchy 视图中单击 Meteor1 对象,并将其拖到新创建的预设上。然后从场景中删除Meteor1 对象。

子弹

(1)向场景中添加一个胶囊,把它定位于(0, 0, 0)处,并把缩放比例设置为(.1, .1, .1)。给胶囊添加一个刚体,并取消选中 Use Gravity 属性。


(2)如果还没有 Materials 文件夹,就创建该文件夹,并在其中创建一种名为 BulletMaterial的新材质。给该材质提供明亮的绿色,并把它应用于子弹。


(3)创建一个名为 Bullet 的新预设,然后单击胶囊并把它拖到子弹预设上。现在从场景中删除胶囊。

触发器

(1)向场景中添加一个立方体,并把它命名为 Trigger。把该立方体定位在(0, −9, −5)处,并把缩放比例设置为(15, 1, 1)。

(2)在 Inspector 视图中,确保选中 Box Collider 组件的 Is Trigger 属性。

(3)复制触发器,并把新的触发器放在(0, 9, −5)处。

5.游戏控制

  创建一个空的游戏对象,并把它命名为 GameControl。创建一个名为 GameControlScript 的新脚本,并把它附加到游戏控制对象上。

GameControlScript代码如下:

using UnityEngine;
using System.Collections;
public class GameControlScript : MonoBehaviour
{//is the game still going?bool isRunning = true;int playerScore = 0;void Start() { }void Update() { }public void AddScore(){playerScore++;}public void PlayerDied(){isRunning = false;}void OnGUI(){if (isRunning == true){GUI.Label(new Rect(5, 5, 100, 30), "Player Score: " +playerScore);}else{GUI.Label(new Rect(Screen.width / 2 - 100, Screen.height / 2 -50, 200, 100), "Game Over. Your score was: " + playerScore);}}
}

流星脚本

  创建一个新脚本,并把它命名为 MeteorScript。在 Prefabs 文件夹中,选择 Meteor 预设。在 Inspector 视图中,找到AddComponent 按钮。然后单击Add Component > Scripts > Meteor Script 命令。

MeteorScript代码如下:

using UnityEngine;
using System.Collections;
public class MeteorScript : MonoBehaviour
{float speed = -5f;//random rotationfloat rotation;void Start(){rotation = Random.Range(-40, 40);}void Update(){transform.Translate(0f, speed * Time.deltaTime, 0f);transform.Rotate(0f, rotation * Time.deltaTime, 0f);}
}

流星再生

  创建一个新的空游戏对象,把该对象重命名为 MeteorSpawn,并将其置于(0, 7, −5)处。然后创建一个名为 MeteorSpawnScript 的新脚本,并把它放在流星再生对象上。在 Unity 编辑器中,从 Project 视图中单击 Meteor 预设,并将其拖到流星再生对象的Meteor Spawn Script 组件的 Meteor 属性上。

MeteorSpawnScript代码如下:

using UnityEngine;
using System.Collections;
public class MeteorSpawnScript : MonoBehaviour {//meteor spawning timersfloat spawnThreshold = 100;float spawnDecrement = .1f;//meteor prefabpublic GameObject meteor;void Start () {}void Update () {if(Random.Range(0, spawnThreshold) <= 1){//create a meteor at a random x positionVector3 pos = transform.position;Instantiate(meteor, new Vector3(pos.x + Random.Range(-6, 6), pos.y, pos.z), Quaternion.identity);spawnThreshold -= spawnDecrement;}if(spawnThreshold < 2){spawnThreshold = 2; }}
}

触发器脚本

  创建一个名为 TriggerScript 的新脚本,并把它同时附加到你在前面创建的上下两个触发器对象上。

TriggerScript代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class TriggerScript : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){}void OnTriggerEnter(Collider other){Destroy(other.gameObject);}
}

玩家脚本

  创建一个名为 PlayerScript 的新脚本,并把它附加到宇宙飞船上。

PlayerScript代码如下:

using UnityEngine;
using System.Collections;
public class PlayerScript : MonoBehaviour
{//player speedpublic float speed = 10f;//bullet prefabpublic GameObject bullet;//Control Scriptpublic GameControlScript control;//player can fire a bullet every half secondpublic float bulletThreshold = .5f;float elapsedTime = 0;void Start() { }void Update(){//keeping track of time for bullet firingelapsedTime += Time.deltaTime;//move the player sidewaystransform.Translate(Input.GetAxis("Horizontal") * speed *Time.deltaTime, 0f, 0f);//spacebar fires. The current setup calls this "Jump"//this was left to avoid confusionif (Input.GetButtonDown("Jump")){//see if enough time has passed to fire a new bulletif (elapsedTime > bulletThreshold){//fire bullet at current position//be sure the bullet is created in front of the player//so they don't collideInstantiate(bullet, new Vector3(transform.position.x,transform.position.y + 1.2f, -5f), Quaternion.identity);//reset bullet firing timerelapsedTime = 0f;}}}//if a meteor hits the playervoid OnTriggerEnter(Collider other){Destroy(other.gameObject);control.PlayerDied();Destroy(this.gameObject);}
}

子弹脚本

  创建一个名为 BulletScript 的新脚本,并把它添加给子弹预设。

BulletScript代码如下:

using UnityEngine;
using System.Collections;
public class BulletScript : MonoBehaviour
{float speed = 10f;//Game Control ScriptGameControlScript control;void Start(){//Because this is instantiated, we must find//the game control at run timecontrol = GameObject.Find("GameControl").GetComponent<GameControlScript>();}void Update(){//move upwardtransform.Translate(0f, speed * Time.deltaTime, 0f);}//neither bullet nor meteor is a trigger, so we need//to use a different collision method herevoid OnCollisionEnter(Collision other){Destroy(other.gameObject);control.AddScore();Destroy(this.gameObject);}
}

6.游戏测试





总结

滚动背景:
  首先来讲述一下原理,准备两张连续的图片,我们使用正交投影的摄像机对准第一张背景,然后使用脚本让图片自上向下开始移动,当第一张图片移出摄像机的视野时,第二张图片立即接在第一张图的后面,继续向下移动,而当第二张图片移出摄像机视野时,第一张图片会立即接在第二张图片的后面,如此周而复始,就实现了连续滚动背景。
预设体:
  prefabs 预设体是一个游戏物体及其组件的集合。
  Unity prefab系统将游戏物体所有的组件,属性值和子物体作为一个可重复使用的资源,并且允许你新建,配置,存储这样一个游戏物体。预制资产充当模板,您可以在该模板中在场景中创建新的预制实例。
  prefabs一般用在如非玩家角色(NPC),场景中的多个位置使用道具的或项目中的多个场景中使用的道具。
  设置预设体和直接复制游戏物体的区别:
  1、复制要求场景中先存在被复制的游戏对象,而预设体仅仅需要提前制作好预设体,场景中有无该游戏物体不重要。
  2、复制后的游戏物体不会随着被复制物体的改变而改变,两者是相互独立,不受影响的,而预设体实例化的游戏物体会随着预设体的改变而改变,在一定条件下可以对预设体进行改变。
  对Prefab所做的任何编辑都会自动反映在它的实例中,使您可以轻松地对整个项目进行广泛的更改,而无需对资产的每个副本重复进行相同的编辑。但对于实例,我们也可以对其进行覆盖,
  使用Prefabs,可以在运行时实例化开始时不存在于场景中GameObjects, - 例如,在游戏过程中的恰当时刻出现的电,特效,射弹或NPC。
  碰撞体、刚体和触发器:
  碰撞体 (Collider) 与刚体 (Rigidbody) 结合使用可使 Unity 中的物理变得生动。刚体 (Rigidbody) 使对象可以受物理控制,而碰撞体 (Collider) 使对象可以相互碰撞。碰撞体 (Collider) 必须独立于刚体 (Rigidbody) 添加到对象。碰撞体 (Collider) 并不一定需要附加刚体 (Rigidbody),但是必须刚体 (Rigidbody) 才能使对象由于碰撞而移动。
  当两个碰撞体 (Collider) 之间发生碰撞时并且如果其中至少一个附加了刚体 (Rigidbody),会将三条碰撞消息向外发送给附加到它们的对象。这些事件可以在脚本中进行处理,使您可以在使用或不使用内置 NVIDIA PhysX 引擎的情况下创建独特行为。
  使用碰撞体 (Collider) 的备选方法是将其作为触发器 (Trigger),只需在检视视图(Inspector) 中选中“为触发器”(IsTrigger) 属性复选框即可。触发器 (Trigger) 实际上会被物理引擎忽略,并具有一组独有的三条触发器 (Trigger) 消息,这些消息会在与触发器 (Trigger) 发生碰撞时向外发送。触发器 (Trigger) 可用于触发游戏中的其他事件,如剧情画面、自动门打开、显示辅导消息等。

  在本实验中,我制作了 Captain Blaster 游戏。首先设计了游戏元素,接着构建了游戏世界。构造了垂直滚动的背景,并使之运动起来。接下来构建了多个游戏实体,并通过编写脚本和控制对象添加了交互性。最后检查了游戏,并且探索了一些改进的方法。

【游戏开发引擎】 实验3:Captain Blaster 2D 滚动射击游戏相关推荐

  1. Cocos2dx游戏开发系列笔记8:开搞一个射击游戏《战神传说》//就个打飞机的

    2019独角兽企业重金招聘Python工程师标准>>> 又是一个愉快的夜晚 还是那张长长的工作桌 哲哲在左边做一个香云纱手包 骨头在这里噼里啪啦的解刨 pad里放着<赢在中国& ...

  2. 小学僧的游戏开发之旅——(集思广益)俯视坦克射击游戏实战

    前言 鄙人凭借过人的手速在毕设选题大战中抢到了一个坦克大战的毕设项目,那么本文就来讲解如何初步实现这个案例(以及求该游戏后续的一个策划)本文主要也是为了集思广益,希望得到各位天才策划的灵感一现.那么在 ...

  3. Cocos2dx游戏开发系列笔记7:一个简单的跑酷游戏《萝莉快跑》的消化(附下载)

    懒骨头(http://blog.csdn.net/iamlazybone  QQ124774397 青岛 ) 或许有天 我们羡慕和崇拜的人 因为我们的努力 也会来了解我们 说不定 还会成为好友 骨头喜 ...

  4. Cocos2dx游戏开发系列笔记7:一个简单的跑酷游戏《萝莉快跑》的消化(附下载)...

    2019独角兽企业重金招聘Python工程师标准>>> 或许有天 我们羡慕和崇拜的人 因为我们的努力 也会来了解我们 说不定 还会成为好友 骨头喜欢这样与哲哲共勉 多少个夜晚 一张长 ...

  5. 所见即所得:四款免编程移动游戏开发引擎推荐

    摘要:今天Unity.Unreal.Cocos2d-x等游戏引擎大行其道,但编程基础成了很多开发者最大的门槛.其实,移动游戏的开发,并没有想象的那么困难.今天为大家推荐几款比较主流的免编程类移动游戏开 ...

  6. 爆款小游戏用的都是什么游戏开发引擎?

    随着微信生态中,小程序应用指数级的增长,许多休闲游戏变成为了众多游戏厂商流量变现的新手段.以近期很火的"羊了个羊"为例,它便是我们常常所说的小游戏. 游戏和小游戏的区别 要盘点小游 ...

  7. Unity,最炙手可热的游戏开发引擎

    近日,Unity亚洲开发者大会在国家会议中心成功举行,引得业内人士高度关注.而纵观各大网站招聘信息,用人单位对unity开发人员的招聘可谓求贤若渴,除去高薪诱惑.升职诱惑,甚至不惜打起感情牌,动之以情 ...

  8. C++的学习心得和知识总结(十七)|Visual Studios 2019配置游戏开发引擎HGE1.8教程

    目录结构 注:提前言明 本文借鉴了以下博主.书籍或网站的内容,其列表如下: 1.HGE - Hardware accelerated 2D games engine,点击前往 2.GitHub仓库地址 ...

  9. python 游戏大作_几款商业上流行的游戏开发引擎详细比较

    原标题:几款商业上流行的游戏开发引擎详细比较 对于游戏开发团队来说,游戏引擎对于一个游戏来说是至关重要的.接下来跟一起了解一下目前几款商业上流行的游戏开发引擎,还有各自的详细比较 1) Unreal4 ...

  10. 盘点 小游戏开发引擎

    游戏越来越成为人们生活必不可少的一部分,游戏的类型也愈加丰富,进行游戏的方式也越来越便捷.而小程序技术的推广使得游戏的开发又多了一种选择.小程序上的小游戏无需下载安装,即点即玩,似乎更加符合现代人的需 ...

最新文章

  1. mysql 分区指定路径_[数据库]MySQL 指定各分区路径
  2. 对于微分的一些理解更新
  3. 有人说,如果有条件一定要远离穷人,你赞成吗?
  4. BeetleX.WebFamily之ElasticSearch搜索集成
  5. python合并两个属性_合并两个部分包含文件列表及其属性的最有效方法
  6. drbd(三):drbd的状态说明
  7. 剑指offer之链表中倒数第K个节点
  8. matlab经纬度画二维图,Matlab绘制汉经纬度的散点图 2
  9. mui获取css参数,Mui-获取时间-调用手机api
  10. 16.卷2(进程间通信)---Sun RPC
  11. 32. PHP Cookies
  12. 标签生成html怎么转换,如何进行HTML到XML转换以生成封闭标签?
  13. android设计字体规范,设计必备:字体使用规范
  14. 云课堂智慧职教中c语言答案,云课堂智慧职教查答案自动答题
  15. Jill Rides Again UVA - 507(求最大子序列和)
  16. 商汤研究院基础视觉组正式员工(校招/社招)实习生长期招聘
  17. 机器学习---降维算法
  18. 2021第二季度海外消费者消费者画像分析
  19. geoserver(xml和json带属性互转,获取工作区-图层-样式-更新样式(解决乱码问题))
  20. python网球比赛模拟主持稿_主持人大赛的模拟主持稿件模板推荐

热门文章

  1. (转)DOTA新版地图6.78发布:大幅改动 增两位新英雄
  2. git-remote-https.exe-无法找到入口
  3. WireShark和Fidder进行网络抓包并对协议进行验证
  4. java的方法覆盖与方法重载有什么异同_Java语言中方法重载与方法覆盖的异同
  5. apple tv 开发_如何在新的Apple TV上管理存储空间
  6. intel D435i 双目相机 拍摄图片并保存 python调用示例
  7. 计算机的内存的材料是什么,内存条到底是干啥的?手把手的告诉你
  8. 刷手机坐公交 背后蕴含了什么技术?
  9. python编写程序输出诗句_python基于词向量的古诗生成器
  10. 浙大博士 130 页论文,教你用人工智能挑西瓜