自制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.pswp.cn/news/257689.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/257689.shtml
英文地址,請注明出處:http://en.pswp.cn/news/257689.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mysql按月分列統計_實現mysql按月統計的教程

mysql有個字段是DATETIME類型&#xff0c;要實現可以按月統計&#xff0c;該怎么寫sql語句&#xff1f;select month(f1) from tt group by month(f1)or select DATE_FORMAT(f1,%m) from tt group by DATE_FORMAT(f1,%m)比如數據庫的為2008-01-15 12&#xff1a;10&#xff1a;…

Log4j的擴展-支持設置最大日志數量的DailyRollingFileAppender

Log4j現在已經被大家熟知了&#xff0c;所有細節都可以在網上查到&#xff0c;Log4j支持Appender&#xff0c;其中DailyRollingFileAppender是被經常用到的Appender之一。在討論今天的主題之前&#xff0c;我們先看下另外一個Appender。 最常用的Appender——RollingFileAppend…

VirtualBox虛擬機安裝CentOS 7

新建虛擬機 因為比較簡單&#xff0c;所以對于VirtualBox就不做過多介紹了&#xff0c;直接下載安裝即可&#xff0c;安裝好之后打開Oracle VM VirtualBox管理器&#xff0c;點擊新建&#xff0c;選擇Red Hat&#xff08;根據windows主機選擇 32/64 bit&#xff0c;通常會自動識…

mysql 指定賬戶已存在_安裝mysql時告訴我指定的賬戶已存在?

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云數據庫專家保駕護航&#xff0c;為用戶…

C語言:用字符讀取流和輸出流來讀寫入數據。(文本文件)

/* 文件的幾種操作模式: r:只讀 w:只寫 rw:可讀可寫 文件的分類&#xff1a; t:文本文件(字符文件) b:二進制文件(字節文件)注意&#xff1a; 采用只讀方式打開文件時,如果源文件不存在,打開文件會失敗&#xff01; 采用只寫方式打開文件時,不管源文件存不存在,都不會失敗…

PC 上訪問設備數據庫的方法

通過 .NET 訪問 .sdf 的數據庫的方法&#xff1a; 在 VS2005 IDE 中&#xff0c;創建 SQL MOible 數據庫&#xff0c;編輯表結果和填充數據。 具體是在 Server Explorer 中&#xff0c;右鍵單擊 “Data Connections”&#xff0c;選擇 “Add Connection”&#xff0c;新建一個 …

模板原理和操作數據類的觀點【艱難的一天,慢慢的會過去的】

1.模板原理&#xff1a;視圖類【將數據輸出到模板中&#xff0c;實現對視圖的控制】 smarty的類實現對視圖的控制【展示和smarty的基本語法&#xff1a;smarty需要它的庫進行支持】 面向對象的編程中對象的訪問和類的訪問本質上還是代碼空間的訪問&#xff0c;區別也在于對象的…

mysql 用戶 類別_從mysql里讀取用戶類型

##1、后端1(從mysql里讀取用戶類型)&#xff1a;from django import formsfrom django.forms import widgetsfrom django.forms import fieldsfrom app01 import modelsfrom django.forms import ModelChoiceField,ModelMultipleChoiceFieldfrom django.shortcuts import rende…

從C語言到C++成長經歷所得的一些技巧和感悟

我介紹幾個辦法&#xff0c;學習辦法&#xff0c;期望你能找到愛好1。必定要和喜愛編程的&#xff0c;或編程兇猛的&#xff0c;或常常編程的人&#xff0c;在一同&#xff0c;常常探討問題&#xff01;初學編程會有許多問題呈現&#xff0c;你自己很 難處理 c是我們必定要學的…

老子《道德經》第三十三章

上德不德&#xff0c;是以有德&#xff1b;下德不失德&#xff0c;是以無德。 上德無為而無不為&#xff0c;下德為之而有以為&#xff0c;上仁為之而無以為&#xff0c;上義為之而有以為。 上禮為之而莫之應&#xff0c;則攘臂而扔之。 故失道而后德&#xff0c;失德而后仁&am…

[Spring]-各種標注-零配置

個人學習筆記&#xff0c;記錄了一些比較基礎的標注&#xff1b; 1、controller 控制器&#xff08;注入服務&#xff09;2、service 服務&#xff08;注入dao&#xff09;3、repository dao&#xff08;實現dao訪問&#xff09;4、component pojo實例化到spring容器中&#xf…

mysql弄丟初始密碼_MySql密碼丟失

windows下mysql密碼忘記了第一步&#xff1a;netstat -nat(可以查看mysql是否啟動了&#xff0c;如果啟動了&#xff0c;可以用輸入net stop mysql(或者通過任務管理器結束進程))第二步&#xff1a;mysqld --skip-grant-tables&#xff0c;不要關閉窗口第三步&#xff1a;開啟一…

CodeForces-500C

傳送門 給n本不同重量的一摞書編號1&#xff5e;n。給定m次操作。操作b代表花費標號為b的書上方其他書的重量總和&#xff0c;將書b位移到這疊書的最上方。問初始書應該如何疊放&#xff0c;才能使m次操作后總花費最小 輸入 n本書 m次操作 n個數 書的重量 m個數 操作對象 輸出 …

java基礎篇---網絡編程(UDP程序設計)

UDP程序設計 在TCP的索引操作都必須建立可靠地連接&#xff0c;這樣一來肯定會浪費大量的系統性能&#xff0c;為了減少這種開銷&#xff0c;在網絡中又提供了另外一種傳輸協議---UDP,不可靠的連接&#xff0c;這種協議在各個聊天工具中被廣泛的應用。 咋UDP開發中使用Datagram…

bzoj - 2038: [2009國家集訓隊]小Z的襪子(hose)

題目鏈接:http://www.lydsy.com/JudgeOnline/problem.php?id2038 莫隊算法可以解決一類不修改、離線查詢問題。而這題可以用莫隊來做。 *我是看這個論文學會的&#xff1a;&#xff08;鏈接~&#xff09; 其實莫隊就是一種優化的暴力&#xff0c;只是把查詢都離線預先按照規則…

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…

快速排序和折半查找

package BinarySerach;import java.util.Scanner;public class BinarySerch {/***折半查找和快速排序*/static final int N 15;static void quickSort(int [] array,int left,int right){int f,t;int ltemp left;int rtemp right;//確定分界值f array[(leftright)/2];while(…

CANVAS運用-對圖片的壓縮上傳(僅針對移動瀏覽器)

最近在移動端設計頭像上傳功能時&#xff0c;原本是以<input type"file">直接通過formData上傳&#xff0c;然而實際使用情況是&#xff1a;對于過大的圖片&#xff08;高像素手機所拍攝的照片等&#xff09;上傳時間過長會導致上傳失敗&#xff0c;而每次都上…

mysql重命名數據表稱方式_在MySQL中,使用()重命名數據表。_學小易找答案

【單選題】( )的上海文壇被稱為“張愛玲年”。【多選題】下列哪些是屬于共集放大電路的特點?()【閱讀理解】Passage Two Thailand is to ban smoking on some of the country’s most popular tourist beaches, with the prospect of up to a year in prison for those caught…