自制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控制金币的出现是从透明到全不透明的。
public class ShowUp : MonoBehaviour {
public float showUpSpeed = ;
private SpriteRenderer spriteRenderer;
void Awake()
{
this.spriteRenderer = this.GetComponent<SpriteRenderer>();
var color = this.spriteRenderer.color;
this.spriteRenderer.color = new Color(color.r, color.g, color.b, );
}
// Update is called once per frame
void Update () {
if (this.spriteRenderer == null) { return; }
this.spriteRenderer.color = Color.Lerp(this.spriteRenderer.color, Color.white, this.showUpSpeed * Time.deltaTime);
//Debug.Log(string.Format("A: {0}", this.spriteRenderer.color.a));
if (Mathf.Abs(Color.white.a - this.spriteRenderer.color.a) <= 0.02f)
{
this.spriteRenderer.color = Color.white;
this.spriteRenderer = null;
}
}
ShowUp.cs
Coin Info保存金币的价值。
注意:脚本中要保留一个Start或一个Update函数,否则在Inspector面板就不会显示脚本组件前面的勾选框了。


public class CoinInfo : MonoBehaviour {
public int value;
void Start()
{
}
}
Picked Coin让金币碰到玩家坦克时销毁自己。
public class PickedCoin : MonoBehaviour {
private bool picked;
void Awake()
{
this.picked = false;
}
void Start () {
}
void OnTriggerEnter2D(Collider2D other)
{
if (other.tag != Tags.hero) { return; }
if (!this.picked)
{
this.picked = true;
MonoBehaviour.Destroy(this.gameObject);
}
}
}
游戏暂停和继续
用一个按钮来控制游戏的暂停和继续。
选择UI-Button即可添加一个按钮。

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

那么事件函数怎么写呢?
游戏暂停的原理很简单,只需 Time.timeScale = ; ,那么今后所有的 Time.deltaTime 都将是0。因此所有乘以 Time.deltaTime 的地方都不会再有进展。
private float originalTimeScale;
private UnityEngine.UI.Text buttonText; void Awake()
{
this.originalTimeScale = Time.timeScale;
this.buttonText = this.GetComponentInChildren<UnityEngine.UI.Text>();
} public void btnPause_Click()
{
if (Time.timeScale > )
{
Time.timeScale = ;
buttonText.text = "Continue";
}
else
{
Time.timeScale = this.originalTimeScale;
buttonText.text = "Pause";
}
}
btnPause
在激烈的游戏过程中,把鼠标挪到屏幕某处点击按钮是很费劲的。所以,添加一个按下Space键就可以暂停或继续游戏的功能很有必要。只需给刚刚的btnPause.cs脚本添加如下代码。

void Update () {
if (Input.GetKeyDown(KeyCode.Space))
{
btnPause_Click();
}
}
坦克工厂
现在可以在界面上方三个点产生敌方坦克。后续我将此处改造为关卡控制器。此处暂时没什么可说的。
小地图
整个游戏地图有的大,一屏显示不完,所以给个能显示全地图的小地图是很好的。
制作小地图的原理是再添加一个摄像机smallMap,确保其Depth大于主摄像机。这样小地图就会显示在主场景上层。调整smallMap的Viewport属性,使其只在界面的某个角落显示。这里我让小地图显示在场景左下角,其长宽均为场景的五分之一即0.2。
注意,Viewport的X、Y、Width、Height属性都是0~1的,表示的是百分比。

注意,上图左上方红色围起来的白色框,其长宽比=下方Game视图的长宽比,后面我就是根据这个调整小地图的长宽的。
完成后,在Game视图里是这样的,小地图并不是正方形。这不好。

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

脚本如下。思路是,当场景的width大于height时,要缩小小地图的width;当场景的width小于height时,要缩小小地图的height。
public class AdjustViewPort : MonoBehaviour {
Camera cameraComponent;
private float screenWidth;
private float screenHeight;
private Rect originalCameraRect;
void Awake()
{
this.cameraComponent = this.GetComponent<Camera>();
this.originalCameraRect = this.cameraComponent.rect;
}
void Update () {
var width = Screen.width;
var height = Screen.height;
if (width == this.screenWidth && height == this.screenHeight) { return; }
this.screenWidth = width;
this.screenHeight = height;
if (width > height)
{
var rect = this.cameraComponent.rect;
rect.width = this.originalCameraRect.width * ((float)height / (float)width);
this.cameraComponent.rect = rect;
}
else
{
var rect = this.cameraComponent.rect;
rect.height = this.originalCameraRect.height * ((float)width / (float)height);
this.cameraComponent.rect = rect;
}
}
}
AdjustViewport.cs
只显示小地图的话,可能会跟场景混淆,所以给小地图加个红色的边框,就区分得明显了。我搜了很多加边框的方法,发现都太繁琐,还要依赖各种包、库。还是直接画一个Texture简单。
为方便起见,就在刚刚的AdjustViewPort脚本中同时绘制边框好了。

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

(下面的脚本忽略了调整长宽相关的部分。)
public class AdjustViewPort : MonoBehaviour {
Camera cameraComponent;
public Texture borderTexture;
void Awake()
{
this.cameraComponent = this.GetComponent<Camera>();
}
void OnGUI()
{
var rect = this.cameraComponent.rect;
float left = ;
float top = Screen.height - Screen.height * rect.height;
float width = Screen.width * rect.width;
float height = Screen.height * rect.height;
GUI.DrawTexture(new Rect(left, top, width, height), this.borderTexture, ScaleMode.StretchToFill);
}
}
总结
本篇添加了一些虽小但用起来很方便的小部件。现在这个TankHero就算是可以玩了。下面我将设计实现关卡,让这个游戏具有多个关卡,并且可配置。
您可以到我的github页面(https://github.com/bitzhuwei/TankHero-2D)上得到工程源码。
请多多指教~
自制Unity小游戏TankHero-2D(3)开始玩起来的更多相关文章
- 自制Unity小游戏TankHero-2D(1)制作主角坦克
自制Unity小游戏TankHero-2D(1)制作主角坦克 我在做这样一个坦克游戏,是仿照(http://game.kid.qq.com/a/20140221/028931.htm)这个游戏制作的. ...
- 自制Unity小游戏TankHero-2D(2)制作敌方坦克
自制Unity小游戏TankHero-2D(2)制作敌方坦克 我在做这样一个坦克游戏,是仿照(http://game.kid.qq.com/a/20140221/028931.htm)这个游戏制作的. ...
- 自制Unity小游戏TankHero-2D(5)声音+爆炸+场景切换+武器弹药
自制Unity小游戏TankHero-2D(5)声音+爆炸+场景切换+武器弹药 我在做这样一个坦克游戏,是仿照(http://game.kid.qq.com/a/20140221/028931.htm ...
- 自制Unity小游戏TankHero-2D(4)关卡+小地图图标+碰撞条件分析
自制Unity小游戏TankHero-2D(4)关卡+小地图图标+碰撞条件分析 我在做这样一个坦克游戏,是仿照(http://game.kid.qq.com/a/20140221/028931.htm ...
- Unity小游戏制作 - 暗影随行
用Unity制作小游戏 - 暗影惊吓 最近玩了一个小游戏,叫做暗影惊吓,虽然是一个十分简单的小游戏,但是感觉还是十分有趣的.这里就用Unity来实现一个类似的游戏. 项目源码:DarkFollow 主 ...
- 教你用Python自制拼图小游戏,一起来制作吧
摘要: 本文主要为大家详细介绍了python实现拼图小游戏,文中还有示例代码介绍,感兴趣的小伙伴们可以参考一下. 开发工具 Python版本:3.6.4 相关模块: pygame模块: 以及一些Pyt ...
- Java自制人机小游戏——————————剪刀、石头、布
package com.hello.test; import java.util.Scanner; public class TestGame { public static void main(St ...
- c++小游戏--五子棋
大家好,我是芝麻狐! 这是我自制的小游戏,目前仅支持devc++. 如果你没有c++软件, 请打开网站GDB online Debugger | Compiler - Code, Compile, R ...
- c++小游戏———扫雷
大家好,我是芝麻狐! 这是我自制的小游戏,目前仅支持devc++. 如果你没有c++软件, 请打开网站GDB online Debugger | Compiler - Code, Compile, R ...
随机推荐
- Cassandra-几个基本测试常识
一 使用ycsb进行装载,每次装载都不会删除以前装载过的. 因此如果想在空数据库中装载,需要先情况数据表. drop命令删除整个表,因此需要重建标头. truncate命令删除表的所有行,只留下表头, ...
- url中,中文乱码的问题
1// 在jsp中 String add = java.net.URLEncoder.encode("添加", "utf-8"); add = java.net ...
- TCP/IP入门(3) --传输层
原文:http://blog.csdn.net/zjf280441589/article/category/1854365 传输层的主要功能 1)传输层为应用进程之间提供端到端的逻辑通信(网络层是为主 ...
- [转]SQL Server字符串处理函数大全
select语句中只能使用sql函数对字段进行操作(链接sql server), select 字段1 from 表1 where 字段1.IndexOf("云")=1;这条语句不 ...
- 进阶——scrapy登录豆瓣解决cookie传递问题并爬取用户参加过的同城活动©seven_clear
最近在用scrapy重写以前的爬虫,由于豆瓣的某些信息要登录后才有权限查看,故要实现登录功能.豆瓣登录偶尔需要输入验证码,这个在以前写的爬虫里解决了验证码的问题,所以只要搞清楚scrapy怎么提交表单 ...
- LNMP脚本安装
#!/bin/bash#nginx:nginx-1.8.0.tar.gz#mysql:mysql-5.5.50.tar.gz#php:php-5.5.31.tar.gz#the software pa ...
- 解决Canvas.toDataURL 图片跨域问题
如题,在将页面的图片地址进行本地输出时(Html2Canvas.js),因不同源存在跨域问题,会出现toDataURL访问权限问题: [Redirect at origin 'http://sub1. ...
- MFC 关于如何实现浏览文件
在做界面的时候,如果涉及到文件,就要输入文件的地址 第一种方法是直接输入,嗯...╮( ̄▽ ̄)╭ 第二种方法就是常见的浏览,然后选择文件<( ̄︶ ̄)/ 其代码如下: CString filena ...
- 【转】使用Fiddler进行HTTP断点调试。
这是Fiddler又一强大和实用的工具之一.通过设置断点,Fiddler可以做到: 1. 修改HTTP请求头信息.例如修改请求头的UA, Cookie, Referer 信息,通过“伪造”相应信息达到 ...
- javadoc错误: 编码gbk的不可映射字符
在使用Eclipse进行javadoc的导出时,提示“编码 GBK 的不可映射字符”,应该就是中文注释Eclipse不认,需要在调用javadoc.exe的时候传递编码集告诉它采用什么编码去生成jav ...