實現一個很簡單的點擊小遊戲,學習交互相關的內容,在不實時建立銷燬的狀況下,使用簡單工廠建立、管理、回收、複用標記。ide
遊戲概述:點擊出現標記,兩秒內自動消失函數
遊戲展現:學習
1.1實現點擊效果。
1.1.1用 Plane 或其餘物體作地面, tag 爲「Finish」
先建立Plane,並選擇tag爲Finish。字體
1.1.2點擊地面後,出現一個圓形攻擊標記,兩秒後自動消失。注意:該攻擊標記不能擋住點擊。(Primitive Objects / Cylinder)this
1.點擊對象出現事件,以前設置地板的tag爲Finish,能夠利用tag找到對象,對應編寫事件。spa
if (hit.collider.gameObject.tag.Contains ("Finish"))
2.圓形攻擊標記,按提示建立Cylinder做爲攻擊標記。code
GameObject cylinder_1 = GameObject.CreatePrimitive (PrimitiveType.Cylinder);
3.剛開始不知道不能擋住點擊該如何完成,這一點是在總體實現以後才查到相關資料解決的,加上下面一句代碼,把圓柱形標記設爲不啓用,這樣就不會妨礙在同一地方繼續點擊生成或出現圓柱形標記。orm
cylinder_1.GetComponent<Collider> ().enabled = false; // 不影響再次點擊
4.整理代碼,以下。對象
void Update() { Vector3 mp = Input.mousePosition; cm = Camera.main; Ray ray = cm.ScreenPointToRay (mp); RaycastHit hit; if (Physics.Raycast(ray, out hit)) { // 若是點擊到標籤爲Tag的對象 if (hit.collider.gameObject.tag.Contains ("Finish")) { Vector3 finishposition = hit.point + new Vector3(0f,0.8f,0f); GameObject cylinder_1 = GameObject.CreatePrimitive (PrimitiveType.Cylinder); cylinder_1.GetComponent<Collider> ().enabled = false; cylinder_1.transform.position = hit.point+ new Vector3(0f,0.8f,0f); } } }
如今能夠點擊建立圓柱形標記,可是還不會消失。要求須要在兩秒內自動消失,考慮增長一個類專門管理消失。(消失不是destroy,以下面所提示的,對象建立以後,放在列表內,沒必要釋放,由於釋放再重建耗費太多資源。)作到這一步,須要先使用簡單工廠,先放上代碼,後續在下一點再講述。blog
專門管理延時的類:
1.1.3請使用一個簡單工廠建立、管理這些的標記,並自動收回這些標記(注意,這些對象建立後,放在列表內,沒必要釋放)。
爲適應下面紅色字體要求,修改類名和相關函數名。
用戶僅需申請使用便可 GameObject myFactory.placeAttackMark(Vector3 position)
myFactory爲工廠類,其中的placeAttackMark(Vector3 position)函數爲具體實現。
創建myFactory.cs,創建placeAttackMark函數和對象列表(public List<GameObject> free = new List<GameObject>();),將以前Update裏面的內容放到placeAttackMark中。考慮到須要回收對象(修改位置或者隱藏,讓用戶沒法看到),在建立新的標記時須要判斷對象列表裏還有沒有可用的,有則複用不建立。
修改以前Update裏面的內容,以下所示:重要代碼後寫有註釋。
public void placeAttackMark(Vector3 target) { cm = Camera.main; Ray ray = cm.ScreenPointToRay (target); RaycastHit hit; if (Physics.Raycast(ray, out hit)) { // 若是點擊到標籤爲Tag的對象 GameObject cylinder_1; if (hit.collider.gameObject.tag.Contains ("Finish")) { Vector3 finishposition = hit.point + new Vector3(0f,0.8f,0f); if (free.Count == 0) { // 若是未使用的圓柱形標記爲空,則建立 cylinder_1 = GameObject.CreatePrimitive (PrimitiveType.Cylinder); cylinder_1.GetComponent<Collider> ().enabled = false; // 不影響再次點擊 cylinder_1.transform.position = hit.point+ new Vector3(0f,0.8f,0f); } else { // 還有標記空閒,複用標記 cylinder_1 = free[0]; free.RemoveAt(0); // 用了以後移除 cylinder_1.transform.position = hit.point + new Vector3(0f,0.8f,0f); } // 兩秒後自動消失 waitToRecovery wt = cylinder_1.AddComponent<waitToRecovery>(); wt.delay2min (cylinder_1, free); } } }
最後,在用戶端直接訪問 myFactory.placeAttackMark(Vector3 position)便可。
在這裏,如以前同樣,在myFactory裏面實現了GetInstance方法。
using System.Collections; using System.Collections.Generic; using UnityEngine; using Com.mygame; public class BaseCode : MonoBehaviour { private Camera cm; private GameObject temp; // Use this for initialization void Start () { cm = Camera.main; } // Update is called once per frame void Update () { if (Input.GetMouseButtonDown (0)) { Vector3 mp = Input.mousePosition; myFactory.GetInstance ().placeAttackMark (mp); } } }