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

自制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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/257689.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VirtualBox虚拟机安装CentOS 7

新建虚拟机 因为比较简单&#xff0c;所以对于VirtualBox就不做过多介绍了&#xff0c;直接下载安装即可&#xff0c;安装好之后打开Oracle VM VirtualBox管理器&#xff0c;点击新建&#xff0c;选择Red Hat&#xff08;根据windows主机选择 32/64 bit&#xff0c;通常会自动识…

从C语言到C++成长经历所得的一些技巧和感悟

我介绍几个办法&#xff0c;学习办法&#xff0c;期望你能找到爱好1。必定要和喜爱编程的&#xff0c;或编程凶猛的&#xff0c;或常常编程的人&#xff0c;在一同&#xff0c;常常探讨问题&#xff01;初学编程会有许多问题呈现&#xff0c;你自己很 难处理 c是我们必定要学的…

java基础篇---网络编程(UDP程序设计)

UDP程序设计 在TCP的索引操作都必须建立可靠地连接&#xff0c;这样一来肯定会浪费大量的系统性能&#xff0c;为了减少这种开销&#xff0c;在网络中又提供了另外一种传输协议---UDP,不可靠的连接&#xff0c;这种协议在各个聊天工具中被广泛的应用。 咋UDP开发中使用Datagram…

c++ 静态变量赋值_Python变量及常量解释说明

变量(1)在计算机程序中,变量不仅可以是数字,还可以是任意数据类型,变量子啊程序中就是一个变量名表示的,变量名必须是大小写英文,数字,和"_"的组合,切不能以数字开头.a 1 #变量a是一个整数1b "shuai" #变量b是一个字符串1c True #变量c是一个布尔值Tru…

Hibernate中session的clear(),flush(),evict()方法详解

2019独角兽企业重金招聘Python工程师标准>>> 一、Clear 方法 无论是Load 还是 Get 都会首先查找缓存&#xff08;一级缓存&#xff09; 如果没有&#xff0c;才会去数据库查找&#xff0c;调用Clear() 方法&#xff0c;可以强制清除Session缓存。例&#xff1a; pub…

40_自定义泛型方法及其应用

java的泛型不同于C的模板方法那么强大。java的泛型只停留在编译阶段&#xff0c;编译通过后泛型特征被擦除&#xff0c;主要因为保证jvm的效率。 用泛型知识&#xff0c;写一个交换数组元素的方法&#xff08;此方法只适合于引用类型数组!因为int[]不会自动转为Integer[]!&…

SQL Server代理(11/12):维护计划作业

SQL Server代理是所有实时数据库的核心。代理有很多不明显的用法&#xff0c;因此系统的知识&#xff0c;对于开发人员还是DBA都是有用的。这系列文章会通俗介绍它的很多用法。 在这一系列的上一篇&#xff0c;我们看了使用代理帐户模仿Windows安全上下文完成作业步骤的工作。大…

XtraBackup全备与增量备份

一、XtraBackup安装 下载地址&#xff1a;http://www.percona.com/downloads/XtraBackup/XtraBackup-2.2.8/source/ 安装步骤&#xff1a; How to build XtraBackup on Linux Prerequisites -------------$ yum install cmake gcc gcc-c libaio libaio-devel automake autocon…

《大话设计模式》 国外资料

It is not easy to remember all design patterns. Here are some stories about design patterns which might help! Creational Singleton – Only one president in AmericaFactory – A factory that produces humanAbstract Factory – An abstract factory to produce CP…

python arcgis 图书_arcgis python

本书作者是GIS发方面的知名作者&#xff0c;曾著有《JavaScript构建Web和ArcGIS Server应用实战》(Building Web and Mobile ArcGIS Server Applications with JavaScript)一书。 本书内容易学易懂&#xff0c;帮助读者成为GIS发高手。《面向ArcGIS的Python脚本编程》是一本指导…

博客园客户端UAP开发随笔 -- App连接云端内容的桥梁:WebView

当你辛苦的从网上爬下来一篇文章之后&#xff0c;怎么在你的应用内展示这些包含HTML标记的文章&#xff1f;如果你使用的是Javascript开发应用&#xff0c;恭喜你&#xff0c;直接塞进页面就可以了&#xff0c;同时说明你很熟悉页面开发&#xff0c;而现在windows也支持这种方式…

C4.5

C4.5是机器学习算法中的另一个分类决策树算法&#xff0c;它是基于ID3算法进行改进后的一种重要算法&#xff0c;相比于ID3算法&#xff0c;改进有如下几个要点&#xff1a; 用信息增益率来选择属性。ID3选择属性用的是子树的信息增益&#xff0c;这里可以用很多方法来定义信息…

谈谈分布式事务之三: System.Transactions事务详解[下篇]

在前面一篇给出的Transaction的定义中&#xff0c;信息的读者应该看到了一个叫做DepedentClone的方法。该方法对用于创建基于现有Transaction对 象的“依赖事务&#xff08;DependentTransaction&#xff09;”。不像可提交事务是一个独立的事务对象&#xff0c;依赖事务依附于…

iOS开发系列--触摸事件、手势识别、摇晃事件、耳机线控

-- iOS事件全面解析 概览 iPhone的成功很大一部分得益于它多点触摸的强大功能&#xff0c;乔布斯让人们认识到手机其实是可以不用按键和手写笔直接操作的&#xff0c;这不愧为一项伟大的设计。今天我们就针对iOS的触摸事件&#xff08;手势操作&#xff09;、运动事件、远程控制…

python为什么忽然火了_为什么Python突然就火了起来了呢?

近日&#xff0c;TIOBE发布10月编程语言排行榜显示&#xff0c;15年来TIOBE指数的前8名一直保持不变&#xff0c;而Python正在成为一种新的大型语言。越来越多的企业在使用Python进行开发&#xff0c;越来越多的人正在加入Python程序员行列!TIOBE 10月编程语言排行榜前20名Pyth…

ARP扫描工具arp-scan

2019独角兽企业重金招聘Python工程师标准>>> ARP扫描工具arp-scan arp-scan是Kali Linux自带的一款ARP扫描工具。该工具可以进行单一目标扫描&#xff0c;也可以进行批量扫描。批量扫描的时候&#xff0c;用户可以通过CIDR、地址范围或者列表文件的方式指定。该工具…

elementui el-from 怎样显示图片_vue2.0使用weui.js的uploader组件上传图片(兼容移动端)...

本文已同步到专业技术网站 www.sufaith.com, 该网站专注于前后端开发技术与经验分享, 包含Web开发、Nodejs、Python、Linux、IT资讯等板块.最近在使用 vue2.0开发微信公众号网页 其中涉及到 选择图片, 图片的压缩上传, 预览, 删除等操作。项目整体UI框架使用的是 vux, 但可惜的…

面向对象分析

在需求获取阶段&#xff0c;开发人员关注于理解用户以及他们的使用要求。而在需求分析阶段&#xff0c;开发人员关注于理解系统需要构建的内容&#xff0c;其核心是产生一个准确的、完整的、一致的和可验证的系统模型&#xff0c;称为分析模型。 面对对象的分析模型由三个独立的…

51nod 1050 循环数组最大子段和

1050 循环数组最大子段和 N个整数组成的循环序列a[1],a[2],a[3],…,a[n]&#xff0c;求该序列如a[i]a[i1]…a[j]的连续的子段和的最大值&#xff08;循环序列是指n个数围成一个圈&#xff0c;因此需要考虑a[n-1],a[n],a[1],a[2]这样的序列&#xff09;。当所给的整数均为负数时…

Spark- Linux下安装Spark

Spark- Linux下安装Spark 前期部署 1.JDK安装&#xff0c;配置PATH 可以参考之前配置hadoop等配置 2.下载spark-1.6.1-bin-hadoop2.6.tgz,并上传到服务器解压 [rootsrv01 ~]# tar -xvzf spark-1.6.1-hadoop2.6.tgz /usr/spark-1.6.1-hadoop2.6 3.在 /usr 下创建软链接到目标文…