自制Unity小游戏TankHero-2D(3)开始玩起来

我在做这样一个坦克游戏,是仿照(http://game.kid.qq.com/a/20140221/028931.htm)这个游戏制作的。仅为学习Unity之用。图片大部分是自己画的,少数是从网上搜来的。您可以到我的github页面(https://github.com/bitzhuwei/TankHero-2D)上得到工程源码。

本篇主要记录金币、按钮、坦克工厂、小地图等小部件,让整个场景初步成为一个可玩的游戏。

在本篇在制作过程中,修改了前两篇的很多东西,算是对Unity更加熟悉了。

金币

玩家击毁一个敌方坦克,会敌方坦克所在位置会出现1个金币。金币可以用来升级玩家坦克的速度、武器等,也可以用来恢复生命。

金币有3个脚本。

Show Up控制金币的出现是从透明到全不透明的。

 1 public class ShowUp : MonoBehaviour {
 2
 3     public float showUpSpeed = 1;
 4     private SpriteRenderer spriteRenderer;
 5
 6     void Awake()
 7     {
 8         this.spriteRenderer = this.GetComponent<SpriteRenderer>();
 9         var color = this.spriteRenderer.color;
10         this.spriteRenderer.color = new Color(color.r, color.g, color.b, 0);
11     }
12
13     // Update is called once per frame
14     void Update () {
15         if (this.spriteRenderer == null) { return; }
16
17         this.spriteRenderer.color = Color.Lerp(this.spriteRenderer.color, Color.white, this.showUpSpeed * Time.deltaTime);
18
19         //Debug.Log(string.Format("A: {0}", this.spriteRenderer.color.a));
20         if (Mathf.Abs(Color.white.a - this.spriteRenderer.color.a) <= 0.02f)
21         {
22             this.spriteRenderer.color = Color.white;
23             this.spriteRenderer = null;
24         }
25     }

ShowUp.cs

Coin Info保存金币的价值。

注意:脚本中要保留一个Start或一个Update函数,否则在Inspector面板就不会显示脚本组件前面的勾选框了。

1 public class CoinInfo : MonoBehaviour {
2
3     public int value;
4
5     void Start()
6     {
7     }
8
9 }

Picked Coin让金币碰到玩家坦克时销毁自己。

 1 public class PickedCoin : MonoBehaviour {
 2
 3     private bool picked;
 4
 5     void Awake()
 6     {
 7         this.picked = false;
 8 }
 9
10     void Start () {
11
12     }
13
14     void OnTriggerEnter2D(Collider2D other)
15     {
16         if (other.tag != Tags.hero) { return; }
17
18         if (!this.picked)
19         {
20             this.picked = true;
21             MonoBehaviour.Destroy(this.gameObject);
22         }
23     }
24 }

游戏暂停和继续

用一个按钮来控制游戏的暂停和继续。

选择UI-Button即可添加一个按钮。

在按钮的Button组件中,添加一个btnPause.cs脚本,添加一个On Click(),选择这个btnPause.cs脚本组件,选择对应的事件函数即可。(下图是错的,应该把btnPause.cs组件赋给On Click项。

那么事件函数怎么写呢?

游戏暂停的原理很简单,只需 Time.timeScale = 0; ,那么今后所有的 Time.deltaTime 都将是0。因此所有乘以 Time.deltaTime 的地方都不会再有进展。

 1     private float originalTimeScale;
 2     private UnityEngine.UI.Text buttonText;
 3
 4     void Awake()
 5     {
 6         this.originalTimeScale = Time.timeScale;
 7         this.buttonText = this.GetComponentInChildren<UnityEngine.UI.Text>();
 8 }
 9
10     public void btnPause_Click()
11     {
12         if (Time.timeScale > 0)
13         {
14             Time.timeScale = 0;
15             buttonText.text = "Continue";
16         }
17         else
18         {
19             Time.timeScale = this.originalTimeScale;
20             buttonText.text = "Pause";
21         }
22     }

btnPause

在激烈的游戏过程中,把鼠标挪到屏幕某处点击按钮是很费劲的。所以,添加一个按下Space键就可以暂停或继续游戏的功能很有必要。只需给刚刚的btnPause.cs脚本添加如下代码。

1     void Update () {
2         if (Input.GetKeyDown(KeyCode.Space))
3         {
4             btnPause_Click();
5         }
6     }

坦克工厂

现在可以在界面上方三个点产生敌方坦克。后续我将此处改造为关卡控制器。此处暂时没什么可说的。

小地图

整个游戏地图有的大,一屏显示不完,所以给个能显示全地图的小地图是很好的。

制作小地图的原理是再添加一个摄像机smallMap,确保其Depth大于主摄像机。这样小地图就会显示在主场景上层。调整smallMap的Viewport属性,使其只在界面的某个角落显示。这里我让小地图显示在场景左下角,其长宽均为场景的五分之一即0.2。

注意,Viewport的X、Y、Width、Height属性都是0~1的,表示的是百分比。

注意,上图左上方红色围起来的白色框,其长宽比=下方Game视图的长宽比,后面我就是根据这个调整小地图的长宽的。

完成后,在Game视图里是这样的,小地图并不是正方形。这不好。

不过这个问题我用脚本解决了,实际上是调整了摄像机的Viewport的长宽属性,使之调整到相同的长度。

脚本如下。思路是,当场景的width大于height时,要缩小小地图的width;当场景的width小于height时,要缩小小地图的height。

 1 public class AdjustViewPort : MonoBehaviour {
 2
 3     Camera cameraComponent;
 4     private float screenWidth;
 5     private float screenHeight;
 6     private Rect originalCameraRect;
 7
 8     void Awake()
 9     {
10         this.cameraComponent = this.GetComponent<Camera>();
11         this.originalCameraRect = this.cameraComponent.rect;
12     }
13
14     void Update () {
15         var width = Screen.width;
16         var height = Screen.height;
17         if (width == this.screenWidth && height == this.screenHeight) { return; }
18
19         this.screenWidth = width;
20         this.screenHeight = height;
21
22         if (width > height)
23         {
24             var rect = this.cameraComponent.rect;
25             rect.width = this.originalCameraRect.width * ((float)height / (float)width);
26             this.cameraComponent.rect = rect;
27         }
28         else
29         {
30             var rect = this.cameraComponent.rect;
31             rect.height = this.originalCameraRect.height * ((float)width / (float)height);
32             this.cameraComponent.rect = rect;
33         }
34     }
35 }

AdjustViewport.cs

只显示小地图的话,可能会跟场景混淆,所以给小地图加个红色的边框,就区分得明显了。我搜了很多加边框的方法,发现都太繁琐,还要依赖各种包、库。还是直接画一个Texture简单。

为方便起见,就在刚刚的AdjustViewPort脚本中同时绘制边框好了。

所需的边框纹理就是一个内部透明四周为红色的PNG图片。

(下面的脚本忽略了调整长宽相关的部分。)

 1 public class AdjustViewPort : MonoBehaviour {
 2
 3     Camera cameraComponent;
 4     public Texture borderTexture;
 5
 6     void Awake()
 7     {
 8         this.cameraComponent = this.GetComponent<Camera>();
 9     }
10
11     void OnGUI()
12     {
13         var rect = this.cameraComponent.rect;
14         float left = 0;
15         float top = Screen.height - Screen.height * rect.height;
16         float width = Screen.width * rect.width;
17         float height = Screen.height * rect.height;
18
19         GUI.DrawTexture(new Rect(left, top, width, height), this.borderTexture, ScaleMode.StretchToFill);
20     }
21 }

总结

本篇添加了一些虽小但用起来很方便的小部件。现在这个TankHero就算是可以玩了。下面我将设计实现关卡,让这个游戏具有多个关卡,并且可配置。

您可以到我的github页面(https://github.com/bitzhuwei/TankHero-2D)上得到工程源码。

请多多指教~

转载于:https://www.cnblogs.com/bitzhuwei/p/tank-hero-2d-3-coin-button-small-map-etc.html

自制Unity小游戏TankHero-2D(3)开始玩起来相关推荐

  1. 自制Unity小游戏TankHero-2D(1)制作主角坦克

    自制Unity小游戏TankHero-2D(1)制作主角坦克 我在做这样一个坦克游戏,是仿照(http://game.kid.qq.com/a/20140221/028931.htm)这个游戏制作的. ...

  2. Unity小游戏-彩笔画师(安卓、PC)2D益智类游戏 项目展示+完整项目源码

    游戏录像 游戏玩法 谁画在屏幕上占的颜色最多,谁获胜. 功能 1.游戏有多个关卡,每个关卡的人机难度不一致. 2.可以存金币购买角色,不同角色的技能和属性不一样. 3.每个关卡的评分等数据存到本地. ...

  3. Unity小游戏-平衡大师(安卓、PC、web)2D益智类游戏 项目展示+完整项目源码

    游戏录像 游戏试玩 平衡带师_平衡带师html5游戏_4399h5游戏-h.4399.com 游戏玩法 这是一款类似堆积木的游戏,它非常考验玩家的智商和手速,难度系数很高的游戏,谁能征服它,谁就是平衡 ...

  4. unity小游戏制作之见缝插针

    unity小游戏制作之见缝插针 先看效果图这个游戏是一个入门的小游戏,主要技术就是圆盘的旋转,针跟随圆盘旋转以及分数累加等 游戏先拖入一个圆,更改格式为2D然后建立脚本使其转动 public clas ...

  5. 2022unity超简单课设-模拟太阳系的Unity小游戏

    模拟太阳系的Unity小游戏(附下载链接) 下载链接 unity课程实践做的一个模拟太阳系的Unity小游戏,你可以使用飞船移动来查看太阳系中的各个星球. 飞船拥有两种驾驶模式,一种更加真实,是通过给 ...

  6. Unity 小游戏:3D射箭

    Unity 小游戏:3D射箭 前两周因为实训太忙,再加上自己对老师所讲的设计模式并不是很理解,所以就没有写博客.这次博客是记录3D射箭游戏的实现过程. Unity 小游戏3D射箭 准备资源 布置场景 ...

  7. Unity小游戏(一)——Unity JigsawPuzzle(拼图游戏)

    1.前言: 简单的Unity小游戏,切割图片,生成随机区块,拖拽交换位置. 此游戏代码只贴了一小部分,具体可见GitHub:源码 效果: 2.素材准备 简单做了下,所以没有用太多素材,只准备了两种字体 ...

  8. Unity小游戏-惊爆游戏(PC)3D联网大逃杀游戏 项目展示+完整项目源码

    游戏录像 游戏玩法 1.类似吃鸡的小游戏,但是这里没有毒圈,武器只有炸弹,没有枪. 2.游戏开始后所有人的体力会不断下降,当体力下降到0就会死亡. 3.玩家只有吃食物增加体力才能活下去,而食物只能通过 ...

  9. 计算机里没有四款小游戏,90后最爱玩的4款“4399”小游戏,一个都没玩过的太可怜!...

    原标题:90后最爱玩的4款"4399"小游戏,一个都没玩过的太可怜! 对于90后的小伙伴们来说,现在的很多东西都属于童年的回忆了,而在我们那个年代,电脑游戏还不是非常的盛行.正式流 ...

最新文章

  1. win7 64安装oracle10g 客户端,关于win7 64位 只 安装 oracle 10g的client
  2. winrunner事务概念的代码应用(毫秒级)
  3. 学python要考什么证-这十个Python常用库,学习Python的你必须要知道!
  4. C++虚继承下的内存模型(二)
  5. RAPI简单说明及Sample Code
  6. 送书 | 人类细胞图谱计划发起人Aviv Regev博士讲单细胞基因组学
  7. python3.7.2安装pywifi_python pywifi
  8. [Node.js] 模块化 -- path路径模块
  9. 利用c#开发一个telnet unix服务器或者防火墙的小工具(转)
  10. 春晓html代码,春晓
  11. 远程调试Eclipse插件的设置
  12. CSS属性:display详解
  13. ajax 解析gzip,javascript – 如何让浏览器gunzip一个Ajax获取gziped文本文件?
  14. 毕业设计的开题报告怎么写?
  15. 华为交换机vlan配置举例_一步步详解华为交换机配置实例,一看就会
  16. linux opessl下载_linux Download openssl-1.0.2下载 openssl安装步骤
  17. GR节点故障The member contains transactions not present in the group
  18. 推箱子 | Java课程设计
  19. 随手记安全吗?随手记手把手教你分析理财平台安全性
  20. Android build.gradle文件详解

热门文章

  1. win7局域网共享设置_Win7系统打印机共享不了的设置方法思路!
  2. oracle数据库的医院信息系统数据库升级方案,医院信息系统数据库从Oracle8i到10gR2升级的实现...
  3. 我也不知道该咋分类--莫队算法
  4. 如何理解和分析linux系统的CPU平均负载情况(load average)
  5. Linux QoS egress处理流程
  6. sublime ctags的安装使用方法
  7. 单片机小白学步系列(二十) IO口原理
  8. 状态机-重叠序列检测
  9. mysql rename table_Mysql: RENAME TABLE IF EXISTS
  10. python链表中删除一个节点数据_python实现单链表中删除倒数第K个节点的方法