【Ruby’s adventure】Unity期末上機考試題目預測與決議
說明:針對于6月18日Unity上機考試,不少同學問我有關考試怎么弄,為此寫一篇博客講一下我自己的理解,
目錄
- 【Ruby's adventure】Unity期末上機考試題目預測與決議
- 一、考題預測
- (一)、考試內容
- (二)、考題預測
- 1.相關說明
- 二、對應決議
- (一)、相關題目決議
- (二)、必要說明
- 三、結語
一、考題預測
(一)、考試內容
考試內容:Ruby‘s adventure案例的修改,老師給完整案例后在完整案例的基礎上按照老師的要求添加三個功能,也可以自行添加功能,老師要求的功能必須添加,不會的可以自己加功能,老師給給分,但是不會有原來的高,
舉個栗子🌰,老師三個要求每個要求10分共三十分,我只會兩個,另一個我不會,但是我自己加了一個功能,老師覺得我那個功能還行,給了我8分,那么我最后就是20+8=28分,
(二)、考題預測
由于學的東西比較簡單,所以考得也不會很難,按照老師之前說的話,結合大家技術水平,考題預測如下:
-
場景內機器人計數功能:如下圖所示
包括:1.未被修復的機器人存在的數量;2修復的機器人的數量. -
接受任務計時以及完成任務結束計時功能 || 整個游戲的計時功能

圖中當Ruby跟青蛙對話后開始計時,由于GIF上傳的大小有上限這里就截圖了,不然有動圖, -
場景中計時計數相應GUI的添加:如上圖所示
-
機器人發射子彈:

-
機器人發射的子彈對Ruby會造成傷害

-
退出游戲功能//重玩功能
-
機器人修復功能:在一段時間內攻擊機器人兩次,否則機器人會自動回血,舉個栗子🌰,我要在兩秒鐘內擊打機器人兩次才算修復機器人,從我打了機器人開始后的兩秒,這兩秒內我沒有打機器人,那么機器人就自動回血,也就是說我要修復他,還得打他兩次,且要在兩秒內,
-
代碼數值的修改:1.陷阱對Ruby造成的血量更多或更少;2.草莓恢復的血量更多或更少;3.機器人被擊打修復的次數;4.無敵時間的修改;5.重生位置的修改,
-
改變機器人的行走路線:使其不僅可以上下行走也可以左右行走,可以隨時轉換
-
機器人也可以傷害Ruby
-
子彈限制功能 || 子彈包拾取功能
1.相關說明
大體上我先例舉一些考得可能性比較大的,在這里面的1、3、4、5、7、8、9中可能會出考題,一個題目可能會包含多個考題,舉個栗子🌰:比如要你弄個計數的功能,那計數了就得顯示出來,相應的就會要你弄GUI那么這個題目就包含了1、3兩個題目,
當然,如果這些題目沒有考到,那么也可以作為自己的功能添加上去,也能加分,只是加得沒那么多,過還是沒問題的,
二、對應決議
(一)、相關題目決議
1.場景內機器人計數功能:這個計數的資料我們上課已經做好了,只需要找出來顯示出來就行了,在我們的腳本里面找到一個腳本,名為NPCDialog,在其中我們可以發現一個函式
public void displayDialog()
{
if (b != 1)
{
a = 1;
Dialog.SetActive(true);
timer = displayTime;
UIHealthBar._instance.hasTask = true;
if (UIHealthBar._instance.fixnum >= 4) //就是這行UIHealthBar._instance.fixnum >= 4
{
DialogText.text = "Thanks you , you are good!";
b = 1;
if (!hasCompleteTask)
{
audioSource.PlayOneShot(CompleteClip);
hasCompleteTask = true;
}
}
}
}
這句代碼的意思就是當修復的機器人大于4個后,就可以執行if里面的代碼,我們可以找到其原本的腳本,也就是UIHealthBar,發現此腳本已經被實體化,同時有兩個引數,一個是修復好的機器人數量,一個是未修復好的機器人數量,且此腳本被實體化,能夠被其它腳本呼叫,那這就很好辦了,

那么我們只需要在我們修復好機器人后將修復好的數值加加,未被修復好的陣列減減即可,為此我們找到控制機器人的腳本,找到修復的函式,加上對應的代碼即可:

接下來就得讓它顯示出來,為此我們要自己加代碼,方法很多,我是自己新建了一個腳本寫的,關健代碼如下:
public Text norepaire; //未修復機器人計數的文本框
public Text repaire; //修復機器人計數的文本框
public int isRepair = 0;
public int noRepair = 7;
public Text time; //場景計時
float timer = 0;
private void Start()
{
}
private void Update()
{
//這里下面
if(NPCDialog._instance.a==1)
if (NPCDialog._instance.b!=1)
{
timer = timer + Time.deltaTime;
}
//這里上面不用寫 這是我加的任務完成計時功能,想加也可以,我會把我的NPCDialog相關代碼給大家
isRepair = UIHealthBar._instance.fixnum;
noRepair = UIHealthBar._instance.unfixumn;
repaire.text = isRepair.ToString() + " 個";
norepaire.text = noRepair.ToString() + " 個";
Debug.Log("isRepair: "+isRepair);
time.text = timer.ToString("f1") + " s";
}
NPCDialog相關代碼:a,b是我設定的引數來控制計時的,邏輯自己看,解釋有點麻煩
public void displayDialog()
{
//a,b自己定義 型別public int 初始值為0
if (b != 1)
{
a = 1;
Dialog.SetActive(true);
timer = displayTime;
UIHealthBar._instance.hasTask = true;
if (UIHealthBar._instance.fixnum >= 4)
{
DialogText.text = "Thanks you , you are good!";
b = 1;
if (!hasCompleteTask)
{
audioSource.PlayOneShot(CompleteClip);
hasCompleteTask = true;
}
}
}
}
最后在場景里面擺放好UI,然后將文本框拖拽給你新建的腳本即可:(Camera Fellow是我自己新建的腳本)

2.機器人發射子彈:當Ruby進入到機器人的攻擊范圍,機器人向Ruby發射子彈
方法:范圍檢測,射線檢測(99%的都是范圍檢測,除非不會就搬運與青蛙對話的射線檢測)
實作步驟:
(1)新建一個空物件并重命名,并給其給添加一個范圍檢測的collider 2D,我是用的圓形collider,添加腳本,我的腳本名是AttackRuby,記住要勾上is Trigger,可以自行修改檢測范圍

(2)AttackRuby腳本的撰寫:這個不需要像我那么復雜,我那純粹是為了好玩,實作的效果如下,進入攻擊范圍后就會攻擊,離開后不會攻擊效果圖如下

我么可以修改代碼里面的一些數值來修改發射子彈的速度
public GameObject Ruby_vector2;
public GameObject BulletPrefab;
public Rigidbody2D RubyRigidbody2D;
public float N = 50; //射擊速度
bool isAttack = false; //模式1觸發
void Update()
{
//Ruby進入檢測范圍后 isAttack變為true 同時time開始計時
if(isAttack)
{
time = time + Time.deltaTime;
if(time>=0.25)//當time>0.25s 呼叫函式發射子彈 同時time=0 開始重新計時 這里設定射擊間隔
{
Launch();
time = 0;
}
}
private void Launch()
{
GameObject bullet = Instantiate(BulletPrefab, transform.position, Quaternion.identity); //Quaternion.identity 沒有角度 (0,0,0)
//生成一個預制體
bullet.GetComponent<bullet>().Lauch(RubyRigidbody2D.position+Vector2.up*2, N);
// bullet.GetComponent<bullet>().Lauch( Ruby_vector2.transform.position, N);
//獲取生成物體子彈上的腳本bullet,并呼叫其發射函式Lauch,里面的引數為位置,發射速度
//在這里我們要改一下發射的位置(方向),改為Ruby的位置
//再說明一下,由于每個人的場景大小不同,Ruby大小也有偏差,加上Ruby的中心在腳下,為了讓子彈能夠打到Ruby,我們需要對其位置微調,也就是向上調整一段距離,加一個vector2.up乘以一個數值,這個數值每個人因人而異,大體上差不多
}
private void OnTriggerEnter2D(Collider2D collision)//進入范圍攻擊
{
//將Ruby的標簽改為Ruby
if(collision.tag=="Ruby")
{
isAttack = true;
}
}
private void OnTriggerExit2D(Collider2D collision)//離開范圍不攻擊
{
if (collision.tag == "Ruby")
{
isAttack = false;
}
}
我們攻擊時是攻擊Ruby的中心,而Ruby的中心在腳部,所以我們得微調:

說明:你在完成這個東西的時候會發現,子彈會有些許偏差,原因是因為在Ruby移動的程序中其Rigidbody2D位置發生了改變,所以會有偏差,如果是換成我下面注釋的代碼后,就不會出現,但是射擊中心不太準,在Ruby的腳部,這個時候我們就需要改變Ruby位置的中心,我花了一些時間做了修改,包括代碼的形式,調整Sprite Renderer的相關引數,都沒有用,主要是因為這不是一個image,按理來說將Piovt修改成Center就沒事了,但是沒有成功,應該是需要在最開始的Ruby上進行修改,但是我的Ruby已經修改過了,沒有原版了,就先放在這里,也有可能是需要在專案設定里面去進行調整,當然了如果你成功的調整好了可以在評論下方提出你的見解,我調整好后也會第一時間更新,
正常的位置:

最后賦值即可:預制體就是子彈

附加說明:當然了也可以給Ruby身上面加一個空物體,將其的位置賦值給目標,調整空位置的位置到Ruby中心,這個理論上是可以的,實踐上還是有問題,個人覺得還是跟腳本有問題,后面再改吧,
3.子彈對Ruby造成傷害:
這個有很多方法:1.可以給Ruby寫代碼;2.可以個給子彈寫代碼;
原理:碰撞檢測+傳參
方法:當然了,這里推薦一個很簡單的方法,找到子彈預制體,為其添加一個我們寫好了的陷阱腳本即可,腳本名為:

相關提示與說明:由于有陷阱有無敵功能,如果題目要求子彈打中就掉血,沒有無敵功能,那么我們就需要進行適當修改:
他是通過呼叫Ruby腳本中的changehealth方法來修改血量的,對此我們要修改的話就需要找到對應的函式進行修改,修改changehealth
陷阱腳本中呼叫的方法:

Ruby腳本中修改血量的方法:

當然了,具體題目怎么樣改,改不改我也說不準,告訴大家怎么改,
也可以自己通過添加腳本的形式來修改血量,但是要注意兩個事情:
1.利用碰撞檢測
2.呼叫changehealth(可以用老師的,也可以自己寫改變血量的腳本)
3.最后呼叫UIHealthBar._instance.SetValue(Mathf.Lerp(a / (float)maxHealth, b / (float)maxHealth,1f));來修改血量的顯示
在這里我就不做過多說明,
4.退出游戲功能 || 重玩功能
退出游戲的函式:
public void GetExit()//退出運行
{
#if UNITY_EDITOR
UnityEditor.EditorApplication.isPlaying = false;//用于退出運行
#else
Application.Quit();
#endif
}
隨便寫在一個腳本里面,再在場景外面弄一個Button,點加號

將你添加這個退出函式的腳本的物體拖拽給他,在下拉選單中找到腳本名稱,找到對應函式即可,我這里舉個🌰

游戲的重玩:
首先需要在Bulit setting里面找到對應的設定

記住每個場景后面的編號,沒有當前場景的就添加場景
和退出函式的呼叫方法一樣,在腳本中的參考加上:
using UnityEngine.SceneManagement;
順便說一下,用了圖片和文本框的需要參考:
using UnityEngine.UI;
然后寫下函式:
public void PlayeAgain()
{
SceneManager.LoadScene(1); //你要重玩的/加載的場景編號,看上面圖
}
用button來呼叫此方法,與退出游戲相似
5.機器人自動回血:
邏輯:第一發子彈攻擊后的兩秒內如果不再進行下一次攻擊,機器人要被修復,需要被擊打兩次
實作流程:
1.給機器人添加一個碰撞檢測的代碼,檢測第一次攻擊,當檢測第二次攻擊后再呼叫修復函式

當hit>=2時呼叫被修復,每次擊打一次就hit++
2.當第一次被擊打后,isRepairing變為true,開始計時

JishiTime的初始值為2s,如果在兩秒內沒有修復好的話,hit=0,機器人回血,jishiTime=2,同時isRepairing=false;停止計時,以此來達到一個自動回血的效果,下面的代碼寫在Update里面,每時每刻都要檢測,方法很多,我的思路大致是這樣,之前幫人改東西,把我的代碼給改壞了,現在演示不出來,應該沒有什么問題,
沒有的引數自己看型別定義一下!!!
6.改變機器人的行走:
原理:跟機器人自動回血差不多,設定一個計時功能,計時結束后,將其vertical改為false即可:

時間問題我就不多說了,這里我現在寫了4個小時了
7.機器人傷害Ruby:給機器人添加陷阱腳本,改變一下collider的范圍,類似于決議2
8.子彈限制功能 || 子彈包拾取功能
(1)把子彈包拖拽進場景中,調整好其大小,為其添加box collider 2D,勾上 is trigger

(2)為子彈包添加腳本:我起名為BulletPag,其代碼如下
private void OnTriggerEnter2D(Collider2D collision)
{
if(collision.tag=="Ruby")
{
//給Ruby打上標簽為Ruby
PlayerMove playermove = collision.GetComponent<PlayerMove>();
playermove.bulletnum = playermove.bulletnum + 30;
Destroy(this.gameObject);
}
}
在Ruby的腳本中添加相關代碼:
定義變數部分:定義子彈數和顯示子彈數的文本框
public Text bulletnumText;
public int bulletnum = 30;
Update函式中:顯示剩余子彈數
bulletnumText.text = bulletnum.ToString()+"個";
修改部分:
if(bulletnum>0) //當子彈數大于零才能發射子彈,一開始子彈數是30,不影響其他功能,因為有一個地方是要跟青蛙對話后才能夠發射子彈的功能
if (Input.GetKeyDown(KeyCode.Space))
{
Launch();
bulletnum--; //發射一次子彈子彈數減少
spark.Play();
}
再在場景外面設定UI:

并把相應的文本框拖拽給腳本:上面定義了一個Txet文本框
拓展:這里面還可以加上換彈夾的功能,簡答說一下,當子彈發射完后,并且還有剩余子彈,那么需要按下一個按鍵后才能夠按下空格鍵發射子彈,需要在加上一個子彈計數變數來存盤子彈剩余數,按下鍵后相應的減少對應的數,子彈數相應的加上相應的數,還有很多可以修改的地方,我就不一一細說了,
(二)、必要說明
1.這個案例的代碼有些地方是我自己寫的,和老師寫的不一樣,大同小異,所以可能你照著我的寫,在涉及到老師的代碼時,可能會出錯,但是概率還是很小,也不排除自己的原因打錯看錯出錯,主要參考看我的邏輯和方法,
2.個別地方省略了一些很簡單的步驟,加UI的地方就不多說了
3.不是要知道整個代碼才能做出來,知道邏輯和一些關鍵代碼也能夠寫出來
三、結語
1.考試應該不會很難,所以不需要太慌張,這里推薦給你一個完整的Ruby教程,你覺得我的不太行,你也可以從這里面去學習一些東西:點擊跳轉:Ruby官方案例完整版
2.要明白代碼的意思和邏輯,明白一些操作為什么要那么操作,如果不那么操作那么寫會產生什么結果,這對于日常學習尤為重要
3.養成獨立思考的習慣,遇事后自己先獨立思考,不到萬不得已實在沒辦法絕不向別人求助,培養自己的鉆研精神,有些東西仔細自己想想并不難,不要養成過渡依賴別人的習慣
4.本次考試為開卷考試,可以提前做好一些功能,把相關代碼寫在紙上,帶入考場,如果覺得本篇內容還行,也可以將本篇內容列印出來帶入考場,
5.祝大家考試順利!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/287822.html
標籤:其他
上一篇:C語言初階《三子棋》
